Consolidate white_label to remove_branding and add embed widget

- Rename white_label feature to remove_branding across frontend/backend
- Update billing catalog, plan features, and permission checks
- Add dark mode support to Recharts tooltips with useDarkMode hook
- Create embeddable booking widget with EmbedBooking page
- Add EmbedWidgetSettings for generating embed code
- Fix Appearance settings page permission check
- Update test files for new feature naming
- Add notes field to User model

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-16 21:20:17 -05:00
parent 73d2bee01a
commit 6a6ad63e7b
31 changed files with 2115 additions and 181 deletions

View File

@@ -68,7 +68,7 @@ describe('UpgradePrompt', () => {
});
it('should render for any feature in inline mode', () => {
const features: FeatureKey[] = ['plugins', 'custom_domain', 'white_label'];
const features: FeatureKey[] = ['plugins', 'custom_domain', 'remove_branding'];
features.forEach((feature) => {
const { unmount } = renderWithRouter(
@@ -140,7 +140,7 @@ describe('UpgradePrompt', () => {
'webhooks',
'api_access',
'custom_domain',
'white_label',
'remove_branding',
'plugins',
];
@@ -243,7 +243,7 @@ describe('UpgradePrompt', () => {
it('should make children non-interactive', () => {
renderWithRouter(
<UpgradePrompt feature="white_label" variant="overlay">
<UpgradePrompt feature="remove_branding" variant="overlay">
<button data-testid="locked-button">Click Me</button>
</UpgradePrompt>
);
@@ -374,7 +374,7 @@ describe('LockedSection', () => {
describe('Different Features', () => {
it('should work with different feature keys', () => {
const features: FeatureKey[] = [
'white_label',
'remove_branding',
'custom_oauth',
'can_create_plugins',
'tasks',
@@ -470,7 +470,7 @@ describe('LockedButton', () => {
const handleClick = vi.fn();
renderWithRouter(
<LockedButton
feature="white_label"
feature="remove_branding"
isLocked={true}
onClick={handleClick}
>