@actuate-media/cms-admin 0.72.2 → 0.73.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 (71) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/__tests__/components/resizable-aside.test.d.ts +2 -0
  3. package/dist/__tests__/components/resizable-aside.test.d.ts.map +1 -0
  4. package/dist/__tests__/components/resizable-aside.test.js +77 -0
  5. package/dist/__tests__/components/resizable-aside.test.js.map +1 -0
  6. package/dist/__tests__/components/toggle.test.d.ts +2 -0
  7. package/dist/__tests__/components/toggle.test.d.ts.map +1 -0
  8. package/dist/__tests__/components/toggle.test.js +17 -0
  9. package/dist/__tests__/components/toggle.test.js.map +1 -0
  10. package/dist/__tests__/views/post-fields-modal.render.test.js +38 -0
  11. package/dist/__tests__/views/post-fields-modal.render.test.js.map +1 -1
  12. package/dist/actuate-admin.css +1 -1
  13. package/dist/components/MediaPickerModal.d.ts.map +1 -1
  14. package/dist/components/MediaPickerModal.js +1 -1
  15. package/dist/components/MediaPickerModal.js.map +1 -1
  16. package/dist/components/TagInput.js +1 -1
  17. package/dist/components/TagInput.js.map +1 -1
  18. package/dist/components/ui/Modal.d.ts +17 -1
  19. package/dist/components/ui/Modal.d.ts.map +1 -1
  20. package/dist/components/ui/Modal.js +29 -3
  21. package/dist/components/ui/Modal.js.map +1 -1
  22. package/dist/components/ui/ResizableAside.d.ts +38 -0
  23. package/dist/components/ui/ResizableAside.d.ts.map +1 -0
  24. package/dist/components/ui/ResizableAside.js +209 -0
  25. package/dist/components/ui/ResizableAside.js.map +1 -0
  26. package/dist/components/ui/Toggle.d.ts.map +1 -1
  27. package/dist/components/ui/Toggle.js +4 -3
  28. package/dist/components/ui/Toggle.js.map +1 -1
  29. package/dist/fields/RichTextField.d.ts +3 -1
  30. package/dist/fields/RichTextField.d.ts.map +1 -1
  31. package/dist/fields/RichTextField.js +2 -2
  32. package/dist/fields/RichTextField.js.map +1 -1
  33. package/dist/views/Dashboard.d.ts.map +1 -1
  34. package/dist/views/Dashboard.js +1 -1
  35. package/dist/views/Dashboard.js.map +1 -1
  36. package/dist/views/page-editor/PageSectionEditor.js +1 -1
  37. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  38. package/dist/views/page-editor/SectionInspector.d.ts +4 -1
  39. package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
  40. package/dist/views/page-editor/SectionInspector.js +14 -3
  41. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  42. package/dist/views/post-editor/PostFieldsModal.d.ts +1 -1
  43. package/dist/views/post-editor/PostFieldsModal.d.ts.map +1 -1
  44. package/dist/views/post-editor/PostFieldsModal.js +152 -13
  45. package/dist/views/post-editor/PostFieldsModal.js.map +1 -1
  46. package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -1
  47. package/dist/views/post-editor/PostHeaderPanel.js +2 -1
  48. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
  49. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  50. package/dist/views/post-editor/PostSectionEditor.js +6 -1
  51. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  52. package/dist/views/post-editor/PostTemplateEditor.js +1 -1
  53. package/dist/views/post-editor/PostTemplateEditor.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/__tests__/components/resizable-aside.test.tsx +130 -0
  56. package/src/__tests__/components/toggle.test.tsx +17 -0
  57. package/src/__tests__/views/post-fields-modal.render.test.tsx +54 -0
  58. package/src/components/MediaPickerModal.tsx +6 -2
  59. package/src/components/TagInput.tsx +1 -1
  60. package/src/components/ui/Modal.tsx +46 -3
  61. package/src/components/ui/ResizableAside.tsx +317 -0
  62. package/src/components/ui/Toggle.tsx +4 -3
  63. package/src/fields/RichTextField.tsx +4 -1
  64. package/src/styles/actuate-tokens.css +7 -2
  65. package/src/views/Dashboard.tsx +2 -1
  66. package/src/views/page-editor/PageSectionEditor.tsx +1 -1
  67. package/src/views/page-editor/SectionInspector.tsx +54 -26
  68. package/src/views/post-editor/PostFieldsModal.tsx +412 -174
  69. package/src/views/post-editor/PostHeaderPanel.tsx +15 -11
  70. package/src/views/post-editor/PostSectionEditor.tsx +9 -1
  71. package/src/views/post-editor/PostTemplateEditor.tsx +1 -1
