@actuate-media/cms-admin 0.64.0 → 0.66.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.
Files changed (196) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/__tests__/components/ui-primitives.test.d.ts +2 -0
  3. package/dist/__tests__/components/ui-primitives.test.d.ts.map +1 -0
  4. package/dist/__tests__/components/ui-primitives.test.js +45 -0
  5. package/dist/__tests__/components/ui-primitives.test.js.map +1 -0
  6. package/dist/__tests__/views/updates-tab.render.test.js +1 -1
  7. package/dist/__tests__/views/updates-tab.render.test.js.map +1 -1
  8. package/dist/actuate-admin.css +1 -1
  9. package/dist/components/SEOPanel.d.ts.map +1 -1
  10. package/dist/components/SEOPanel.js +2 -1
  11. package/dist/components/SEOPanel.js.map +1 -1
  12. package/dist/components/forms/primitives.d.ts.map +1 -1
  13. package/dist/components/forms/primitives.js +5 -8
  14. package/dist/components/forms/primitives.js.map +1 -1
  15. package/dist/components/posts/badges.d.ts.map +1 -1
  16. package/dist/components/posts/badges.js +7 -13
  17. package/dist/components/posts/badges.js.map +1 -1
  18. package/dist/components/seo/RedirectEditorDrawer.d.ts.map +1 -1
  19. package/dist/components/seo/RedirectEditorDrawer.js +2 -1
  20. package/dist/components/seo/RedirectEditorDrawer.js.map +1 -1
  21. package/dist/components/seo/SeoEditorDrawer.d.ts.map +1 -1
  22. package/dist/components/seo/SeoEditorDrawer.js +3 -2
  23. package/dist/components/seo/SeoEditorDrawer.js.map +1 -1
  24. package/dist/components/seo/primitives.d.ts.map +1 -1
  25. package/dist/components/seo/primitives.js +9 -14
  26. package/dist/components/seo/primitives.js.map +1 -1
  27. package/dist/components/ui/FilterPill.d.ts +14 -0
  28. package/dist/components/ui/FilterPill.d.ts.map +1 -0
  29. package/dist/components/ui/FilterPill.js +8 -0
  30. package/dist/components/ui/FilterPill.js.map +1 -0
  31. package/dist/components/ui/RowActions.d.ts +19 -0
  32. package/dist/components/ui/RowActions.d.ts.map +1 -0
  33. package/dist/components/ui/RowActions.js +16 -0
  34. package/dist/components/ui/RowActions.js.map +1 -0
  35. package/dist/components/ui/StatPill.d.ts +18 -0
  36. package/dist/components/ui/StatPill.d.ts.map +1 -0
  37. package/dist/components/ui/StatPill.js +5 -0
  38. package/dist/components/ui/StatPill.js.map +1 -0
  39. package/dist/components/ui/StatusBadge.d.ts +25 -0
  40. package/dist/components/ui/StatusBadge.d.ts.map +1 -0
  41. package/dist/components/ui/StatusBadge.js +41 -0
  42. package/dist/components/ui/StatusBadge.js.map +1 -0
  43. package/dist/components/ui/index.d.ts +8 -0
  44. package/dist/components/ui/index.d.ts.map +1 -1
  45. package/dist/components/ui/index.js +4 -0
  46. package/dist/components/ui/index.js.map +1 -1
  47. package/dist/fields/PropInput.d.ts.map +1 -1
  48. package/dist/fields/PropInput.js +2 -1
  49. package/dist/fields/PropInput.js.map +1 -1
  50. package/dist/fields/ToggleField.d.ts.map +1 -1
  51. package/dist/fields/ToggleField.js +2 -1
  52. package/dist/fields/ToggleField.js.map +1 -1
  53. package/dist/layout/Header.js +1 -1
  54. package/dist/layout/Header.js.map +1 -1
  55. package/dist/layout/Layout.js +8 -38
  56. package/dist/layout/Layout.js.map +1 -1
  57. package/dist/layout/primitives/PageContainer.d.ts.map +1 -1
  58. package/dist/layout/primitives/PageContainer.js +1 -1
  59. package/dist/layout/primitives/PageContainer.js.map +1 -1
  60. package/dist/lib/pages-service.d.ts +9 -0
  61. package/dist/lib/pages-service.d.ts.map +1 -1
  62. package/dist/lib/pages-service.js +14 -0
  63. package/dist/lib/pages-service.js.map +1 -1
  64. package/dist/lib/posts-service.d.ts +11 -0
  65. package/dist/lib/posts-service.d.ts.map +1 -1
  66. package/dist/lib/posts-service.js +13 -0
  67. package/dist/lib/posts-service.js.map +1 -1
  68. package/dist/lib/seo-service.d.ts +3 -0
  69. package/dist/lib/seo-service.d.ts.map +1 -1
  70. package/dist/lib/seo-service.js.map +1 -1
  71. package/dist/views/Dashboard.d.ts.map +1 -1
  72. package/dist/views/Dashboard.js +9 -1
  73. package/dist/views/Dashboard.js.map +1 -1
  74. package/dist/views/FormEditor.d.ts.map +1 -1
  75. package/dist/views/FormEditor.js +2 -1
  76. package/dist/views/FormEditor.js.map +1 -1
  77. package/dist/views/FormEntries.js +1 -1
  78. package/dist/views/FormEntries.js.map +1 -1
  79. package/dist/views/FormSubmissions.js +1 -1
  80. package/dist/views/FormSubmissions.js.map +1 -1
  81. package/dist/views/Forms.js +1 -1
  82. package/dist/views/Forms.js.map +1 -1
  83. package/dist/views/MediaBrowser.d.ts.map +1 -1
  84. package/dist/views/MediaBrowser.js +30 -2
  85. package/dist/views/MediaBrowser.js.map +1 -1
  86. package/dist/views/Pages/PageTagManager.d.ts.map +1 -1
  87. package/dist/views/Pages/PageTagManager.js +1 -1
  88. package/dist/views/Pages/PageTagManager.js.map +1 -1
  89. package/dist/views/Pages/PagesListView.d.ts.map +1 -1
  90. package/dist/views/Pages/PagesListView.js +59 -10
  91. package/dist/views/Pages/PagesListView.js.map +1 -1
  92. package/dist/views/Pages.js +1 -1
  93. package/dist/views/Pages.js.map +1 -1
  94. package/dist/views/Posts/NewPostPicker.d.ts.map +1 -1
  95. package/dist/views/Posts/NewPostPicker.js +1 -1
  96. package/dist/views/Posts/NewPostPicker.js.map +1 -1
  97. package/dist/views/Posts/NewPostTypeInstructions.d.ts.map +1 -1
  98. package/dist/views/Posts/NewPostTypeInstructions.js +1 -1
  99. package/dist/views/Posts/NewPostTypeInstructions.js.map +1 -1
  100. package/dist/views/Posts/PostTypesView.d.ts.map +1 -1
  101. package/dist/views/Posts/PostTypesView.js +1 -1
  102. package/dist/views/Posts/PostTypesView.js.map +1 -1
  103. package/dist/views/Posts/PostsListView.d.ts.map +1 -1
  104. package/dist/views/Posts/PostsListView.js +66 -9
  105. package/dist/views/Posts/PostsListView.js.map +1 -1
  106. package/dist/views/Profile.js +1 -1
  107. package/dist/views/Profile.js.map +1 -1
  108. package/dist/views/Redirects.js +1 -1
  109. package/dist/views/Redirects.js.map +1 -1
  110. package/dist/views/SEO.js +1 -1
  111. package/dist/views/SEO.js.map +1 -1
  112. package/dist/views/ScriptTagEditor.d.ts.map +1 -1
  113. package/dist/views/ScriptTagEditor.js +1 -1
  114. package/dist/views/ScriptTagEditor.js.map +1 -1
  115. package/dist/views/ScriptTags.d.ts.map +1 -1
  116. package/dist/views/ScriptTags.js +2 -1
  117. package/dist/views/ScriptTags.js.map +1 -1
  118. package/dist/views/Settings.js +1 -1
  119. package/dist/views/Settings.js.map +1 -1
  120. package/dist/views/Users.d.ts.map +1 -1
  121. package/dist/views/Users.js +2 -6
  122. package/dist/views/Users.js.map +1 -1
  123. package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
  124. package/dist/views/page-builder/BlockEditor.js +2 -2
  125. package/dist/views/page-builder/BlockEditor.js.map +1 -1
  126. package/dist/views/page-builder/NodeSettings.js +3 -3
  127. package/dist/views/page-builder/NodeSettings.js.map +1 -1
  128. package/dist/views/page-builder/PageTemplates.js +1 -1
  129. package/dist/views/page-builder/PageTemplates.js.map +1 -1
  130. package/dist/views/page-builder/SavedSections.js +2 -2
  131. package/dist/views/page-builder/SavedSections.js.map +1 -1
  132. package/dist/views/page-builder/Widgets.js +1 -1
  133. package/dist/views/page-builder/Widgets.js.map +1 -1
  134. package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
  135. package/dist/views/page-editor/SectionInspector.js +2 -1
  136. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  137. package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -1
  138. package/dist/views/post-editor/PostHeaderPanel.js +2 -1
  139. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
  140. package/dist/views/seo/TechnicalTab.d.ts.map +1 -1
  141. package/dist/views/seo/TechnicalTab.js +15 -0
  142. package/dist/views/seo/TechnicalTab.js.map +1 -1
  143. package/dist/views/settings/components.d.ts.map +1 -1
  144. package/dist/views/settings/components.js +2 -1
  145. package/dist/views/settings/components.js.map +1 -1
  146. package/package.json +2 -2
  147. package/src/__tests__/components/ui-primitives.test.tsx +58 -0
  148. package/src/__tests__/views/updates-tab.render.test.tsx +2 -1
  149. package/src/components/SEOPanel.tsx +2 -11
  150. package/src/components/forms/primitives.tsx +6 -16
  151. package/src/components/posts/badges.tsx +8 -21
  152. package/src/components/seo/RedirectEditorDrawer.tsx +12 -16
  153. package/src/components/seo/SeoEditorDrawer.tsx +16 -24
  154. package/src/components/seo/primitives.tsx +10 -27
  155. package/src/components/ui/FilterPill.tsx +43 -0
  156. package/src/components/ui/RowActions.tsx +50 -0
  157. package/src/components/ui/StatPill.tsx +37 -0
  158. package/src/components/ui/StatusBadge.tsx +66 -0
  159. package/src/components/ui/index.ts +8 -0
  160. package/src/fields/PropInput.tsx +6 -15
  161. package/src/fields/ToggleField.tsx +3 -15
  162. package/src/layout/Header.tsx +2 -2
  163. package/src/layout/Layout.tsx +8 -80
  164. package/src/layout/primitives/PageContainer.tsx +1 -5
  165. package/src/lib/pages-service.ts +18 -0
  166. package/src/lib/posts-service.ts +26 -0
  167. package/src/lib/seo-service.ts +3 -0
  168. package/src/views/Dashboard.tsx +48 -18
  169. package/src/views/FormEditor.tsx +6 -9
  170. package/src/views/FormEntries.tsx +1 -1
  171. package/src/views/FormSubmissions.tsx +1 -1
  172. package/src/views/Forms.tsx +1 -1
  173. package/src/views/MediaBrowser.tsx +36 -8
  174. package/src/views/Pages/PageTagManager.tsx +1 -3
  175. package/src/views/Pages/PagesListView.tsx +115 -10
  176. package/src/views/Pages.tsx +1 -1
  177. package/src/views/Posts/NewPostPicker.tsx +1 -3
  178. package/src/views/Posts/NewPostTypeInstructions.tsx +1 -3
  179. package/src/views/Posts/PostTypesView.tsx +1 -3
  180. package/src/views/Posts/PostsListView.tsx +135 -10
  181. package/src/views/Profile.tsx +1 -1
  182. package/src/views/Redirects.tsx +1 -1
  183. package/src/views/SEO.tsx +1 -1
  184. package/src/views/ScriptTagEditor.tsx +1 -3
  185. package/src/views/ScriptTags.tsx +17 -1
  186. package/src/views/Settings.tsx +1 -1
  187. package/src/views/Users.tsx +6 -18
  188. package/src/views/page-builder/BlockEditor.tsx +3 -6
  189. package/src/views/page-builder/NodeSettings.tsx +7 -16
  190. package/src/views/page-builder/PageTemplates.tsx +1 -1
  191. package/src/views/page-builder/SavedSections.tsx +2 -2
  192. package/src/views/page-builder/Widgets.tsx +1 -1
  193. package/src/views/page-editor/SectionInspector.tsx +9 -21
  194. package/src/views/post-editor/PostHeaderPanel.tsx +10 -20
  195. package/src/views/seo/TechnicalTab.tsx +15 -0
  196. package/src/views/settings/components.tsx +8 -16
