@actuate-media/cms-admin 0.63.2 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/design-system/README.md +53 -0
- package/design-system/tokens.css +114 -0
- package/design-system/tokens.json +149 -0
- package/design-system/tokens.scss +108 -0
- package/design-system/tokens.tailwind.cjs +80 -0
- package/dist/__tests__/components/ui-primitives.test.d.ts +2 -0
- package/dist/__tests__/components/ui-primitives.test.d.ts.map +1 -0
- package/dist/__tests__/components/ui-primitives.test.js +45 -0
- package/dist/__tests__/components/ui-primitives.test.js.map +1 -0
- package/dist/__tests__/layout/primitives.test.js +9 -2
- package/dist/__tests__/layout/primitives.test.js.map +1 -1
- package/dist/__tests__/views/updates-tab.render.test.js +1 -1
- package/dist/__tests__/views/updates-tab.render.test.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/EnabledSwitch.d.ts +2 -5
- package/dist/components/EnabledSwitch.d.ts.map +1 -1
- package/dist/components/EnabledSwitch.js +4 -7
- package/dist/components/EnabledSwitch.js.map +1 -1
- package/dist/components/SEOPanel.d.ts.map +1 -1
- package/dist/components/SEOPanel.js +2 -1
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js +5 -3
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/forms/FieldsPanel.js +2 -2
- package/dist/components/forms/FieldsPanel.js.map +1 -1
- package/dist/components/forms/NotificationsPanel.js +2 -2
- package/dist/components/forms/NotificationsPanel.js.map +1 -1
- package/dist/components/forms/WebhooksPanel.d.ts.map +1 -1
- package/dist/components/forms/WebhooksPanel.js +2 -2
- package/dist/components/forms/WebhooksPanel.js.map +1 -1
- package/dist/components/forms/primitives.d.ts.map +1 -1
- package/dist/components/forms/primitives.js +5 -8
- package/dist/components/forms/primitives.js.map +1 -1
- package/dist/components/posts/badges.d.ts.map +1 -1
- package/dist/components/posts/badges.js +7 -13
- package/dist/components/posts/badges.js.map +1 -1
- package/dist/components/seo/RedirectEditorDrawer.d.ts.map +1 -1
- package/dist/components/seo/RedirectEditorDrawer.js +2 -1
- package/dist/components/seo/RedirectEditorDrawer.js.map +1 -1
- package/dist/components/seo/SeoEditorDrawer.d.ts.map +1 -1
- package/dist/components/seo/SeoEditorDrawer.js +3 -2
- package/dist/components/seo/SeoEditorDrawer.js.map +1 -1
- package/dist/components/seo/primitives.d.ts.map +1 -1
- package/dist/components/seo/primitives.js +11 -15
- package/dist/components/seo/primitives.js.map +1 -1
- package/dist/components/ui/Button.d.ts +1 -1
- package/dist/components/ui/Button.js +1 -1
- package/dist/components/ui/Button.js.map +1 -1
- package/dist/components/ui/Card.d.ts +6 -5
- package/dist/components/ui/Card.d.ts.map +1 -1
- package/dist/components/ui/Card.js +20 -18
- package/dist/components/ui/Card.js.map +1 -1
- package/dist/components/ui/FilterPill.d.ts +14 -0
- package/dist/components/ui/FilterPill.d.ts.map +1 -0
- package/dist/components/ui/FilterPill.js +8 -0
- package/dist/components/ui/FilterPill.js.map +1 -0
- package/dist/components/ui/Input.d.ts +2 -1
- package/dist/components/ui/Input.d.ts.map +1 -1
- package/dist/components/ui/Input.js +9 -8
- package/dist/components/ui/Input.js.map +1 -1
- package/dist/components/ui/SearchInput.d.ts.map +1 -1
- package/dist/components/ui/SearchInput.js +2 -1
- package/dist/components/ui/SearchInput.js.map +1 -1
- package/dist/components/ui/Select.d.ts.map +1 -1
- package/dist/components/ui/Select.js +9 -10
- package/dist/components/ui/Select.js.map +1 -1
- package/dist/components/ui/StatPill.d.ts +18 -0
- package/dist/components/ui/StatPill.d.ts.map +1 -0
- package/dist/components/ui/StatPill.js +5 -0
- package/dist/components/ui/StatPill.js.map +1 -0
- package/dist/components/ui/StatusBadge.d.ts +25 -0
- package/dist/components/ui/StatusBadge.d.ts.map +1 -0
- package/dist/components/ui/StatusBadge.js +41 -0
- package/dist/components/ui/StatusBadge.js.map +1 -0
- package/dist/components/ui/Toggle.d.ts +31 -0
- package/dist/components/ui/Toggle.d.ts.map +1 -0
- package/dist/components/ui/Toggle.js +41 -0
- package/dist/components/ui/Toggle.js.map +1 -0
- package/dist/components/ui/form-control.d.ts +11 -0
- package/dist/components/ui/form-control.d.ts.map +1 -0
- package/dist/components/ui/form-control.js +11 -0
- package/dist/components/ui/form-control.js.map +1 -0
- package/dist/components/ui/index.d.ts +9 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +5 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/fields/PropInput.d.ts.map +1 -1
- package/dist/fields/PropInput.js +2 -1
- package/dist/fields/PropInput.js.map +1 -1
- package/dist/fields/ToggleField.d.ts.map +1 -1
- package/dist/fields/ToggleField.js +2 -1
- package/dist/fields/ToggleField.js.map +1 -1
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js +5 -2
- package/dist/layout/Header.js.map +1 -1
- package/dist/layout/Sidebar.js +1 -1
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/primitives/PageContainer.d.ts.map +1 -1
- package/dist/layout/primitives/PageContainer.js +1 -1
- package/dist/layout/primitives/PageContainer.js.map +1 -1
- package/dist/layout/primitives/tokens.d.ts +10 -4
- package/dist/layout/primitives/tokens.d.ts.map +1 -1
- package/dist/layout/primitives/tokens.js +10 -4
- package/dist/layout/primitives/tokens.js.map +1 -1
- package/dist/views/Dashboard.js +1 -1
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/FormEditor.d.ts.map +1 -1
- package/dist/views/FormEditor.js +2 -1
- package/dist/views/FormEditor.js.map +1 -1
- package/dist/views/FormEntries.js +1 -1
- package/dist/views/FormEntries.js.map +1 -1
- package/dist/views/FormSubmissions.js +1 -1
- package/dist/views/FormSubmissions.js.map +1 -1
- package/dist/views/Forms.js +3 -3
- package/dist/views/Forms.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +3 -2
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/Pages/PageTagManager.d.ts.map +1 -1
- package/dist/views/Pages/PageTagManager.js +1 -1
- package/dist/views/Pages/PageTagManager.js.map +1 -1
- package/dist/views/Pages/PagesListView.js +1 -1
- package/dist/views/Pages/PagesListView.js.map +1 -1
- package/dist/views/Pages.js +1 -1
- package/dist/views/Pages.js.map +1 -1
- package/dist/views/Posts/NewPostPicker.d.ts.map +1 -1
- package/dist/views/Posts/NewPostPicker.js +1 -1
- package/dist/views/Posts/NewPostPicker.js.map +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.js +1 -1
- package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -1
- package/dist/views/Posts/PostTypesView.d.ts.map +1 -1
- package/dist/views/Posts/PostTypesView.js +1 -1
- package/dist/views/Posts/PostTypesView.js.map +1 -1
- package/dist/views/Posts/PostsListView.js +1 -1
- package/dist/views/Posts/PostsListView.js.map +1 -1
- package/dist/views/Profile.js +1 -1
- package/dist/views/Profile.js.map +1 -1
- package/dist/views/Redirects.js +1 -1
- package/dist/views/Redirects.js.map +1 -1
- package/dist/views/SEO.js +1 -1
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/ScriptTagEditor.d.ts.map +1 -1
- package/dist/views/ScriptTagEditor.js +1 -1
- package/dist/views/ScriptTagEditor.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js +2 -1
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/Settings.js +1 -1
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/Users.d.ts.map +1 -1
- package/dist/views/Users.js +2 -6
- package/dist/views/Users.js.map +1 -1
- package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
- package/dist/views/page-builder/BlockEditor.js +2 -2
- package/dist/views/page-builder/BlockEditor.js.map +1 -1
- package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
- package/dist/views/page-builder/BottomBar.js +2 -2
- package/dist/views/page-builder/BottomBar.js.map +1 -1
- package/dist/views/page-builder/NodeSettings.js +3 -3
- package/dist/views/page-builder/NodeSettings.js.map +1 -1
- package/dist/views/page-builder/PageTemplates.js +1 -1
- package/dist/views/page-builder/PageTemplates.js.map +1 -1
- package/dist/views/page-builder/SavedSections.js +2 -2
- package/dist/views/page-builder/SavedSections.js.map +1 -1
- package/dist/views/page-builder/Widgets.js +1 -1
- package/dist/views/page-builder/Widgets.js.map +1 -1
- package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
- package/dist/views/page-editor/SectionInspector.js +2 -1
- package/dist/views/page-editor/SectionInspector.js.map +1 -1
- package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -1
- package/dist/views/post-editor/PostHeaderPanel.js +2 -1
- package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
- package/dist/views/seo/TechnicalTab.d.ts.map +1 -1
- package/dist/views/seo/TechnicalTab.js +2 -2
- package/dist/views/seo/TechnicalTab.js.map +1 -1
- package/dist/views/settings/components.d.ts.map +1 -1
- package/dist/views/settings/components.js +4 -2
- package/dist/views/settings/components.js.map +1 -1
- package/package.json +9 -4
- package/src/__tests__/components/ui-primitives.test.tsx +58 -0
- package/src/__tests__/layout/primitives.test.ts +10 -2
- package/src/__tests__/views/updates-tab.render.test.tsx +2 -1
- package/src/components/EnabledSwitch.tsx +4 -22
- package/src/components/SEOPanel.tsx +2 -11
- package/src/components/ThemeProvider.tsx +5 -3
- package/src/components/forms/FieldsPanel.tsx +4 -6
- package/src/components/forms/NotificationsPanel.tsx +2 -9
- package/src/components/forms/WebhooksPanel.tsx +4 -6
- package/src/components/forms/primitives.tsx +6 -16
- package/src/components/posts/badges.tsx +8 -21
- package/src/components/seo/RedirectEditorDrawer.tsx +12 -16
- package/src/components/seo/SeoEditorDrawer.tsx +16 -24
- package/src/components/seo/primitives.tsx +18 -34
- package/src/components/ui/Button.tsx +1 -1
- package/src/components/ui/Card.tsx +35 -18
- package/src/components/ui/FilterPill.tsx +43 -0
- package/src/components/ui/Input.tsx +15 -17
- package/src/components/ui/SearchInput.tsx +9 -4
- package/src/components/ui/Select.tsx +15 -18
- package/src/components/ui/StatPill.tsx +37 -0
- package/src/components/ui/StatusBadge.tsx +66 -0
- package/src/components/ui/Toggle.tsx +85 -0
- package/src/components/ui/form-control.ts +12 -0
- package/src/components/ui/index.ts +9 -0
- package/src/fields/PropInput.tsx +6 -15
- package/src/fields/ToggleField.tsx +3 -15
- package/src/layout/Header.tsx +6 -2
- package/src/layout/Sidebar.tsx +3 -3
- package/src/layout/primitives/PageContainer.tsx +1 -5
- package/src/layout/primitives/tokens.ts +11 -4
- package/src/styles/actuate-tokens.css +97 -0
- package/src/styles/theme.css +88 -156
- package/src/views/Dashboard.tsx +1 -1
- package/src/views/FormEditor.tsx +6 -9
- package/src/views/FormEntries.tsx +1 -1
- package/src/views/FormSubmissions.tsx +1 -1
- package/src/views/Forms.tsx +5 -7
- package/src/views/MediaBrowser.tsx +4 -7
- package/src/views/Pages/PageTagManager.tsx +1 -3
- package/src/views/Pages/PagesListView.tsx +1 -1
- package/src/views/Pages.tsx +1 -1
- package/src/views/Posts/NewPostPicker.tsx +1 -3
- package/src/views/Posts/NewPostTypeInstructions.tsx +1 -3
- package/src/views/Posts/PostTypesView.tsx +1 -3
- package/src/views/Posts/PostsListView.tsx +1 -1
- package/src/views/Profile.tsx +1 -1
- package/src/views/Redirects.tsx +1 -1
- package/src/views/SEO.tsx +1 -1
- package/src/views/ScriptTagEditor.tsx +1 -3
- package/src/views/ScriptTags.tsx +17 -1
- package/src/views/Settings.tsx +1 -1
- package/src/views/Users.tsx +6 -18
- package/src/views/page-builder/BlockEditor.tsx +3 -6
- package/src/views/page-builder/BottomBar.tsx +3 -6
- package/src/views/page-builder/NodeSettings.tsx +7 -16
- package/src/views/page-builder/PageTemplates.tsx +1 -1
- package/src/views/page-builder/SavedSections.tsx +2 -2
- package/src/views/page-builder/Widgets.tsx +1 -1
- package/src/views/page-editor/SectionInspector.tsx +9 -21
- package/src/views/post-editor/PostHeaderPanel.tsx +10 -20
- package/src/views/seo/TechnicalTab.tsx +3 -6
- package/src/views/settings/components.tsx +19 -26
package/src/views/Users.tsx
CHANGED
|
@@ -28,6 +28,7 @@ import { useApiData } from '../lib/useApiData.js'
|
|
|
28
28
|
import { cmsApi } from '../lib/api.js'
|
|
29
29
|
import { Button } from '../components/ui/Button.js'
|
|
30
30
|
import { EmptyState } from '../components/ui/EmptyState.js'
|
|
31
|
+
import { FilterPill } from '../components/ui/FilterPill.js'
|
|
31
32
|
import { Skeleton } from '../components/ui/Skeleton.js'
|
|
32
33
|
import { ConfirmDialog } from '../components/ui/ConfirmDialog.js'
|
|
33
34
|
import { UserDetailDrawer } from './users/UserDetailDrawer.js'
|
|
@@ -964,24 +965,11 @@ export function Users({ embedded = false }: UsersProps = {}) {
|
|
|
964
965
|
role="group"
|
|
965
966
|
aria-label="Filter by role"
|
|
966
967
|
>
|
|
967
|
-
{ROLE_PILLS.map((pill) =>
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
type="button"
|
|
973
|
-
onClick={() => setRoleFilter(pill)}
|
|
974
|
-
aria-pressed={active}
|
|
975
|
-
className={`rounded-full px-3 py-1 text-xs font-medium transition-colors ${
|
|
976
|
-
active
|
|
977
|
-
? 'bg-brand text-brand-foreground'
|
|
978
|
-
: 'bg-muted text-muted-foreground hover:bg-accent'
|
|
979
|
-
}`}
|
|
980
|
-
>
|
|
981
|
-
{pill}
|
|
982
|
-
</button>
|
|
983
|
-
)
|
|
984
|
-
})}
|
|
968
|
+
{ROLE_PILLS.map((pill) => (
|
|
969
|
+
<FilterPill key={pill} active={roleFilter === pill} onClick={() => setRoleFilter(pill)}>
|
|
970
|
+
{pill}
|
|
971
|
+
</FilterPill>
|
|
972
|
+
))}
|
|
985
973
|
</div>
|
|
986
974
|
|
|
987
975
|
{/* Table / states */}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useMemo, useCallback } from 'react'
|
|
4
4
|
import { Star, Copy, Trash2 } from 'lucide-react'
|
|
5
|
-
import * as SwitchPrimitive from '@radix-ui/react-switch'
|
|
6
5
|
import type { BlockNode, BlockTypeDefinition, FieldDefinition } from '@actuate-media/cms-core'
|
|
7
6
|
import { BlockCatalog } from '@actuate-media/cms-core/page-builder'
|
|
8
7
|
import { AIBlockAssist } from './AIBlockAssist.js'
|
|
9
8
|
import { RelationshipField } from './RelationshipField.js'
|
|
10
9
|
import { TipTapEditor } from '../../components/TipTapEditor.js'
|
|
11
10
|
import { MediaPickerModal } from '../../components/MediaPickerModal.js'
|
|
11
|
+
import { Toggle } from '../../components/ui/Toggle.js'
|
|
12
12
|
|
|
13
13
|
export interface BlockEditorProps {
|
|
14
14
|
node: BlockNode
|
|
@@ -224,14 +224,11 @@ function FieldRenderer({ name, definition, value, onChange }: FieldRendererProps
|
|
|
224
224
|
return (
|
|
225
225
|
<div className="flex items-center justify-between">
|
|
226
226
|
<label className="text-foreground text-sm font-medium">{label}</label>
|
|
227
|
-
<
|
|
227
|
+
<Toggle
|
|
228
228
|
checked={!!value}
|
|
229
229
|
onCheckedChange={(checked) => onChange(checked)}
|
|
230
|
-
className="bg-input data-[state=checked]:bg-primary relative h-5 w-9 rounded-full transition-colors"
|
|
231
230
|
aria-label={label}
|
|
232
|
-
|
|
233
|
-
<SwitchPrimitive.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[18px]" />
|
|
234
|
-
</SwitchPrimitive.Root>
|
|
231
|
+
/>
|
|
235
232
|
</div>
|
|
236
233
|
)
|
|
237
234
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { Plus, Grid3X3 } from 'lucide-react'
|
|
4
|
-
import
|
|
4
|
+
import { Toggle } from '../../components/ui/Toggle.js'
|
|
5
5
|
import type { DeviceMode } from '../../hooks/useBuilderState.js'
|
|
6
6
|
|
|
7
7
|
export interface BottomBarProps {
|
|
@@ -45,14 +45,11 @@ export function BottomBar({
|
|
|
45
45
|
{/* Grid overlay toggle */}
|
|
46
46
|
<label className="flex cursor-pointer items-center gap-2">
|
|
47
47
|
<Grid3X3 size={14} className="text-muted-foreground" />
|
|
48
|
-
<
|
|
48
|
+
<Toggle
|
|
49
49
|
checked={showGridOverlay}
|
|
50
50
|
onCheckedChange={onToggleGrid}
|
|
51
|
-
className="bg-input-background data-[state=checked]:bg-primary relative h-[18px] w-8 rounded-full transition-colors"
|
|
52
51
|
aria-label="Toggle grid overlay"
|
|
53
|
-
|
|
54
|
-
<Switch.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[14px]" />
|
|
55
|
-
</Switch.Root>
|
|
52
|
+
/>
|
|
56
53
|
<span className="text-muted-foreground text-xs">Grid</span>
|
|
57
54
|
</label>
|
|
58
55
|
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
ArrowDownToLine,
|
|
15
15
|
Minus,
|
|
16
16
|
} from 'lucide-react'
|
|
17
|
-
import
|
|
17
|
+
import { Toggle } from '../../components/ui/Toggle.js'
|
|
18
18
|
import type {
|
|
19
19
|
BuilderNode,
|
|
20
20
|
SectionNode,
|
|
@@ -231,14 +231,11 @@ function SectionFields({
|
|
|
231
231
|
<p className={SECTION_HEADING_CLASS}>Attributes</p>
|
|
232
232
|
<div className="flex items-center justify-between">
|
|
233
233
|
<label className="text-foreground text-sm font-medium">Visibility</label>
|
|
234
|
-
<
|
|
234
|
+
<Toggle
|
|
235
235
|
checked={s.visibility !== 'hidden'}
|
|
236
236
|
onCheckedChange={(checked) => updateSetting('visibility', checked ? 'visible' : 'hidden')}
|
|
237
|
-
className="bg-input data-[state=checked]:bg-primary relative h-5 w-9 rounded-full transition-colors"
|
|
238
237
|
aria-label="Section visibility"
|
|
239
|
-
|
|
240
|
-
<SwitchPrimitive.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[18px]" />
|
|
241
|
-
</SwitchPrimitive.Root>
|
|
238
|
+
/>
|
|
242
239
|
</div>
|
|
243
240
|
<div>
|
|
244
241
|
<label className={LABEL_CLASS}>HTML ID</label>
|
|
@@ -389,25 +386,19 @@ function RowFields({
|
|
|
389
386
|
<p className={SECTION_HEADING_CLASS}>Mobile</p>
|
|
390
387
|
<div className="flex items-center justify-between">
|
|
391
388
|
<label className="text-foreground text-sm font-medium">Reverse on Mobile</label>
|
|
392
|
-
<
|
|
389
|
+
<Toggle
|
|
393
390
|
checked={!!s.reverseOnMobile}
|
|
394
391
|
onCheckedChange={(checked) => updateSetting('reverseOnMobile', checked)}
|
|
395
|
-
className="bg-input data-[state=checked]:bg-primary relative h-5 w-9 rounded-full transition-colors"
|
|
396
392
|
aria-label="Reverse column order on mobile"
|
|
397
|
-
|
|
398
|
-
<SwitchPrimitive.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[18px]" />
|
|
399
|
-
</SwitchPrimitive.Root>
|
|
393
|
+
/>
|
|
400
394
|
</div>
|
|
401
395
|
<div className="flex items-center justify-between">
|
|
402
396
|
<label className="text-foreground text-sm font-medium">Wrap on Mobile</label>
|
|
403
|
-
<
|
|
397
|
+
<Toggle
|
|
404
398
|
checked={!!s.wrapOnMobile}
|
|
405
399
|
onCheckedChange={(checked) => updateSetting('wrapOnMobile', checked)}
|
|
406
|
-
className="bg-input data-[state=checked]:bg-primary relative h-5 w-9 rounded-full transition-colors"
|
|
407
400
|
aria-label="Wrap columns on mobile"
|
|
408
|
-
|
|
409
|
-
<SwitchPrimitive.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[18px]" />
|
|
410
|
-
</SwitchPrimitive.Root>
|
|
401
|
+
/>
|
|
411
402
|
</div>
|
|
412
403
|
|
|
413
404
|
<p className={SECTION_HEADING_CLASS}>Column Presets</p>
|
|
@@ -47,7 +47,7 @@ export function PageTemplates({ onNavigate }: PageTemplatesProps) {
|
|
|
47
47
|
|
|
48
48
|
<div className="mb-4 flex items-center justify-between">
|
|
49
49
|
<div>
|
|
50
|
-
<h1 className="text-foreground mb-1
|
|
50
|
+
<h1 className="text-foreground mb-1">Page Templates</h1>
|
|
51
51
|
<p className="text-muted-foreground text-sm">
|
|
52
52
|
{templates.length} saved template{templates.length === 1 ? '' : 's'}
|
|
53
53
|
</p>
|
|
@@ -169,7 +169,7 @@ export function SavedSections({ onNavigate, config }: SavedSectionsProps) {
|
|
|
169
169
|
<div className="p-4 pr-8">
|
|
170
170
|
<div className="mb-6 flex items-center justify-between">
|
|
171
171
|
<div>
|
|
172
|
-
<h1 className="text-foreground
|
|
172
|
+
<h1 className="text-foreground">Saved Sections</h1>
|
|
173
173
|
<p className="text-muted-foreground mt-1 text-sm">
|
|
174
174
|
Reusable sections for the page builder
|
|
175
175
|
</p>
|
|
@@ -393,7 +393,7 @@ function SectionForm({ initial, saving, onSave, onCancel }: SectionFormProps) {
|
|
|
393
393
|
<ArrowLeft size={16} />
|
|
394
394
|
Back
|
|
395
395
|
</button>
|
|
396
|
-
<h1 className="text-foreground
|
|
396
|
+
<h1 className="text-foreground">
|
|
397
397
|
{initial ? `Edit: ${initial.name}` : 'Create Saved Section'}
|
|
398
398
|
</h1>
|
|
399
399
|
</div>
|
|
@@ -18,7 +18,7 @@ export function Widgets({ onNavigate }: WidgetsProps) {
|
|
|
18
18
|
return (
|
|
19
19
|
<div className="p-4 pr-8">
|
|
20
20
|
<div className="mb-4">
|
|
21
|
-
<h1 className="text-foreground mb-1
|
|
21
|
+
<h1 className="text-foreground mb-1">Widgets</h1>
|
|
22
22
|
<p className="text-muted-foreground text-sm">
|
|
23
23
|
Reusable, embeddable components for pages and saved sections.
|
|
24
24
|
</p>
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
} from '@dnd-kit/sortable'
|
|
20
20
|
import { CSS } from '@dnd-kit/utilities'
|
|
21
21
|
import { MediaPickerModal } from '../../components/MediaPickerModal.js'
|
|
22
|
+
import { Toggle } from '../../components/ui/Toggle.js'
|
|
22
23
|
import type { PageSection } from '../../lib/page-editor-service.js'
|
|
23
24
|
import type { ResolvedRepeater, SectionSettings } from './section-types.js'
|
|
24
25
|
import {
|
|
@@ -497,28 +498,15 @@ function BooleanField({
|
|
|
497
498
|
}) {
|
|
498
499
|
return (
|
|
499
500
|
<div>
|
|
500
|
-
<
|
|
501
|
-
type="button"
|
|
502
|
-
id={id}
|
|
503
|
-
role="switch"
|
|
504
|
-
aria-checked={value}
|
|
505
|
-
onClick={() => onChange(!value)}
|
|
506
|
-
className="border-border text-foreground hover:bg-accent flex w-full items-center justify-between rounded-md border px-2.5 py-1.5 text-sm"
|
|
507
|
-
>
|
|
501
|
+
<div className="border-border text-foreground flex w-full items-center justify-between rounded-md border px-2.5 py-1.5 text-sm">
|
|
508
502
|
<span>{field.label}</span>
|
|
509
|
-
<
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
className={`bg-card inline-block h-4 w-4 transform rounded-full transition-transform ${
|
|
517
|
-
value ? 'translate-x-4' : 'translate-x-0.5'
|
|
518
|
-
}`}
|
|
519
|
-
/>
|
|
520
|
-
</span>
|
|
521
|
-
</button>
|
|
503
|
+
<Toggle
|
|
504
|
+
id={id}
|
|
505
|
+
checked={value}
|
|
506
|
+
onCheckedChange={(v) => onChange(v)}
|
|
507
|
+
aria-label={field.label}
|
|
508
|
+
/>
|
|
509
|
+
</div>
|
|
522
510
|
{field.help && <p className="text-muted-foreground mt-1 text-xs">{field.help}</p>}
|
|
523
511
|
</div>
|
|
524
512
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { X } from 'lucide-react'
|
|
4
|
+
import { Toggle } from '../../components/ui/Toggle.js'
|
|
4
5
|
import type { PostHeaderConfig } from '../../lib/post-editor-service.js'
|
|
5
6
|
|
|
6
7
|
interface PostHeaderPanelProps {
|
|
@@ -75,29 +76,18 @@ export function PostHeaderPanel({ header, canEdit, onClose, onChange }: PostHead
|
|
|
75
76
|
{TOGGLES.map((t) => {
|
|
76
77
|
const value = header[t.key] === true
|
|
77
78
|
return (
|
|
78
|
-
<
|
|
79
|
+
<div
|
|
79
80
|
key={t.key}
|
|
80
|
-
|
|
81
|
-
role="switch"
|
|
82
|
-
aria-checked={value}
|
|
83
|
-
disabled={!canEdit}
|
|
84
|
-
onClick={() => onChange({ [t.key]: !value } as Partial<PostHeaderConfig>)}
|
|
85
|
-
className="border-border text-foreground hover:bg-accent flex w-full items-center justify-between rounded-md border px-2.5 py-1.5 text-sm disabled:opacity-50"
|
|
81
|
+
className="border-border text-foreground flex w-full items-center justify-between rounded-md border px-2.5 py-1.5 text-sm"
|
|
86
82
|
>
|
|
87
83
|
<span>{t.label}</span>
|
|
88
|
-
<
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
className={`bg-card inline-block h-4 w-4 transform rounded-full transition-transform ${
|
|
96
|
-
value ? 'translate-x-4' : 'translate-x-0.5'
|
|
97
|
-
}`}
|
|
98
|
-
/>
|
|
99
|
-
</span>
|
|
100
|
-
</button>
|
|
84
|
+
<Toggle
|
|
85
|
+
checked={value}
|
|
86
|
+
disabled={!canEdit}
|
|
87
|
+
onCheckedChange={(v) => onChange({ [t.key]: v } as Partial<PostHeaderConfig>)}
|
|
88
|
+
aria-label={t.label}
|
|
89
|
+
/>
|
|
90
|
+
</div>
|
|
101
91
|
)
|
|
102
92
|
})}
|
|
103
93
|
</fieldset>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useId, useState } from 'react'
|
|
4
4
|
import { RefreshCw, Map, AlertTriangle, CheckCircle2, ExternalLink, Bot } from 'lucide-react'
|
|
5
|
-
import
|
|
5
|
+
import { Toggle as UiToggle } from '../../components/ui/Toggle.js'
|
|
6
6
|
import { toast } from 'sonner'
|
|
7
7
|
import {
|
|
8
8
|
fetchSitemapStatus,
|
|
@@ -67,16 +67,13 @@ function Toggle({
|
|
|
67
67
|
{help}
|
|
68
68
|
</span>
|
|
69
69
|
</span>
|
|
70
|
-
<
|
|
70
|
+
<UiToggle
|
|
71
71
|
checked={checked}
|
|
72
72
|
onCheckedChange={onChange}
|
|
73
73
|
disabled={disabled}
|
|
74
74
|
aria-labelledby={labelId}
|
|
75
75
|
aria-describedby={helpId}
|
|
76
|
-
|
|
77
|
-
>
|
|
78
|
-
<Switch.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[14px]" />
|
|
79
|
-
</Switch.Root>
|
|
76
|
+
/>
|
|
80
77
|
</div>
|
|
81
78
|
)
|
|
82
79
|
}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import * as Dialog from '@radix-ui/react-dialog'
|
|
4
4
|
import { AlertTriangle, Check, Loader2, Lock } from 'lucide-react'
|
|
5
5
|
import { useId, type ReactNode } from 'react'
|
|
6
|
+
import { Card, CardContent, CardDescription, CardHeader } from '../../components/ui/Card.js'
|
|
7
|
+
import { Toggle } from '../../components/ui/Toggle.js'
|
|
6
8
|
import { adminPortalContainer } from '../../lib/portal-container.js'
|
|
7
9
|
import type { SettingsSourceMetadata, ValidationIssue } from './useGeneralSettings.js'
|
|
8
10
|
|
|
@@ -34,21 +36,21 @@ export function SettingsCard({
|
|
|
34
36
|
}) {
|
|
35
37
|
const headingId = useId()
|
|
36
38
|
return (
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
className={`border-border bg-card rounded-lg border p-6 ${className ?? ''}`}
|
|
40
|
-
>
|
|
41
|
-
<header className="mb-4 flex items-start justify-between gap-3">
|
|
39
|
+
<Card padding="none" aria-labelledby={headingId} role="region" className={className}>
|
|
40
|
+
<CardHeader className="flex items-start justify-between gap-3">
|
|
42
41
|
<div className="min-w-0">
|
|
43
|
-
<Heading
|
|
42
|
+
<Heading
|
|
43
|
+
id={headingId}
|
|
44
|
+
className="text-[length:var(--fs-card)] font-semibold text-[var(--txt)]"
|
|
45
|
+
>
|
|
44
46
|
{title}
|
|
45
47
|
</Heading>
|
|
46
|
-
{description && <
|
|
48
|
+
{description && <CardDescription>{description}</CardDescription>}
|
|
47
49
|
</div>
|
|
48
50
|
{actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
|
|
49
|
-
</
|
|
50
|
-
{children}
|
|
51
|
-
</
|
|
51
|
+
</CardHeader>
|
|
52
|
+
<CardContent className="pt-0 text-[var(--txt)]">{children}</CardContent>
|
|
53
|
+
</Card>
|
|
52
54
|
)
|
|
53
55
|
}
|
|
54
56
|
|
|
@@ -176,23 +178,14 @@ export function SettingsToggleRow({
|
|
|
176
178
|
</div>
|
|
177
179
|
<p className="text-muted-foreground mt-0.5 text-sm">{description}</p>
|
|
178
180
|
</div>
|
|
179
|
-
<
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
onClick={() => onChange(!checked)}
|
|
186
|
-
className={`focus-visible:ring-ring relative mt-0.5 h-6 w-11 shrink-0 rounded-full transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 ${
|
|
187
|
-
checked ? 'bg-brand' : 'bg-switch-background'
|
|
188
|
-
}`}
|
|
189
|
-
>
|
|
190
|
-
<span
|
|
191
|
-
className={`bg-card absolute top-0.5 block h-5 w-5 rounded-full shadow-sm transition-transform ${
|
|
192
|
-
checked ? 'translate-x-[22px]' : 'translate-x-0.5'
|
|
193
|
-
}`}
|
|
181
|
+
<div className="mt-0.5 shrink-0">
|
|
182
|
+
<Toggle
|
|
183
|
+
checked={checked}
|
|
184
|
+
onCheckedChange={onChange}
|
|
185
|
+
disabled={disabled}
|
|
186
|
+
aria-label={label}
|
|
194
187
|
/>
|
|
195
|
-
</
|
|
188
|
+
</div>
|
|
196
189
|
</div>
|
|
197
190
|
)
|
|
198
191
|
}
|