@@ -1,6 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import { X } from 'lucide-react'
4
+ import { InspectorExpandButton, ResizableAside } from '../../components/ui/ResizableAside.js'
4
5
  import { Toggle } from '../../components/ui/Toggle.js'
5
6
  import type { PostHeaderConfig } from '../../lib/post-editor-service.js'
6
7
 
@@ -27,24 +28,27 @@ const TOGGLES: Array<{ key: keyof PostHeaderConfig; label: string }> = [
27
28
  /** Inspector panel for the post header layout (template-level design config). */
28
29
  export function PostHeaderPanel({ header, canEdit, onClose, onChange }: PostHeaderPanelProps) {
29
30
  return (
30
- <aside
31
+ <ResizableAside
31
32
  role="dialog"
32
33
  aria-label="Edit post header"
33
- className="bg-card border-border flex h-full w-80 shrink-0 flex-col border-l"
34
+ className="bg-card border-border flex h-full flex-col border-l"
34
35
  >
35
36
  <div className="border-border flex items-center justify-between border-b px-4 py-3">
36
37
  <div className="min-w-0">
37
38
  <h2 className="text-foreground truncate text-sm font-medium">Post header</h2>
38
39
  <p className="text-muted-foreground text-xs">Layout for every post of this type</p>
39
40
  </div>
40
- <button
41
- type="button"
42
- onClick={onClose}
43
- aria-label="Close header panel"
44
- className="text-muted-foreground hover:text-foreground hover:bg-accent rounded p-1"
45
- >
46
- <X className="h-4 w-4" aria-hidden />
47
- </button>
41
+ <div className="flex shrink-0 items-center gap-0.5">
42
+ <InspectorExpandButton />
43
+ <button
44
+ type="button"
45
+ onClick={onClose}
46
+ aria-label="Close header panel"
47
+ className="text-muted-foreground hover:text-foreground hover:bg-accent flex h-9 w-9 items-center justify-center rounded-md md:h-7 md:w-7"
48
+ >
49
+ <X className="h-4 w-4" aria-hidden />
50
+ </button>
51
+ </div>
48
52
  </div>
49
53
 
50
54
  <div className="flex-1 space-y-6 overflow-y-auto p-4">
@@ -92,6 +96,6 @@ export function PostHeaderPanel({ header, canEdit, onClose, onChange }: PostHead
92
96
  })}
93
97
  </fieldset>
94
98
  </div>
95
- </aside>
99
+ </ResizableAside>
96
100
  )
97
101
  }
@@ -301,6 +301,12 @@ export function PostSectionEditor({
301
301
  setSaveState('idle')
302
302
  }, [])
303
303
 
304
+ const handlePostBodyChange = useCallback((body: string) => {
305
+ setPost((prev) => (prev ? { ...prev, body } : prev))
306
+ setDirty(true)
307
+ setSaveState('idle')
308
+ }, [])
309
+
304
310
  // ─── Save / publish ──────────────────────────────────────────────────
305
311
  const handleSaveDraft = useCallback(async (): Promise<boolean> => {
306
312
  if (!post) return false
@@ -558,7 +564,7 @@ export function PostSectionEditor({
558
564
  />
559
565
  )}
560
566
 
561
- <div className="flex flex-1 overflow-hidden">
567
+ <div className="relative flex flex-1 overflow-hidden">
562
568
  <SectionsPanel
563
569
  sections={post.sections}
564
570
  selectedId={selectedId}
@@ -603,6 +609,8 @@ export function PostSectionEditor({
603
609
  onSettingsChange={handleSettingsChange}
604
610
  onMetaChange={handleMetaChange}
605
611
  onToggleVisibility={() => handleToggleVisibility(selected.id)}
612
+ postBody={post.body}
613
+ onPostBodyChange={handlePostBodyChange}
606
614
  />
607
615
  )}
608
616
  </div>
@@ -248,7 +248,7 @@ export function PostTemplateEditor({
248
248
  </div>
249
249
  </header>
250
250
 
251
- <div className="flex flex-1 overflow-hidden">
251
+ <div className="relative flex flex-1 overflow-hidden">
252
252
  <SectionsPanel
253
253
  sections={template.sections}
254
254
  selectedId={selectedSectionId}