@@ -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
- <SwitchPrimitive.Root
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
 
@@ -14,7 +14,7 @@ import {
14
14
  ArrowDownToLine,
15
15
  Minus,
16
16
  } from 'lucide-react'
17
- import * as SwitchPrimitive from '@radix-ui/react-switch'
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
- <SwitchPrimitive.Root
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
- <SwitchPrimitive.Root
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
- <SwitchPrimitive.Root
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 text-2xl font-medium">Page Templates</h1>
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 text-2xl font-medium">Saved Sections</h1>
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 text-2xl font-medium">
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 text-2xl font-medium">Widgets</h1>
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
- <button
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
- <span
510
- aria-hidden
511
- className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${
512
- value ? 'bg-primary' : 'bg-muted'
513
- }`}
514
- >
515
- <span
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
- <button
79
+ <div
79
80
  key={t.key}
80
- type="button"
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
- <span
89
- aria-hidden
90
- className={`relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors ${
91
- value ? 'bg-primary' : 'bg-muted'
92
- }`}
93
- >
94
- <span
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>
@@ -40,6 +40,21 @@ const CRAWL_TOGGLES: { key: keyof CrawlSettings; label: string; help: string }[]
40
40
  label: 'Include posts in sitemap',
41
41
  help: 'Add published posts to the sitemap.',
42
42
  },
43
+ {
44
+ key: 'sitemapEnabled',
45
+ label: 'Enable XML sitemap',
46
+ help: 'Serve the sitemap at /sitemap.xml.',
47
+ },
48
+ {
49
+ key: 'autoRegenerateSitemapOnPublish',
50
+ label: 'Auto-regenerate sitemap',
51
+ help: 'Rebuild the sitemap automatically when content is published.',
52
+ },
53
+ {
54
+ key: 'pingSearchEnginesOnPublish',
55
+ label: 'Ping search engines on publish',
56
+ help: 'Notify Google and Bing when the sitemap changes (production only).',
57
+ },
43
58
  ]
44
59
 
45
60
  function Toggle({
@@ -4,6 +4,7 @@ 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
6
  import { Card, CardContent, CardDescription, CardHeader } from '../../components/ui/Card.js'
7
+ import { Toggle } from '../../components/ui/Toggle.js'
7
8
  import { adminPortalContainer } from '../../lib/portal-container.js'
8
9
  import type { SettingsSourceMetadata, ValidationIssue } from './useGeneralSettings.js'
9
10
 
@@ -177,23 +178,14 @@ export function SettingsToggleRow({
177
178
  </div>
178
179
  <p className="text-muted-foreground mt-0.5 text-sm">{description}</p>
179
180
  </div>
180
- <button
181
- type="button"
182
- role="switch"
183
- aria-checked={checked}
184
- aria-label={label}
185
- disabled={disabled}
186
- onClick={() => onChange(!checked)}
187
- 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 ${
188
- checked ? 'bg-brand' : 'bg-switch-background'
189
- }`}
190
- >
191
- <span
192
- className={`bg-card absolute top-0.5 block h-5 w-5 rounded-full shadow-sm transition-transform ${
193
- checked ? 'translate-x-[22px]' : 'translate-x-0.5'
194
- }`}
181
+ <div className="mt-0.5 shrink-0">
182
+ <Toggle
183
+ checked={checked}
184
+ onCheckedChange={onChange}
185
+ disabled={disabled}
186
+ aria-label={label}
195
187
  />
196
- </button>
188
+ </div>
197
189
  </div>
198
190
  )
199
191
  }