@actuate-media/cms-admin 0.72.3 → 0.74.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 (178) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +3 -2
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/LoginRoot.d.ts.map +1 -1
  6. package/dist/LoginRoot.js +2 -1
  7. package/dist/LoginRoot.js.map +1 -1
  8. package/dist/__tests__/components/resizable-aside.test.d.ts +2 -0
  9. package/dist/__tests__/components/resizable-aside.test.d.ts.map +1 -0
  10. package/dist/__tests__/components/resizable-aside.test.js +77 -0
  11. package/dist/__tests__/components/resizable-aside.test.js.map +1 -0
  12. package/dist/__tests__/components/theme-provider-accent.test.d.ts +2 -0
  13. package/dist/__tests__/components/theme-provider-accent.test.d.ts.map +1 -0
  14. package/dist/__tests__/components/theme-provider-accent.test.js +64 -0
  15. package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -0
  16. package/dist/__tests__/views/portal-container.test.js +13 -0
  17. package/dist/__tests__/views/portal-container.test.js.map +1 -1
  18. package/dist/__tests__/views/redirects-pane.render.test.js +6 -0
  19. package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
  20. package/dist/__tests__/views/seo-content-pane.render.test.js +13 -4
  21. package/dist/__tests__/views/seo-content-pane.render.test.js.map +1 -1
  22. package/dist/actuate-admin.css +1 -1
  23. package/dist/components/CoauthorResultPopover.js +1 -1
  24. package/dist/components/EditorSeoAside.d.ts +20 -0
  25. package/dist/components/EditorSeoAside.d.ts.map +1 -0
  26. package/dist/components/EditorSeoAside.js +30 -0
  27. package/dist/components/EditorSeoAside.js.map +1 -0
  28. package/dist/components/MediaPickerModal.js +1 -1
  29. package/dist/components/SEOConfigPanel.js +1 -1
  30. package/dist/components/SchedulePublishDialog.js +1 -1
  31. package/dist/components/SharePreviewLinkDialog.js +1 -1
  32. package/dist/components/ThemeProvider.d.ts.map +1 -1
  33. package/dist/components/ThemeProvider.js +2 -1
  34. package/dist/components/ThemeProvider.js.map +1 -1
  35. package/dist/components/VersionHistory.js +1 -1
  36. package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
  37. package/dist/components/seo/SeoEditorPane.js +28 -8
  38. package/dist/components/seo/SeoEditorPane.js.map +1 -1
  39. package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
  40. package/dist/components/seo/SeoIssueFixPanel.js +13 -3
  41. package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
  42. package/dist/components/seo/primitives.d.ts.map +1 -1
  43. package/dist/components/seo/primitives.js +3 -3
  44. package/dist/components/seo/primitives.js.map +1 -1
  45. package/dist/components/ui/Card.js +5 -5
  46. package/dist/components/ui/Card.js.map +1 -1
  47. package/dist/components/ui/InspectorPane.js +3 -3
  48. package/dist/components/ui/InspectorPane.js.map +1 -1
  49. package/dist/components/ui/PanelSection.d.ts +16 -0
  50. package/dist/components/ui/PanelSection.d.ts.map +1 -0
  51. package/dist/components/ui/PanelSection.js +15 -0
  52. package/dist/components/ui/PanelSection.js.map +1 -0
  53. package/dist/components/ui/ResizableAside.d.ts +38 -0
  54. package/dist/components/ui/ResizableAside.d.ts.map +1 -0
  55. package/dist/components/ui/ResizableAside.js +209 -0
  56. package/dist/components/ui/ResizableAside.js.map +1 -0
  57. package/dist/lib/admin-root-element.d.ts +9 -0
  58. package/dist/lib/admin-root-element.d.ts.map +1 -0
  59. package/dist/lib/admin-root-element.js +14 -0
  60. package/dist/lib/admin-root-element.js.map +1 -0
  61. package/dist/lib/portal-container.d.ts.map +1 -1
  62. package/dist/lib/portal-container.js +2 -3
  63. package/dist/lib/portal-container.js.map +1 -1
  64. package/dist/lib/seo-service.d.ts +89 -0
  65. package/dist/lib/seo-service.d.ts.map +1 -1
  66. package/dist/lib/seo-service.js +50 -2
  67. package/dist/lib/seo-service.js.map +1 -1
  68. package/dist/views/ApiKeys.js +2 -2
  69. package/dist/views/Dashboard.d.ts.map +1 -1
  70. package/dist/views/Dashboard.js +12 -14
  71. package/dist/views/Dashboard.js.map +1 -1
  72. package/dist/views/MediaBrowser.d.ts.map +1 -1
  73. package/dist/views/MediaBrowser.js +35 -6
  74. package/dist/views/MediaBrowser.js.map +1 -1
  75. package/dist/views/PageEditor.js +1 -1
  76. package/dist/views/Posts/PostTypeEditor.js +3 -3
  77. package/dist/views/SEO.d.ts.map +1 -1
  78. package/dist/views/SEO.js +4 -2
  79. package/dist/views/SEO.js.map +1 -1
  80. package/dist/views/ScriptTags.js +1 -1
  81. package/dist/views/ScriptTags.js.map +1 -1
  82. package/dist/views/Users.js +1 -1
  83. package/dist/views/page-editor/EditorTopBar.d.ts +4 -1
  84. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  85. package/dist/views/page-editor/EditorTopBar.js +5 -3
  86. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  87. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  88. package/dist/views/page-editor/PageSectionEditor.js +24 -1
  89. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  90. package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
  91. package/dist/views/page-editor/SectionInspector.js +7 -2
  92. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  93. package/dist/views/page-editor/SectionsPanel.js +1 -1
  94. package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -1
  95. package/dist/views/post-editor/PostHeaderPanel.js +2 -1
  96. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
  97. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  98. package/dist/views/post-editor/PostSectionEditor.js +24 -1
  99. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  100. package/dist/views/post-editor/PostTemplateEditor.js +1 -1
  101. package/dist/views/post-editor/PostTemplateEditor.js.map +1 -1
  102. package/dist/views/seo/LinksTab.d.ts +4 -0
  103. package/dist/views/seo/LinksTab.d.ts.map +1 -0
  104. package/dist/views/seo/LinksTab.js +111 -0
  105. package/dist/views/seo/LinksTab.js.map +1 -0
  106. package/dist/views/seo/OverviewTab.js +1 -1
  107. package/dist/views/seo/OverviewTab.js.map +1 -1
  108. package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
  109. package/dist/views/seo/RedirectsTab.js +39 -6
  110. package/dist/views/seo/RedirectsTab.js.map +1 -1
  111. package/dist/views/seo/TechnicalTab.js +2 -2
  112. package/dist/views/settings/AISettingsTab.js +1 -1
  113. package/dist/views/settings/AiFeaturesCard.js +1 -1
  114. package/dist/views/settings/AiFeaturesCard.js.map +1 -1
  115. package/dist/views/settings/AppearanceTab.js +1 -1
  116. package/dist/views/settings/BrandVoiceCard.js +1 -1
  117. package/dist/views/settings/EmailSettingsTab.js +2 -2
  118. package/dist/views/settings/GeneralSettingsTab.js +1 -1
  119. package/dist/views/settings/SecurityStatusCard.js +1 -1
  120. package/dist/views/settings/SeoSettingsTab.js +4 -4
  121. package/dist/views/settings/UpdatesTab.js +2 -2
  122. package/dist/views/settings/components.js +3 -3
  123. package/dist/views/settings/components.js.map +1 -1
  124. package/package.json +2 -2
  125. package/src/AdminRoot.tsx +3 -2
  126. package/src/LoginRoot.tsx +2 -1
  127. package/src/__tests__/components/resizable-aside.test.tsx +130 -0
  128. package/src/__tests__/components/theme-provider-accent.test.tsx +84 -0
  129. package/src/__tests__/views/portal-container.test.tsx +14 -0
  130. package/src/__tests__/views/redirects-pane.render.test.tsx +6 -0
  131. package/src/__tests__/views/seo-content-pane.render.test.tsx +14 -4
  132. package/src/components/CoauthorResultPopover.tsx +1 -1
  133. package/src/components/EditorSeoAside.tsx +149 -0
  134. package/src/components/MediaPickerModal.tsx +1 -1
  135. package/src/components/SEOConfigPanel.tsx +2 -2
  136. package/src/components/SchedulePublishDialog.tsx +1 -1
  137. package/src/components/SharePreviewLinkDialog.tsx +1 -1
  138. package/src/components/ThemeProvider.tsx +3 -1
  139. package/src/components/VersionHistory.tsx +1 -1
  140. package/src/components/seo/SeoEditorPane.tsx +41 -12
  141. package/src/components/seo/SeoIssueFixPanel.tsx +16 -4
  142. package/src/components/seo/primitives.tsx +7 -3
  143. package/src/components/ui/Card.tsx +5 -5
  144. package/src/components/ui/InspectorPane.tsx +3 -3
  145. package/src/components/ui/PanelSection.tsx +53 -0
  146. package/src/components/ui/ResizableAside.tsx +317 -0
  147. package/src/lib/admin-root-element.ts +15 -0
  148. package/src/lib/portal-container.ts +3 -2
  149. package/src/lib/seo-service.ts +143 -2
  150. package/src/views/ApiKeys.tsx +2 -2
  151. package/src/views/Dashboard.tsx +40 -53
  152. package/src/views/MediaBrowser.tsx +62 -12
  153. package/src/views/PageEditor.tsx +1 -1
  154. package/src/views/Posts/PostTypeEditor.tsx +3 -3
  155. package/src/views/SEO.tsx +6 -0
  156. package/src/views/ScriptTags.tsx +2 -2
  157. package/src/views/Users.tsx +1 -1
  158. package/src/views/page-editor/EditorTopBar.tsx +24 -0
  159. package/src/views/page-editor/PageSectionEditor.tsx +44 -4
  160. package/src/views/page-editor/SectionInspector.tsx +33 -27
  161. package/src/views/page-editor/SectionsPanel.tsx +1 -1
  162. package/src/views/post-editor/PostHeaderPanel.tsx +16 -12
  163. package/src/views/post-editor/PostSectionEditor.tsx +44 -4
  164. package/src/views/post-editor/PostTemplateEditor.tsx +1 -1
  165. package/src/views/seo/LinksTab.tsx +462 -0
  166. package/src/views/seo/OverviewTab.tsx +1 -1
  167. package/src/views/seo/RedirectsTab.tsx +97 -4
  168. package/src/views/seo/TechnicalTab.tsx +2 -2
  169. package/src/views/settings/AISettingsTab.tsx +3 -3
  170. package/src/views/settings/AiFeaturesCard.tsx +1 -1
  171. package/src/views/settings/AppearanceTab.tsx +1 -1
  172. package/src/views/settings/BrandVoiceCard.tsx +2 -2
  173. package/src/views/settings/EmailSettingsTab.tsx +2 -2
  174. package/src/views/settings/GeneralSettingsTab.tsx +3 -3
  175. package/src/views/settings/SecurityStatusCard.tsx +1 -1
  176. package/src/views/settings/SeoSettingsTab.tsx +6 -6
  177. package/src/views/settings/UpdatesTab.tsx +3 -3
  178. package/src/views/settings/components.tsx +3 -3
