@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # @actuate-media/cms-admin
2
2
 
3
+ ## 0.73.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 1bd984f: Add drag-to-resize on the page and post section inspector panel with a 44px touch handle, one-tap expand/collapse, container-aware width limits, and overlay mode on tablet/mobile. Width persists in localStorage (280–640px on desktop, up to near-full width on narrow viewports).
8
+
9
+ ## 0.72.3
10
+
11
+ ### Patch Changes
12
+
13
+ - d1ffaeb: Darken the `--muted` text token to meet WCAG AA contrast.
14
+
15
+ Section labels, hint/help text, and muted icons used `--muted` at the raw
16
+ design-token value (#B0ADBE light / #504E68 dark), which is ~2.2:1 against
17
+ card surfaces — barely visible. The token is now #716E83 (light) and
18
+ #8784A2 (dark): >=4.5:1 on card and page backgrounds in both modes, while
19
+ staying one step lighter than `--sub` so the text hierarchy (txt > sub >
20
+ muted) is preserved everywhere the token is used.
21
+
22
+ Also marks the dashboard's literal date line as `data-volatile` so visual
23
+ regression tests mask it instead of drifting daily.
24
+
25
+ Fix toggle thumb alignment to match the design system's `.tog-thumb`
26
+ handoff: absolute positioning at `top/left: 2.5px`, sliding to `left:
27
+ 19.5px` when checked. The previous flex + translate layout pinned the knob
28
+ to the top of the 21px track and left it 2px short horizontally when on.
29
+
30
+ - d1ffaeb: Improve the post fields modal layout and fix nested media picker stacking.
31
+ - Widen the Post details dialog (`Modal` size `lg`) for metadata-only setup
32
+ (title, slug, excerpt, featured image, SEO). Body editing moves to the
33
+ Article Body section inspector on the canvas.
34
+ - Use visible `border-border` inputs (replacing transparent `border-input`) to
35
+ match the body editor chrome.
36
+ - Add AI generate buttons for excerpt, SEO title, and SEO description (coauthor
37
+ for unsaved drafts; governed SEO endpoint when the post is persisted).
38
+ - Raise `MediaPickerModal` to z-70 so Browse opens above z-60 form modals.
39
+ - Confirm before closing the post details dialog when there are unsaved edits
40
+ (outside click, Escape, header X, or Cancel).
41
+
3
42
  ## 0.72.2
4
43
 
5
44
  ### Patch Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resizable-aside.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable-aside.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/resizable-aside.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { afterEach, describe, expect, it, vi } from 'vitest';
4
+ import { fireEvent, render, screen } from '@testing-library/react';
5
+ import { InspectorExpandButton, ResizableAside, SECTION_INSPECTOR_DEFAULT_WIDTH, SECTION_INSPECTOR_MIN_WIDTH, SECTION_INSPECTOR_WIDTH_KEY, computeInspectorMaxWidth, computeInspectorOverlayWidth, readSectionInspectorWidth, } from '../../components/ui/ResizableAside.js';
6
+ const storage = new Map();
7
+ vi.stubGlobal('localStorage', {
8
+ getItem: (key) => storage.get(key) ?? null,
9
+ setItem: (key, value) => void storage.set(key, String(value)),
10
+ removeItem: (key) => void storage.delete(key),
11
+ clear: () => storage.clear(),
12
+ });
13
+ vi.stubGlobal('ResizeObserver', class {
14
+ callback;
15
+ constructor(callback) {
16
+ this.callback = callback;
17
+ }
18
+ observe(target) {
19
+ const width = target instanceof HTMLElement
20
+ ? Number.parseFloat(target.style.width) || target.clientWidth || 900
21
+ : 900;
22
+ this.callback([{ contentRect: { width, height: 600 } }], this);
23
+ }
24
+ unobserve() { }
25
+ disconnect() { }
26
+ });
27
+ afterEach(() => {
28
+ storage.clear();
29
+ });
30
+ describe('inspector width helpers', () => {
31
+ it('caps inline max width to the container minus a canvas peek', () => {
32
+ expect(computeInspectorMaxWidth(1200)).toBe(640);
33
+ expect(computeInspectorMaxWidth(500)).toBe(404);
34
+ expect(computeInspectorMaxWidth(200)).toBe(SECTION_INSPECTOR_MIN_WIDTH);
35
+ });
36
+ it('computes overlay width for narrow editor rows', () => {
37
+ expect(computeInspectorOverlayWidth(375)).toBe(343);
38
+ expect(computeInspectorOverlayWidth(768)).toBe(480);
39
+ });
40
+ });
41
+ describe('ResizableAside', () => {
42
+ it('renders a vertical resize separator with keyboard support', () => {
43
+ render(_jsx("div", { style: { width: 900 }, children: _jsx(ResizableAside, { "aria-label": "Section editor", children: _jsx("p", { children: "Inspector content" }) }) }));
44
+ expect(screen.getByText('Inspector content')).toBeTruthy();
45
+ const separator = screen.getByRole('separator', { name: 'Resize inspector panel' });
46
+ expect(separator.getAttribute('aria-orientation')).toBe('vertical');
47
+ expect(separator.getAttribute('aria-valuemin')).toBe(String(SECTION_INSPECTOR_MIN_WIDTH));
48
+ });
49
+ it('widens when dragging the separator left', () => {
50
+ render(_jsx("div", { style: { width: 900 }, children: _jsx(ResizableAside, { "aria-label": "Section editor", children: _jsx("p", { children: "Inspector content" }) }) }));
51
+ const aside = screen.getByLabelText('Section editor');
52
+ const separator = screen.getByRole('separator', { name: 'Resize inspector panel' });
53
+ expect(aside.style.width).toBe(`${SECTION_INSPECTOR_DEFAULT_WIDTH}px`);
54
+ fireEvent.pointerDown(separator, { clientX: 900, button: 0, pointerId: 1 });
55
+ fireEvent.pointerMove(separator, { clientX: 860, pointerId: 1 });
56
+ expect(aside.style.width).toBe(`${SECTION_INSPECTOR_DEFAULT_WIDTH + 40}px`);
57
+ fireEvent.pointerUp(separator, { pointerId: 1 });
58
+ expect(localStorage.getItem(SECTION_INSPECTOR_WIDTH_KEY)).toBe(String(SECTION_INSPECTOR_DEFAULT_WIDTH + 40));
59
+ });
60
+ it('nudges width with arrow keys and persists', () => {
61
+ render(_jsx("div", { style: { width: 900 }, children: _jsx(ResizableAside, { "aria-label": "Section editor", children: _jsx("p", { children: "Inspector content" }) }) }));
62
+ const aside = screen.getByLabelText('Section editor');
63
+ const separator = screen.getByRole('separator', { name: 'Resize inspector panel' });
64
+ separator.focus();
65
+ fireEvent.keyDown(separator, { key: 'ArrowLeft' });
66
+ expect(aside.style.width).toBe(`${SECTION_INSPECTOR_DEFAULT_WIDTH + 16}px`);
67
+ expect(readSectionInspectorWidth()).toBe(SECTION_INSPECTOR_DEFAULT_WIDTH + 16);
68
+ });
69
+ it('expands to overlay width on narrow containers', () => {
70
+ render(_jsx("div", { style: { width: 375 }, children: _jsxs(ResizableAside, { "aria-label": "Section editor", children: [_jsx(InspectorExpandButton, {}), _jsx("p", { children: "Inspector content" })] }) }));
71
+ const aside = screen.getByLabelText('Section editor');
72
+ fireEvent.click(screen.getByRole('button', { name: 'Expand inspector panel' }));
73
+ expect(aside.getAttribute('data-overlay')).toBe('');
74
+ expect(aside.style.width).toBe(`${computeInspectorOverlayWidth(375)}px`);
75
+ });
76
+ });
77
+ //# sourceMappingURL=resizable-aside.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable-aside.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/resizable-aside.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=toggle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/components/toggle.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { afterEach, describe, expect, it } from 'vitest';
4
+ import { cleanup, render, screen } from '@testing-library/react';
5
+ import { Toggle } from '../../components/ui/Toggle.js';
6
+ afterEach(cleanup);
7
+ describe('Toggle', () => {
8
+ it('positions the thumb with design-system absolute offsets', () => {
9
+ render(_jsx(Toggle, { checked: false, onCheckedChange: () => { }, "aria-label": "Test toggle" }));
10
+ const thumb = screen.getByRole('switch').querySelector('span');
11
+ expect(thumb?.className).toContain('absolute');
12
+ expect(thumb?.className).toContain('top-[2.5px]');
13
+ expect(thumb?.className).toContain('left-[2.5px]');
14
+ expect(thumb?.className).toContain('data-[state=checked]:left-[19.5px]');
15
+ });
16
+ });
17
+ //# sourceMappingURL=toggle.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.test.js","sourceRoot":"","sources":["../../../src/__tests__/components/toggle.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAEtD,SAAS,CAAC,OAAO,CAAC,CAAA;AAElB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC,gBAAa,aAAa,GAAG,CAAC,CAAA;QACtF,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAC9D,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACjD,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;QAClD,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -17,6 +17,15 @@ vi.mock('../../lib/api.js', () => ({
17
17
  vi.mock('../../fields/RichTextField.js', () => ({
18
18
  RichTextField: () => _jsx("div", { "data-testid": "rich-text" }),
19
19
  }));
20
+ vi.mock('../../lib/coauthor-client.js', () => ({
21
+ coauthorText: vi.fn(async () => ({
22
+ ok: true,
23
+ result: { action: 'compress', text: 'AI excerpt' },
24
+ })),
25
+ }));
26
+ vi.mock('../../lib/seo-service.js', () => ({
27
+ generateSeoField: vi.fn(async () => ({ text: 'AI SEO title' })),
28
+ }));
20
29
  const { PostFieldsModal } = await import('../../views/post-editor/PostFieldsModal.js');
21
30
  function basePost(over = {}) {
22
31
  return {
@@ -82,5 +91,34 @@ describe('PostFieldsModal', () => {
82
91
  fireEvent.click(screen.getByRole('button', { name: 'Done' }));
83
92
  expect(onSave).toHaveBeenCalledWith(expect.objectContaining({ category: 'tutorials', tags: ['AI', 'CMS'] }));
84
93
  });
94
+ it('derives slug from title until the slug field is edited', () => {
95
+ render(_jsx(PostFieldsModal, { open: true, post: basePost({ title: '', slug: '' }), canEdit: true, onClose: () => { }, onSave: () => { } }));
96
+ fireEvent.change(screen.getByLabelText(/^Title/), { target: { value: 'Hello World' } });
97
+ expect(screen.getByLabelText(/^Slug/).value).toBe('hello-world');
98
+ fireEvent.change(screen.getByLabelText(/^Slug/), { target: { value: 'custom-slug' } });
99
+ fireEvent.change(screen.getByLabelText(/^Title/), { target: { value: 'Changed Title' } });
100
+ expect(screen.getByLabelText(/^Slug/).value).toBe('custom-slug');
101
+ });
102
+ it('exposes AI generate controls for excerpt and SEO fields', () => {
103
+ render(_jsx(PostFieldsModal, { open: true, post: basePost(), canEdit: true, onClose: () => { }, onSave: () => { } }));
104
+ expect(screen.getByRole('button', { name: 'Generate excerpt from content' })).toBeTruthy();
105
+ expect(screen.getByRole('button', { name: 'Generate SEO title from content' })).toBeTruthy();
106
+ expect(screen.getByRole('button', { name: 'Generate SEO description from content' })).toBeTruthy();
107
+ });
108
+ it('prompts before discarding when Cancel is clicked with unsaved edits', () => {
109
+ const onClose = vi.fn();
110
+ render(_jsx(PostFieldsModal, { open: true, post: basePost(), canEdit: true, onClose: onClose, onSave: () => { } }));
111
+ fireEvent.change(screen.getByLabelText(/^Title/), { target: { value: 'Changed title' } });
112
+ fireEvent.click(screen.getByRole('button', { name: 'Cancel' }));
113
+ expect(onClose).not.toHaveBeenCalled();
114
+ expect(screen.getByRole('dialog', { name: 'Discard unsaved changes?' })).toBeTruthy();
115
+ });
116
+ it('closes without prompting when nothing changed', () => {
117
+ const onClose = vi.fn();
118
+ render(_jsx(PostFieldsModal, { open: true, post: basePost(), canEdit: true, onClose: onClose, onSave: () => { } }));
119
+ fireEvent.click(screen.getByRole('button', { name: 'Cancel' }));
120
+ expect(onClose).toHaveBeenCalledTimes(1);
121
+ expect(screen.queryByRole('dialog', { name: 'Discard unsaved changes?' })).toBeNull();
122
+ });
85
123
  });
86
124
  //# sourceMappingURL=post-fields-modal.render.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"post-fields-modal.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/post-fields-modal.render.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"post-fields-modal.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/post-fields-modal.render.test.tsx"],"names":[],"mappings":"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"}