@@ -8,8 +8,8 @@ const card = cv('overflow-hidden rounded-[var(--r)] border border-[var(--bdr)] b
8
8
  /** Stat / compact surfaces (`.dstat`). */
9
9
  sm: 'px-4 py-3.5',
10
10
  /** Simple padded panel (`.dcard-b`). */
11
- md: 'px-[18px] py-4',
12
- lg: 'px-[18px] py-6',
11
+ md: 'px-6 py-4',
12
+ lg: 'px-6 py-6',
13
13
  },
14
14
  elevation: {
15
15
  flat: 'shadow-none',
@@ -26,7 +26,7 @@ export const Card = forwardRef(function Card({ padding, elevation, interactive,
26
26
  });
27
27
  /** Header slot — `.dcard-h` in the design system handoff. */
28
28
  export function CardHeader({ className = '', bordered = true, children, ...rest }) {
29
- return (_jsx("div", { className: [bordered ? 'border-b border-[var(--bdr)] px-[18px] py-[14px]' : '', className]
29
+ return (_jsx("div", { className: [bordered ? 'border-b border-[var(--bdr)] px-6 pt-6 pb-4' : '', className]
30
30
  .filter(Boolean)
31
31
  .join(' '), ...rest, children: children }));
32
32
  }
@@ -38,10 +38,10 @@ export function CardDescription({ className = '', children, ...rest }) {
38
38
  }
39
39
  /** Body slot — `.dcard-b` in the design system handoff. */
40
40
  export function CardContent({ className = '', children, ...rest }) {
41
- return (_jsx("div", { className: `px-[18px] py-4 text-[length:var(--fs-body)] leading-[1.55] text-[var(--sub)] ${className}`, ...rest, children: children }));
41
+ return (_jsx("div", { className: `px-6 pt-4 pb-6 text-[length:var(--fs-body)] leading-[1.55] text-[var(--sub)] ${className}`, ...rest, children: children }));
42
42
  }
43
43
  export function CardFooter({ className = '', children, ...rest }) {
44
- return (_jsx("div", { className: `flex items-center justify-end gap-2 border-t border-[var(--bdr)] px-[18px] py-3 ${className}`, ...rest, children: children }));
44
+ return (_jsx("div", { className: `flex items-center justify-end gap-2 border-t border-[var(--bdr)] px-6 py-4 ${className}`, ...rest, children: children }));
45
45
  }
46
46
  export { card as cardVariants };
47
47
  //# sourceMappingURL=Card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Card.js","sourceRoot":"","sources":["../../../src/components/ui/Card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAuC,MAAM,OAAO,CAAA;AACvE,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,IAAI,GAAG,EAAE,CACb,kGAAkG,EAClG;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,KAAK;YACX,0CAA0C;YAC1C,EAAE,EAAE,aAAa;YACjB,wCAAwC;YACxC,EAAE,EAAE,gBAAgB;YACpB,EAAE,EAAE,gBAAgB;SACrB;QACD,SAAS,EAAE;YACT,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,qBAAqB;YAC9B,QAAQ,EAAE,sBAAsB;SACjC;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE;CAC3D,CACF,CAAA;AAID,MAAM,iBAAiB,GACrB,sIAAsI,CAAA;AAQxI,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAA4B,SAAS,IAAI,CACrE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EACjE,GAAG;IAEH,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1F,OAAO,CACL,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAM,IAAI,YAC5E,QAAQ,GACL,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,GAAG,EAAE,EACd,QAAQ,GAAG,IAAI,EACf,QAAQ,EACR,GAAG,IAAI,EACiD;IACxD,OAAO,CACL,cACE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;aACvF,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,KACR,IAAI,YAEP,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EAC4B;IACnC,OAAO,CACL,aACE,SAAS,EAAE,gEAAgE,SAAS,EAAE,KAClF,IAAI,YAEP,QAAQ,GACN,CACN,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EAC8B;IACrC,OAAO,CACL,YAAG,SAAS,EAAE,0DAA0D,SAAS,EAAE,KAAM,IAAI,YAC1F,QAAQ,GACP,CACL,CAAA;AACH,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC/F,OAAO,CACL,cACE,SAAS,EAAE,gFAAgF,SAAS,EAAE,KAClG,IAAI,YAEP,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC9F,OAAO,CACL,cACE,SAAS,EAAE,mFAAmF,SAAS,EAAE,KACrG,IAAI,YAEP,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"Card.js","sourceRoot":"","sources":["../../../src/components/ui/Card.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAuC,MAAM,OAAO,CAAA;AACvE,OAAO,EAAE,EAAE,EAAqB,MAAM,iBAAiB,CAAA;AAEvD,MAAM,IAAI,GAAG,EAAE,CACb,kGAAkG,EAClG;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,KAAK;YACX,0CAA0C;YAC1C,EAAE,EAAE,aAAa;YACjB,wCAAwC;YACxC,EAAE,EAAE,WAAW;YACf,EAAE,EAAE,WAAW;SAChB;QACD,SAAS,EAAE;YACT,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,qBAAqB;YAC9B,QAAQ,EAAE,sBAAsB;SACjC;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE;CAC3D,CACF,CAAA;AAID,MAAM,iBAAiB,GACrB,sIAAsI,CAAA;AAQxI,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAA4B,SAAS,IAAI,CACrE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EACjE,GAAG;IAEH,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1F,OAAO,CACL,cAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAM,IAAI,YAC5E,QAAQ,GACL,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,EACzB,SAAS,GAAG,EAAE,EACd,QAAQ,GAAG,IAAI,EACf,QAAQ,EACR,GAAG,IAAI,EACiD;IACxD,OAAO,CACL,cACE,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;aAClF,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,KACR,IAAI,YAEP,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EAC4B;IACnC,OAAO,CACL,aACE,SAAS,EAAE,gEAAgE,SAAS,EAAE,KAClF,IAAI,YAEP,QAAQ,GACN,CACN,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,GAAG,IAAI,EAC8B;IACrC,OAAO,CACL,YAAG,SAAS,EAAE,0DAA0D,SAAS,EAAE,KAAM,IAAI,YAC1F,QAAQ,GACP,CACL,CAAA;AACH,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC/F,OAAO,CACL,cACE,SAAS,EAAE,gFAAgF,SAAS,EAAE,KAClG,IAAI,YAEP,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAkC;IAC9F,OAAO,CACL,cACE,SAAS,EAAE,8EAA8E,SAAS,EAAE,KAChG,IAAI,YAEP,QAAQ,GACL,CACP,CAAA;AACH,CAAC;AAED,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,CAAA"}
@@ -32,16 +32,16 @@ export function InspectorPane({ open, width, children, 'aria-label': ariaLabel,
32
32
  return (_jsx("div", { className: "shrink-0 overflow-hidden bg-[var(--bg)] motion-safe:transition-[width] motion-safe:duration-200", style: { width: open ? `min(${width}px, 100%)` : 0 }, "aria-hidden": !open, children: _jsx("div", { role: "region", "aria-label": ariaLabel, className: "my-3 mr-3 ml-4 flex h-[calc(100%-24px)] flex-col overflow-hidden rounded-[var(--r)] border border-[var(--bdr)] bg-[var(--sb)] shadow-[var(--shd2)]", style: { width: `min(${width - 28}px, calc(100% - 28px))` }, children: open ? children : null }) }));
33
33
  }
34
34
  export function InspectorPaneHeader({ children, onClose, closeLabel = 'Close panel', }) {
35
- return (_jsxs("div", { className: "flex items-start gap-2 border-b border-[var(--bdr)] px-4 py-3.5", children: [_jsx("div", { className: "min-w-0 flex-1", children: children }), _jsx("button", { type: "button", onClick: onClose, "aria-label": closeLabel, className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-[6px] text-[var(--muted)] transition-colors duration-[var(--motion-fast)] hover:bg-[var(--bg)] hover:text-[var(--txt)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none", children: _jsx(X, { size: 16 }) })] }));
35
+ return (_jsxs("div", { className: "flex items-start gap-2 border-b border-[var(--bdr)] px-5 py-4", children: [_jsx("div", { className: "min-w-0 flex-1", children: children }), _jsx("button", { type: "button", onClick: onClose, "aria-label": closeLabel, className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-[6px] text-[var(--muted)] transition-colors duration-[var(--motion-fast)] hover:bg-[var(--bg)] hover:text-[var(--txt)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none", children: _jsx(X, { size: 16 }) })] }));
36
36
  }
37
37
  export function InspectorPaneBody({ children }) {
38
38
  return _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: children });
39
39
  }
40
40
  /** Bordered section with the design's uppercase 10.5px section title. */
41
41
  export function InspectorPaneSection({ title, subtitle, children, }) {
42
- return (_jsxs("div", { className: "border-b border-[var(--bdr)] px-4 py-3.5 last:border-b-0", children: [title && (_jsxs("div", { className: "mb-2.5 flex items-baseline gap-2", children: [_jsx("span", { className: "text-[10.5px] font-semibold tracking-[0.6px] text-[var(--muted)] uppercase", children: title }), subtitle && _jsx("span", { className: "text-[11px] text-[var(--muted)]", children: subtitle })] })), children] }));
42
+ return (_jsxs("div", { className: "border-b border-[var(--bdr)] px-5 py-4 last:border-b-0", children: [title && (_jsxs("div", { className: "mb-2.5 flex items-baseline gap-2", children: [_jsx("span", { className: "text-[10.5px] font-semibold tracking-[0.6px] text-[var(--muted)] uppercase", children: title }), subtitle && _jsx("span", { className: "text-[11px] text-[var(--muted)]", children: subtitle })] })), children] }));
43
43
  }
44
44
  export function InspectorPaneFooter({ children }) {
45
- return _jsx("div", { className: "border-t border-[var(--bdr)] px-4 py-3.5", children: children });
45
+ return _jsx("div", { className: "border-t border-[var(--bdr)] px-5 py-4", children: children });
46
46
  }
47
47
  //# sourceMappingURL=InspectorPane.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InspectorPane.js","sourceRoot":"","sources":["../../../src/components/ui/InspectorPane.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAEhC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,cAAK,SAAS,EAAE,uCAAuC,SAAS,IAAI,EAAE,EAAE,YAAG,QAAQ,GAAO,CAAA;AACnG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,cAAK,SAAS,EAAE,kCAAkC,SAAS,IAAI,EAAE,EAAE,YAAG,QAAQ,GAAO,CAAA;AAC9F,CAAC;AAUD,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,YAAY,EAAE,SAAS,GACJ;IACnB,wEAAwE;IACxE,uEAAuE;IACvE,wEAAwE;IACxE,uEAAuE;IACvE,yBAAyB;IACzB,OAAO,CACL,cACE,SAAS,EAAC,iGAAiG,EAC3G,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,iBACvC,CAAC,IAAI,YAElB,cACE,IAAI,EAAC,QAAQ,gBACD,SAAS,EACrB,SAAS,EAAC,oJAAoJ,EAC9J,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,KAAK,GAAG,EAAE,wBAAwB,EAAE,YAE1D,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GACnB,GACF,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,QAAQ,EACR,OAAO,EACP,UAAU,GAAG,aAAa,GAK3B;IACC,OAAO,CACL,eAAK,SAAS,EAAC,iEAAiE,aAC9E,cAAK,SAAS,EAAC,gBAAgB,YAAE,QAAQ,GAAO,EAChD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,gBACJ,UAAU,EACtB,SAAS,EAAC,mQAAmQ,YAE7Q,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,GAAI,GACR,IACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAA2B;IACrE,OAAO,cAAK,SAAS,EAAC,gCAAgC,YAAE,QAAQ,GAAO,CAAA;AACzE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,QAAQ,EACR,QAAQ,GAKT;IACC,OAAO,CACL,eAAK,SAAS,EAAC,0DAA0D,aACtE,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,kCAAkC,aAC/C,eAAM,SAAS,EAAC,4EAA4E,YACzF,KAAK,GACD,EACN,QAAQ,IAAI,eAAM,SAAS,EAAC,iCAAiC,YAAE,QAAQ,GAAQ,IAC5E,CACP,EACA,QAAQ,IACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAA2B;IACvE,OAAO,cAAK,SAAS,EAAC,0CAA0C,YAAE,QAAQ,GAAO,CAAA;AACnF,CAAC"}
1
+ {"version":3,"file":"InspectorPane.js","sourceRoot":"","sources":["../../../src/components/ui/InspectorPane.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAEhC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,cAAK,SAAS,EAAE,uCAAuC,SAAS,IAAI,EAAE,EAAE,YAAG,QAAQ,GAAO,CAAA;AACnG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GAIV;IACC,OAAO,cAAK,SAAS,EAAE,kCAAkC,SAAS,IAAI,EAAE,EAAE,YAAG,QAAQ,GAAO,CAAA;AAC9F,CAAC;AAUD,MAAM,UAAU,aAAa,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,YAAY,EAAE,SAAS,GACJ;IACnB,wEAAwE;IACxE,uEAAuE;IACvE,wEAAwE;IACxE,uEAAuE;IACvE,yBAAyB;IACzB,OAAO,CACL,cACE,SAAS,EAAC,iGAAiG,EAC3G,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,iBACvC,CAAC,IAAI,YAElB,cACE,IAAI,EAAC,QAAQ,gBACD,SAAS,EACrB,SAAS,EAAC,oJAAoJ,EAC9J,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,KAAK,GAAG,EAAE,wBAAwB,EAAE,YAE1D,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GACnB,GACF,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,QAAQ,EACR,OAAO,EACP,UAAU,GAAG,aAAa,GAK3B;IACC,OAAO,CACL,eAAK,SAAS,EAAC,+DAA+D,aAC5E,cAAK,SAAS,EAAC,gBAAgB,YAAE,QAAQ,GAAO,EAChD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,gBACJ,UAAU,EACtB,SAAS,EAAC,mQAAmQ,YAE7Q,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,GAAI,GACR,IACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAA2B;IACrE,OAAO,cAAK,SAAS,EAAC,gCAAgC,YAAE,QAAQ,GAAO,CAAA;AACzE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,QAAQ,EACR,QAAQ,GAKT;IACC,OAAO,CACL,eAAK,SAAS,EAAC,wDAAwD,aACpE,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,kCAAkC,aAC/C,eAAM,SAAS,EAAC,4EAA4E,YACzF,KAAK,GACD,EACN,QAAQ,IAAI,eAAM,SAAS,EAAC,iCAAiC,YAAE,QAAQ,GAAQ,IAC5E,CACP,EACA,QAAQ,IACL,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAE,QAAQ,EAA2B;IACvE,OAAO,cAAK,SAAS,EAAC,wCAAwC,YAAE,QAAQ,GAAO,CAAA;AACjF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * Bordered panel with a header divider — Dashboard, modals, and list-heavy views.
4
+ * Matches Settings/Section card rhythm: `px-6` gutters, `py-4` header, body flush
5
+ * below the divider with its own padding.
6
+ */
7
+ export declare function PanelSection({ title, description, action, children, className, }: {
8
+ title?: ReactNode;
9
+ description?: ReactNode;
10
+ action?: ReactNode;
11
+ children: ReactNode;
12
+ className?: string;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ /** Standard inset for list rows / table bodies inside a {@link PanelSection}. */
15
+ export declare const PANEL_LIST_ROW_CLASS = "hover:bg-accent/50 focus-visible:bg-accent/50 w-full px-6 py-4 text-left transition-colors";
16
+ //# sourceMappingURL=PanelSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelSection.d.ts","sourceRoot":"","sources":["../../../src/components/ui/PanelSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,SAAc,GACf,EAAE;IACD,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,2CA2BA;AAED,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,+FAC6D,CAAA"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * Bordered panel with a header divider — Dashboard, modals, and list-heavy views.
5
+ * Matches Settings/Section card rhythm: `px-6` gutters, `py-4` header, body flush
6
+ * below the divider with its own padding.
7
+ */
8
+ export function PanelSection({ title, description, action, children, className = '', }) {
9
+ return (_jsxs("section", { className: `bg-card border-border overflow-hidden rounded-xl border shadow-sm ${className}`, children: [(title || action) && (_jsxs("header", { className: "border-border flex items-center justify-between gap-3 border-b px-6 py-4", children: [_jsxs("div", { className: "min-w-0", children: [title &&
10
+ (typeof title === 'string' ? (_jsx("h2", { className: "text-foreground text-sm font-medium", children: title })) : (title)), description &&
11
+ (typeof description === 'string' ? (_jsx("p", { className: "text-muted-foreground mt-0.5 text-xs", children: description })) : (description))] }), action] })), children] }));
12
+ }
13
+ /** Standard inset for list rows / table bodies inside a {@link PanelSection}. */
14
+ export const PANEL_LIST_ROW_CLASS = 'hover:bg-accent/50 focus-visible:bg-accent/50 w-full px-6 py-4 text-left transition-colors';
15
+ //# sourceMappingURL=PanelSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelSection.js","sourceRoot":"","sources":["../../../src/components/ui/PanelSection.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAIZ;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,SAAS,GAAG,EAAE,GAOf;IACC,OAAO,CACL,mBACE,SAAS,EAAE,qEAAqE,SAAS,EAAE,aAE1F,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CACpB,kBAAQ,SAAS,EAAC,0EAA0E,aAC1F,eAAK,SAAS,EAAC,SAAS,aACrB,KAAK;gCACJ,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC3B,aAAI,SAAS,EAAC,qCAAqC,YAAE,KAAK,GAAM,CACjE,CAAC,CAAC,CAAC,CACF,KAAK,CACN,CAAC,EACH,WAAW;gCACV,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CACjC,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,CACtE,CAAC,CAAC,CAAC,CACF,WAAW,CACZ,CAAC,IACA,EACL,MAAM,IACA,CACV,EACA,QAAQ,IACD,CACX,CAAA;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,oBAAoB,GAC/B,4FAA4F,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
+ export declare const SECTION_INSPECTOR_WIDTH_KEY = "actuate:section-inspector-width";
3
+ export declare const SECTION_INSPECTOR_DEFAULT_WIDTH = 320;
4
+ export declare const SECTION_INSPECTOR_MIN_WIDTH = 280;
5
+ export declare const SECTION_INSPECTOR_MAX_WIDTH = 640;
6
+ export declare const SECTION_INSPECTOR_MIN_CANVAS_WIDTH = 96;
7
+ /** Below this editor-row width the expand action uses an overlay panel. */
8
+ export declare const SECTION_INSPECTOR_OVERLAY_BREAKPOINT = 768;
9
+ export declare const SECTION_INSPECTOR_OVERLAY_MAX_WIDTH = 480;
10
+ /** Max inline width given the surrounding editor row. */
11
+ export declare function computeInspectorMaxWidth(containerWidth: number): number;
12
+ /** Width when expanded as an overlay on tablet/mobile. */
13
+ export declare function computeInspectorOverlayWidth(containerWidth: number): number;
14
+ export declare function readSectionInspectorWidth(): number;
15
+ interface InspectorResizeContextValue {
16
+ width: number;
17
+ maxWidth: number;
18
+ isExpanded: boolean;
19
+ canExpand: boolean;
20
+ toggleExpanded: () => void;
21
+ }
22
+ export declare function useInspectorResize(): InspectorResizeContextValue | null;
23
+ interface ResizableAsideProps extends ComponentPropsWithoutRef<'aside'> {
24
+ children: ReactNode;
25
+ }
26
+ /**
27
+ * Right-hand editor shell with a draggable left edge. Used by the page/post
28
+ * section inspector and post header panel (default 320px, persisted in
29
+ * localStorage). On tablet/mobile the handle uses a 44px touch target and
30
+ * the header expand button can grow the panel to an overlay width.
31
+ */
32
+ export declare function ResizableAside({ children, className, style, ...props }: ResizableAsideProps): import("react/jsx-runtime").JSX.Element;
33
+ /** One-tap expand/collapse for tablet and mobile inspector panels. */
34
+ export declare function InspectorExpandButton({ className }: {
35
+ className?: string;
36
+ }): import("react/jsx-runtime").JSX.Element | null;
37
+ export {};
38
+ //# sourceMappingURL=ResizableAside.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizableAside.d.ts","sourceRoot":"","sources":["../../../src/components/ui/ResizableAside.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,wBAAwB,EAG7B,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAGd,eAAO,MAAM,2BAA2B,oCAAoC,CAAA;AAC5E,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAClD,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAC9C,eAAO,MAAM,2BAA2B,MAAM,CAAA;AAC9C,eAAO,MAAM,kCAAkC,KAAK,CAAA;AACpD,2EAA2E;AAC3E,eAAO,MAAM,oCAAoC,MAAM,CAAA;AACvD,eAAO,MAAM,mCAAmC,MAAM,CAAA;AAMtD,yDAAyD;AACzD,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CASvE;AAED,0DAA0D;AAC1D,wBAAgB,4BAA4B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAWlD;AAUD,UAAU,2BAA2B;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc,EAAE,MAAM,IAAI,CAAA;CAC3B;AAID,wBAAgB,kBAAkB,IAAI,2BAA2B,GAAG,IAAI,CAEvE;AAED,UAAU,mBAAoB,SAAQ,wBAAwB,CAAC,OAAO,CAAC;IACrE,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,mBAAmB,2CA+L3F;AAKD,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,kDAsB1E"}
@@ -0,0 +1,209 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createContext, useCallback, useContext, useEffect, useRef, useState, } from 'react';
4
+ import { Maximize2, Minimize2 } from 'lucide-react';
5
+ export const SECTION_INSPECTOR_WIDTH_KEY = 'actuate:section-inspector-width';
6
+ export const SECTION_INSPECTOR_DEFAULT_WIDTH = 320;
7
+ export const SECTION_INSPECTOR_MIN_WIDTH = 280;
8
+ export const SECTION_INSPECTOR_MAX_WIDTH = 640;
9
+ export const SECTION_INSPECTOR_MIN_CANVAS_WIDTH = 96;
10
+ /** Below this editor-row width the expand action uses an overlay panel. */
11
+ export const SECTION_INSPECTOR_OVERLAY_BREAKPOINT = 768;
12
+ export const SECTION_INSPECTOR_OVERLAY_MAX_WIDTH = 480;
13
+ function clampWidth(width, max = SECTION_INSPECTOR_MAX_WIDTH) {
14
+ return Math.min(max, Math.max(SECTION_INSPECTOR_MIN_WIDTH, width));
15
+ }
16
+ /** Max inline width given the surrounding editor row. */
17
+ export function computeInspectorMaxWidth(containerWidth) {
18
+ if (!Number.isFinite(containerWidth) || containerWidth <= 0) {
19
+ return SECTION_INSPECTOR_MAX_WIDTH;
20
+ }
21
+ const containerCap = Math.max(SECTION_INSPECTOR_MIN_WIDTH, containerWidth - SECTION_INSPECTOR_MIN_CANVAS_WIDTH);
22
+ return Math.min(SECTION_INSPECTOR_MAX_WIDTH, containerCap);
23
+ }
24
+ /** Width when expanded as an overlay on tablet/mobile. */
25
+ export function computeInspectorOverlayWidth(containerWidth) {
26
+ if (!Number.isFinite(containerWidth) || containerWidth <= 0) {
27
+ return SECTION_INSPECTOR_OVERLAY_MAX_WIDTH;
28
+ }
29
+ return Math.min(SECTION_INSPECTOR_OVERLAY_MAX_WIDTH, Math.max(SECTION_INSPECTOR_MIN_WIDTH, containerWidth - 32));
30
+ }
31
+ export function readSectionInspectorWidth() {
32
+ if (typeof window === 'undefined')
33
+ return SECTION_INSPECTOR_DEFAULT_WIDTH;
34
+ try {
35
+ const raw = localStorage.getItem(SECTION_INSPECTOR_WIDTH_KEY);
36
+ if (!raw)
37
+ return SECTION_INSPECTOR_DEFAULT_WIDTH;
38
+ const parsed = Number.parseInt(raw, 10);
39
+ if (!Number.isFinite(parsed))
40
+ return SECTION_INSPECTOR_DEFAULT_WIDTH;
41
+ return clampWidth(parsed);
42
+ }
43
+ catch {
44
+ return SECTION_INSPECTOR_DEFAULT_WIDTH;
45
+ }
46
+ }
47
+ function persistSectionInspectorWidth(width, max = SECTION_INSPECTOR_MAX_WIDTH) {
48
+ try {
49
+ localStorage.setItem(SECTION_INSPECTOR_WIDTH_KEY, String(clampWidth(width, max)));
50
+ }
51
+ catch {
52
+ // Storage may be unavailable in private mode.
53
+ }
54
+ }
55
+ const InspectorResizeContext = createContext(null);
56
+ export function useInspectorResize() {
57
+ return useContext(InspectorResizeContext);
58
+ }
59
+ /**
60
+ * Right-hand editor shell with a draggable left edge. Used by the page/post
61
+ * section inspector and post header panel (default 320px, persisted in
62
+ * localStorage). On tablet/mobile the handle uses a 44px touch target and
63
+ * the header expand button can grow the panel to an overlay width.
64
+ */
65
+ export function ResizableAside({ children, className, style, ...props }) {
66
+ const asideRef = useRef(null);
67
+ const [width, setWidth] = useState(SECTION_INSPECTOR_DEFAULT_WIDTH);
68
+ const [containerWidth, setContainerWidth] = useState(0);
69
+ const [isExpanded, setIsExpanded] = useState(false);
70
+ const [dragging, setDragging] = useState(false);
71
+ const widthRef = useRef(width);
72
+ const compactWidthRef = useRef(SECTION_INSPECTOR_DEFAULT_WIDTH);
73
+ const dragRef = useRef(null);
74
+ const inlineMax = computeInspectorMaxWidth(containerWidth);
75
+ const overlayMax = computeInspectorOverlayWidth(containerWidth);
76
+ const useOverlay = containerWidth > 0 && containerWidth < SECTION_INSPECTOR_OVERLAY_BREAKPOINT && isExpanded;
77
+ const effectiveMax = useOverlay ? overlayMax : inlineMax;
78
+ useEffect(() => {
79
+ setWidth(readSectionInspectorWidth());
80
+ }, []);
81
+ useEffect(() => {
82
+ widthRef.current = width;
83
+ }, [width]);
84
+ useEffect(() => {
85
+ const parent = asideRef.current?.parentElement;
86
+ if (!parent)
87
+ return;
88
+ const update = (nextWidth) => {
89
+ setContainerWidth(nextWidth);
90
+ };
91
+ update(parent.getBoundingClientRect().width);
92
+ const observer = new ResizeObserver((entries) => {
93
+ const entry = entries[0];
94
+ if (!entry)
95
+ return;
96
+ update(entry.contentRect.width);
97
+ });
98
+ observer.observe(parent);
99
+ return () => observer.disconnect();
100
+ }, []);
101
+ useEffect(() => {
102
+ setWidth((current) => clampWidth(current, effectiveMax));
103
+ }, [effectiveMax]);
104
+ const endDrag = useCallback(() => {
105
+ dragRef.current = null;
106
+ setDragging(false);
107
+ document.body.style.cursor = '';
108
+ document.body.style.userSelect = '';
109
+ persistSectionInspectorWidth(widthRef.current, inlineMax);
110
+ if (widthRef.current < effectiveMax - 24) {
111
+ setIsExpanded(false);
112
+ }
113
+ }, [effectiveMax, inlineMax]);
114
+ const onPointerDown = useCallback((event) => {
115
+ if (event.button !== 0)
116
+ return;
117
+ dragRef.current = { startX: event.clientX, startWidth: widthRef.current };
118
+ setDragging(true);
119
+ event.currentTarget.setPointerCapture(event.pointerId);
120
+ document.body.style.cursor = 'col-resize';
121
+ document.body.style.userSelect = 'none';
122
+ }, []);
123
+ const onPointerMove = useCallback((event) => {
124
+ if (!dragRef.current)
125
+ return;
126
+ const delta = dragRef.current.startX - event.clientX;
127
+ setWidth(clampWidth(dragRef.current.startWidth + delta, effectiveMax));
128
+ }, [effectiveMax]);
129
+ const onPointerUp = useCallback((event) => {
130
+ if (!dragRef.current)
131
+ return;
132
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
133
+ event.currentTarget.releasePointerCapture(event.pointerId);
134
+ }
135
+ endDrag();
136
+ }, [endDrag]);
137
+ const nudgeWidth = useCallback((delta) => {
138
+ setWidth((current) => {
139
+ const next = clampWidth(current + delta, effectiveMax);
140
+ persistSectionInspectorWidth(next, inlineMax);
141
+ if (next < effectiveMax - 24)
142
+ setIsExpanded(false);
143
+ return next;
144
+ });
145
+ }, [effectiveMax, inlineMax]);
146
+ const onKeyDown = useCallback((event) => {
147
+ if (event.key === 'ArrowLeft') {
148
+ event.preventDefault();
149
+ nudgeWidth(16);
150
+ }
151
+ else if (event.key === 'ArrowRight') {
152
+ event.preventDefault();
153
+ nudgeWidth(-16);
154
+ }
155
+ else if (event.key === 'Home') {
156
+ event.preventDefault();
157
+ setIsExpanded(false);
158
+ setWidth(SECTION_INSPECTOR_MIN_WIDTH);
159
+ persistSectionInspectorWidth(SECTION_INSPECTOR_MIN_WIDTH, inlineMax);
160
+ }
161
+ else if (event.key === 'End') {
162
+ event.preventDefault();
163
+ setWidth(effectiveMax);
164
+ persistSectionInspectorWidth(effectiveMax, inlineMax);
165
+ setIsExpanded(effectiveMax >= inlineMax - 8);
166
+ }
167
+ }, [effectiveMax, inlineMax, nudgeWidth]);
168
+ const toggleExpanded = useCallback(() => {
169
+ if (isExpanded) {
170
+ const restored = clampWidth(compactWidthRef.current, inlineMax);
171
+ setIsExpanded(false);
172
+ setWidth(restored);
173
+ persistSectionInspectorWidth(restored, inlineMax);
174
+ return;
175
+ }
176
+ compactWidthRef.current = widthRef.current;
177
+ const target = containerWidth > 0 && containerWidth < SECTION_INSPECTOR_OVERLAY_BREAKPOINT
178
+ ? overlayMax
179
+ : inlineMax;
180
+ setIsExpanded(true);
181
+ setWidth(target);
182
+ persistSectionInspectorWidth(target, inlineMax);
183
+ }, [containerWidth, inlineMax, isExpanded, overlayMax]);
184
+ useEffect(() => {
185
+ return () => {
186
+ if (dragRef.current)
187
+ endDrag();
188
+ };
189
+ }, [endDrag]);
190
+ const canExpand = !isExpanded &&
191
+ (containerWidth > 0 && containerWidth < SECTION_INSPECTOR_OVERLAY_BREAKPOINT
192
+ ? overlayMax > width + 8
193
+ : inlineMax > width + 8);
194
+ return (_jsx(InspectorResizeContext.Provider, { value: { width, maxWidth: effectiveMax, isExpanded, canExpand, toggleExpanded }, children: _jsxs("aside", { ...props, ref: asideRef, "data-overlay": useOverlay ? '' : undefined, className: `relative shrink-0 ${useOverlay ? 'absolute top-0 right-0 bottom-0 z-20 shadow-lg' : ''} ${className ?? ''}`, style: { width, ...style }, children: [_jsx("div", { role: "separator", "aria-orientation": "vertical", "aria-label": "Resize inspector panel", "aria-valuemin": SECTION_INSPECTOR_MIN_WIDTH, "aria-valuemax": effectiveMax, "aria-valuenow": width, tabIndex: 0, "data-dragging": dragging ? '' : undefined, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onPointerCancel: onPointerUp, onKeyDown: onKeyDown, className: "group absolute inset-y-0 -left-5 z-10 flex w-11 -translate-x-1/2 cursor-col-resize touch-none focus-visible:outline-none md:-left-1 md:w-3 md:translate-x-0", children: _jsx("div", { className: `mx-auto h-full w-px motion-safe:transition-colors md:mx-0 ${dragging
195
+ ? 'bg-primary'
196
+ : 'bg-border group-hover:bg-primary/50 group-focus-visible:bg-primary/50'}` }) }), children] }) }));
197
+ }
198
+ const EXPAND_BUTTON_CLASS = 'text-muted-foreground hover:text-foreground hover:bg-accent flex h-9 w-9 items-center justify-center rounded-md transition-colors focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none md:h-7 md:w-7';
199
+ /** One-tap expand/collapse for tablet and mobile inspector panels. */
200
+ export function InspectorExpandButton({ className }) {
201
+ const ctx = useInspectorResize();
202
+ if (!ctx)
203
+ return null;
204
+ const { isExpanded, canExpand, toggleExpanded } = ctx;
205
+ if (!canExpand && !isExpanded)
206
+ return null;
207
+ return (_jsx("button", { type: "button", onClick: toggleExpanded, "aria-label": isExpanded ? 'Collapse inspector panel' : 'Expand inspector panel', "aria-pressed": isExpanded, className: className ?? EXPAND_BUTTON_CLASS, children: isExpanded ? (_jsx(Minimize2, { className: "h-4 w-4", "aria-hidden": true })) : (_jsx(Maximize2, { className: "h-4 w-4", "aria-hidden": true })) }));
208
+ }
209
+ //# sourceMappingURL=ResizableAside.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizableAside.js","sourceRoot":"","sources":["../../../src/components/ui/ResizableAside.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Marks the canonical admin shell root (AdminRoot / LoginRoot). */
2
+ export declare const ADMIN_ROOT_ATTR = "data-actuate-admin-root";
3
+ /**
4
+ * Resolve the element that owns admin theme tokens (accent, color mode, density).
5
+ * Prefer the marked shell root so a consumer wrapper `.actuate-admin` does not
6
+ * steal runtime overrides from the inner AdminRoot.
7
+ */
8
+ export declare function getAdminRootElement(): HTMLElement | null;
9
+ //# sourceMappingURL=admin-root-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-root-element.d.ts","sourceRoot":"","sources":["../../src/lib/admin-root-element.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,eAAO,MAAM,eAAe,4BAA4B,CAAA;AAExD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,GAAG,IAAI,CAMxD"}
@@ -0,0 +1,14 @@
1
+ /** Marks the canonical admin shell root (AdminRoot / LoginRoot). */
2
+ export const ADMIN_ROOT_ATTR = 'data-actuate-admin-root';
3
+ /**
4
+ * Resolve the element that owns admin theme tokens (accent, color mode, density).
5
+ * Prefer the marked shell root so a consumer wrapper `.actuate-admin` does not
6
+ * steal runtime overrides from the inner AdminRoot.
7
+ */
8
+ export function getAdminRootElement() {
9
+ if (typeof document === 'undefined')
10
+ return null;
11
+ return (document.querySelector(`[${ADMIN_ROOT_ATTR}]`) ??
12
+ document.querySelector('.actuate-admin'));
13
+ }
14
+ //# sourceMappingURL=admin-root-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-root-element.js","sourceRoot":"","sources":["../../src/lib/admin-root-element.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAyB,CAAA;AAExD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IAChD,OAAO,CACL,QAAQ,CAAC,aAAa,CAAc,IAAI,eAAe,GAAG,CAAC;QAC3D,QAAQ,CAAC,aAAa,CAAc,gBAAgB,CAAC,CACtD,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"portal-container.d.ts","sourceRoot":"","sources":["../../src/lib/portal-container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,SAAS,CAG9D"}
1
+ {"version":3,"file":"portal-container.d.ts","sourceRoot":"","sources":["../../src/lib/portal-container.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,SAAS,CAE9D"}
@@ -1,3 +1,4 @@
1
+ import { getAdminRootElement } from './admin-root-element.js';
1
2
  /**
2
3
  * Admin theme tokens are scoped under `.actuate-admin` (styles/theme.css),
3
4
  * and dark mode / accent / density are applied as classes-attributes on that
@@ -9,8 +10,6 @@
9
10
  * Returns `undefined` during SSR (portals only materialize client-side).
10
11
  */
11
12
  export function adminPortalContainer() {
12
- if (typeof document === 'undefined')
13
- return undefined;
14
- return document.querySelector('.actuate-admin') ?? undefined;
13
+ return getAdminRootElement() ?? undefined;
15
14
  }
16
15
  //# sourceMappingURL=portal-container.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"portal-container.js","sourceRoot":"","sources":["../../src/lib/portal-container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,SAAS,CAAA;IACrD,OAAO,QAAQ,CAAC,aAAa,CAAc,gBAAgB,CAAC,IAAI,SAAS,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"portal-container.js","sourceRoot":"","sources":["../../src/lib/portal-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE7D;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,mBAAmB,EAAE,IAAI,SAAS,CAAA;AAC3C,CAAC"}
@@ -101,7 +101,12 @@ export interface SeoContentRecord {
101
101
  title: string;
102
102
  url: string;
103
103
  canonicalUrl: string | null;
104
+ /** Rendered public title (after site title template). */
104
105
  metaTitle: string | null;
106
+ /** Stored page-specific portion for the `%page%` token. */
107
+ metaTitlePage?: string | null;
108
+ siteName?: string | null;
109
+ titleTemplate?: string | null;
105
110
  metaDescription: string | null;
106
111
  focusKeyword: string | null;
107
112
  keyTakeaway: string | null;
@@ -209,6 +214,7 @@ export interface SeoFixFieldChange {
209
214
  export interface SeoIssueFixSuggestion {
210
215
  autoFixable: boolean;
211
216
  source?: 'deterministic' | 'ai';
217
+ fixStrategy?: 'redirect' | 'fix-link';
212
218
  aiUnavailable?: boolean;
213
219
  fingerprint: string;
214
220
  patch: Record<string, unknown>;
@@ -462,8 +468,18 @@ export declare function flattenRedirectChain(chainId: string): Promise<{
462
468
  error?: string;
463
469
  }>;
464
470
  export declare function fetchRedirectSuggestions(): Promise<RedirectSuggestion[]>;
471
+ export interface RedirectRecoverySettings {
472
+ aiRerank: boolean;
473
+ autoApply: boolean;
474
+ autoApplyMinConfidence: number;
475
+ }
476
+ export declare function fetchRedirectRecoverySettings(): Promise<RedirectRecoverySettings | null>;
477
+ export declare function saveRedirectRecoverySettings(settings: Partial<RedirectRecoverySettings>): Promise<{
478
+ error?: string;
479
+ }>;
465
480
  export declare function generate404RecoverySuggestions(): Promise<{
466
481
  error?: string;
482
+ autoApplied?: number;
467
483
  }>;
468
484
  export declare function acceptRedirectSuggestion(suggestionId: string): Promise<{
469
485
  error?: string;
@@ -499,4 +515,77 @@ export declare function generateStructuredData(context: {
499
515
  schemaType: string;
500
516
  }): Promise<SeoAiResult>;
501
517
  export declare function summarizeSeoAudit(): Promise<SeoAiResult>;
518
+ export interface LinkGraphEntityRef {
519
+ id: string;
520
+ title: string;
521
+ url: string;
522
+ path: string;
523
+ collection: string;
524
+ entityType: 'page' | 'post';
525
+ isHome: boolean;
526
+ }
527
+ export interface LinkGraphSnapshot {
528
+ scannedAt: string;
529
+ postsCrawled: number;
530
+ internalLinks: number;
531
+ externalLinks: number;
532
+ internalRatio: number;
533
+ orphanCount: number;
534
+ orphaned: LinkGraphEntityRef[];
535
+ linkCoveragePercent: number;
536
+ underLinked: Array<LinkGraphEntityRef & {
537
+ outboundInternal: number;
538
+ }>;
539
+ brokenLinkCount: number;
540
+ aiIndexLastRunAt: string | null;
541
+ aiIndexReady: boolean;
542
+ }
543
+ export interface LinkHealthIssue {
544
+ id: string;
545
+ page: string;
546
+ url: string;
547
+ status: number;
548
+ type: string;
549
+ }
550
+ export interface LinkSuggestion {
551
+ sourceEntityId: string;
552
+ sourceTitle: string;
553
+ sourceUrl: string;
554
+ anchorText: string;
555
+ confidence: number;
556
+ excerpt: string;
557
+ }
558
+ export declare function fetchLinkGraphSnapshot(): Promise<LinkGraphSnapshot>;
559
+ export declare function runLinkAiIndex(): Promise<{
560
+ data?: {
561
+ indexedAt: string;
562
+ entitiesIndexed: number;
563
+ aiAvailable: boolean;
564
+ message: string;
565
+ };
566
+ error?: string;
567
+ }>;
568
+ export declare function fetchLinkSuggestions(input: {
569
+ targetEntityId: string;
570
+ targetEntityType: 'page' | 'post';
571
+ limit?: number;
572
+ }): Promise<{
573
+ data?: {
574
+ target: {
575
+ id: string;
576
+ title: string;
577
+ url: string;
578
+ };
579
+ suggestions: LinkSuggestion[];
580
+ };
581
+ error?: string;
582
+ }>;
583
+ export declare function fetchLinkHealthIssues(): Promise<{
584
+ data?: {
585
+ issues: LinkHealthIssue[];
586
+ checked: number;
587
+ truncated: boolean;
588
+ };
589
+ error?: string;
590
+ }>;
502
591
  //# sourceMappingURL=seo-service.d.ts.map