@drawnagency/primitives 0.1.113 → 0.1.115

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 (534) hide show
  1. package/README.md +1 -1
  2. package/dist/auth/cookies.d.ts +39 -0
  3. package/dist/auth/cookies.d.ts.map +1 -1
  4. package/dist/auth/index.js +3 -3
  5. package/dist/chunk-4WQ36ZP7.js +83 -0
  6. package/dist/{chunk-REDDTTGJ.js → chunk-4Y2JQQZL.js} +19 -1
  7. package/dist/chunk-5GFACGSN.js +6 -0
  8. package/dist/{chunk-AHALSCQH.js → chunk-67P34WNW.js} +76 -131
  9. package/dist/{chunk-S2L3BPLS.js → chunk-7SX42OP4.js} +1 -1
  10. package/dist/{chunk-GGXZZ77Z.js → chunk-AASEGXNT.js} +18 -1
  11. package/dist/chunk-APIJPTFG.js +64 -0
  12. package/dist/{chunk-WKZ7OENC.js → chunk-BQ5TZZUE.js} +5 -1
  13. package/dist/chunk-CDBURDPX.js +90 -0
  14. package/dist/chunk-DFKTF3CH.js +0 -0
  15. package/dist/chunk-DIMDRBFK.js +11 -0
  16. package/dist/chunk-DJABADOO.js +131 -0
  17. package/dist/{chunk-NHN2LSIU.js → chunk-DJOGPSRU.js} +31 -68
  18. package/dist/{chunk-KR2MHTNJ.js → chunk-FHTKSELX.js} +610 -62
  19. package/dist/{chunk-WUJ3XNFI.js → chunk-GGYY3JQJ.js} +19 -24
  20. package/dist/chunk-GNF6KFQ7.js +18 -0
  21. package/dist/{chunk-FRE2CCLV.js → chunk-HHNPSKPT.js} +5 -79
  22. package/dist/{chunk-IINIZBQB.js → chunk-JCDZAFX2.js} +30 -10
  23. package/dist/chunk-JR24U7FJ.js +120 -0
  24. package/dist/{chunk-BDFTMGCL.js → chunk-JXATNKLV.js} +11 -10
  25. package/dist/{chunk-SW6PCQQD.js → chunk-KQA772WQ.js} +2 -1
  26. package/dist/{chunk-6BZ2KNTP.js → chunk-NX7TFHA4.js} +195 -65
  27. package/dist/{chunk-VWWY5TL5.js → chunk-O37AV27P.js} +14 -75
  28. package/dist/chunk-RIITGTV3.js +275 -0
  29. package/dist/{chunk-HBULBDGP.js → chunk-S37DZPHW.js} +1 -1
  30. package/dist/chunk-S7QRHUWO.js +8 -0
  31. package/dist/{chunk-Z7W3DQTR.js → chunk-T26HAKW3.js} +424 -42
  32. package/dist/{chunk-4I5OO5UB.js → chunk-TEOAKGZA.js} +0 -1
  33. package/dist/{chunk-GPPVYLEI.js → chunk-UUUSJDIG.js} +1 -1
  34. package/dist/chunk-VY3IFGE3.js +70 -0
  35. package/dist/chunk-WYOFQHKI.js +176 -0
  36. package/dist/{chunk-4RNF2DRG.js → chunk-XDEPXTBY.js} +0 -2
  37. package/dist/{chunk-DS4GCYV2.js → chunk-YV3YSZEB.js} +223 -16
  38. package/dist/collab/rebase.d.ts +2 -1
  39. package/dist/collab/rebase.d.ts.map +1 -1
  40. package/dist/collab/rebase.js +24 -9
  41. package/dist/components/brandguide/ColorsEditable.d.ts.map +1 -1
  42. package/dist/components/chat/ChatPanel.d.ts.map +1 -1
  43. package/dist/components/chat/ChatWidget.d.ts.map +1 -1
  44. package/dist/components/docfile/DocFilePane.d.ts.map +1 -1
  45. package/dist/components/editor/ChildBlockWrapper.d.ts.map +1 -1
  46. package/dist/components/editor/ConflictDialog.d.ts.map +1 -1
  47. package/dist/components/editor/DragHandle.d.ts +12 -2
  48. package/dist/components/editor/DragHandle.d.ts.map +1 -1
  49. package/dist/components/editor/DropEdgeIndicator.d.ts +15 -6
  50. package/dist/components/editor/DropEdgeIndicator.d.ts.map +1 -1
  51. package/dist/components/editor/NavGroupRow.d.ts +4 -1
  52. package/dist/components/editor/NavGroupRow.d.ts.map +1 -1
  53. package/dist/components/editor/PagesModal.d.ts.map +1 -1
  54. package/dist/components/editor/SectionWrapper.d.ts +1 -1
  55. package/dist/components/editor/SectionWrapper.d.ts.map +1 -1
  56. package/dist/components/editor/SettingsForm.d.ts.map +1 -1
  57. package/dist/components/editor/TagIndicator.d.ts +15 -0
  58. package/dist/components/editor/TagIndicator.d.ts.map +1 -0
  59. package/dist/components/editor/index.js +150 -79
  60. package/dist/components/primitives/DocumentDropZone.d.ts +1 -1
  61. package/dist/components/primitives/EditableGrid.d.ts.map +1 -1
  62. package/dist/components/primitives/EditableList.d.ts.map +1 -1
  63. package/dist/components/primitives/HeadingSection.d.ts +4 -1
  64. package/dist/components/primitives/HeadingSection.d.ts.map +1 -1
  65. package/dist/components/primitives/ResolvedMedia.d.ts +5 -1
  66. package/dist/components/primitives/ResolvedMedia.d.ts.map +1 -1
  67. package/dist/components/primitives/{defineHeadingSection.d.ts → define-heading-section.d.ts} +1 -1
  68. package/dist/components/primitives/define-heading-section.d.ts.map +1 -0
  69. package/dist/components/primitives/{gridDrop.d.ts → grid-drop.d.ts} +1 -1
  70. package/dist/components/primitives/grid-drop.d.ts.map +1 -0
  71. package/dist/components/primitives/index.d.ts +1 -1
  72. package/dist/components/primitives/index.d.ts.map +1 -1
  73. package/dist/components/primitives/index.js +22 -154
  74. package/dist/components/sections/Button/CTAButton.d.ts.map +1 -1
  75. package/dist/components/sections/DoDontMedia/DoDontMediaBlock.d.ts +2 -6
  76. package/dist/components/sections/DoDontMedia/DoDontMediaBlock.d.ts.map +1 -1
  77. package/dist/components/sections/DoDontMedia/index.d.ts +8 -0
  78. package/dist/components/sections/DoDontMedia/index.d.ts.map +1 -1
  79. package/dist/components/sections/IconList/IconList.d.ts +2 -1
  80. package/dist/components/sections/IconList/IconList.d.ts.map +1 -1
  81. package/dist/components/sections/IconList/IconListSettings.d.ts +2 -1
  82. package/dist/components/sections/IconList/IconListSettings.d.ts.map +1 -1
  83. package/dist/components/sections/IconList/index.d.ts +1 -0
  84. package/dist/components/sections/IconList/index.d.ts.map +1 -1
  85. package/dist/components/sections/Media/MediaBlock.d.ts +2 -1
  86. package/dist/components/sections/Media/MediaBlock.d.ts.map +1 -1
  87. package/dist/components/sections/Media/index.d.ts +8 -0
  88. package/dist/components/sections/Media/index.d.ts.map +1 -1
  89. package/dist/components/sections/Reference/ReferenceList.d.ts +35 -0
  90. package/dist/components/sections/Reference/ReferenceList.d.ts.map +1 -0
  91. package/dist/components/sections/Reference/ReferenceSettings.d.ts +12 -0
  92. package/dist/components/sections/Reference/ReferenceSettings.d.ts.map +1 -0
  93. package/dist/components/sections/Reference/index.d.ts +9 -0
  94. package/dist/components/sections/Reference/index.d.ts.map +1 -0
  95. package/dist/components/sections/SectionSummary/SectionSummaryBlock.d.ts +38 -0
  96. package/dist/components/sections/SectionSummary/SectionSummaryBlock.d.ts.map +1 -0
  97. package/dist/components/sections/SectionSummary/SectionSummarySettings.d.ts +20 -0
  98. package/dist/components/sections/SectionSummary/SectionSummarySettings.d.ts.map +1 -0
  99. package/dist/components/sections/SectionSummary/index.d.ts +33 -0
  100. package/dist/components/sections/SectionSummary/index.d.ts.map +1 -0
  101. package/dist/components/sections/all-sections.d.ts +53 -0
  102. package/dist/components/sections/all-sections.d.ts.map +1 -1
  103. package/dist/components/sections/brand-guide.d.ts +41 -2
  104. package/dist/components/sections/brand-guide.d.ts.map +1 -1
  105. package/dist/components/sections/brand-guide.js +17 -10
  106. package/dist/components/sections/core-sections.d.ts +14 -0
  107. package/dist/components/sections/core-sections.d.ts.map +1 -1
  108. package/dist/components/sections/register-schemas.js +25 -18
  109. package/dist/components/sections/register.js +25 -18
  110. package/dist/components/shared/BrandSwatchesContext.d.ts +9 -0
  111. package/dist/components/shared/BrandSwatchesContext.d.ts.map +1 -0
  112. package/dist/components/shared/Button.d.ts +11 -3
  113. package/dist/components/shared/Button.d.ts.map +1 -1
  114. package/dist/components/shared/Checkbox.d.ts +6 -0
  115. package/dist/components/shared/Checkbox.d.ts.map +1 -1
  116. package/dist/components/shared/ConfirmDialog.d.ts +25 -0
  117. package/dist/components/shared/ConfirmDialog.d.ts.map +1 -0
  118. package/dist/components/shared/ConfirmInline.d.ts +25 -0
  119. package/dist/components/shared/ConfirmInline.d.ts.map +1 -0
  120. package/dist/components/shared/ErrorBoundary.d.ts.map +1 -1
  121. package/dist/components/shared/Fab.d.ts +11 -2
  122. package/dist/components/shared/Fab.d.ts.map +1 -1
  123. package/dist/components/shared/FabStack.d.ts +22 -0
  124. package/dist/components/shared/FabStack.d.ts.map +1 -0
  125. package/dist/components/shared/HistoryChangesModal.d.ts.map +1 -1
  126. package/dist/components/shared/HistoryPopover.d.ts.map +1 -1
  127. package/dist/components/shared/ImageBackgroundField.d.ts +9 -0
  128. package/dist/components/shared/ImageBackgroundField.d.ts.map +1 -0
  129. package/dist/components/shared/{UploadRejectionAlert.d.ts → InlineAlert.d.ts} +4 -2
  130. package/dist/components/shared/InlineAlert.d.ts.map +1 -0
  131. package/dist/components/shared/Input.d.ts +10 -0
  132. package/dist/components/shared/Input.d.ts.map +1 -1
  133. package/dist/components/shared/Navigation.d.ts.map +1 -1
  134. package/dist/components/shared/Notice.d.ts +10 -0
  135. package/dist/components/shared/Notice.d.ts.map +1 -0
  136. package/dist/components/shared/Popover.d.ts.map +1 -1
  137. package/dist/components/shared/ReferenceSourcesContext.d.ts +25 -0
  138. package/dist/components/shared/ReferenceSourcesContext.d.ts.map +1 -0
  139. package/dist/components/shared/Select.d.ts +3 -2
  140. package/dist/components/shared/Select.d.ts.map +1 -1
  141. package/dist/components/shared/SplitButton.d.ts.map +1 -1
  142. package/dist/components/shared/SummaryAnchorsContext.d.ts +10 -0
  143. package/dist/components/shared/SummaryAnchorsContext.d.ts.map +1 -0
  144. package/dist/components/shared/Textarea.d.ts +7 -0
  145. package/dist/components/shared/Textarea.d.ts.map +1 -1
  146. package/dist/components/shared/ToolbarFrame.d.ts +17 -0
  147. package/dist/components/shared/ToolbarFrame.d.ts.map +1 -0
  148. package/dist/components/shared/copy.d.ts +13 -0
  149. package/dist/components/shared/copy.d.ts.map +1 -0
  150. package/dist/components/shared/icons.d.ts +0 -12
  151. package/dist/components/shared/icons.d.ts.map +1 -1
  152. package/dist/components/shell/AudienceDetailsPanel.d.ts +7 -1
  153. package/dist/components/shell/AudienceDetailsPanel.d.ts.map +1 -1
  154. package/dist/components/shell/AudienceRow.d.ts.map +1 -1
  155. package/dist/components/shell/BugReportFAB.d.ts +7 -1
  156. package/dist/components/shell/BugReportFAB.d.ts.map +1 -1
  157. package/dist/components/shell/CredentialList.d.ts.map +1 -1
  158. package/dist/components/shell/DocInspector.d.ts.map +1 -1
  159. package/dist/components/shell/DocumentEditorOverlay.d.ts.map +1 -1
  160. package/dist/components/shell/EditorContext.d.ts +4 -0
  161. package/dist/components/shell/EditorContext.d.ts.map +1 -1
  162. package/dist/components/shell/EditorLoginForm.d.ts.map +1 -1
  163. package/dist/components/shell/EditorModal.d.ts.map +1 -1
  164. package/dist/components/shell/EditorShell.d.ts.map +1 -1
  165. package/dist/components/shell/HistoryToolbar.d.ts.map +1 -1
  166. package/dist/components/shell/MediaFolderTile.d.ts +4 -1
  167. package/dist/components/shell/MediaFolderTile.d.ts.map +1 -1
  168. package/dist/components/shell/MediaLibraryModal.d.ts.map +1 -1
  169. package/dist/components/shell/RestoreModal.d.ts.map +1 -1
  170. package/dist/components/shell/SiteSettingsChatbot.d.ts.map +1 -1
  171. package/dist/components/shell/SiteSettingsDisplay.d.ts.map +1 -1
  172. package/dist/components/shell/SiteSettingsModal.d.ts +3 -1
  173. package/dist/components/shell/SiteSettingsModal.d.ts.map +1 -1
  174. package/dist/components/shell/SiteSettingsTags.d.ts +13 -0
  175. package/dist/components/shell/SiteSettingsTags.d.ts.map +1 -0
  176. package/dist/components/shell/SiteSettingsUsers.d.ts.map +1 -1
  177. package/dist/components/shell/ViewerLoginForm.d.ts.map +1 -1
  178. package/dist/components/shell/{blockMoveDispatch.d.ts → block-move-dispatch.d.ts} +1 -1
  179. package/dist/components/shell/block-move-dispatch.d.ts.map +1 -0
  180. package/dist/components/shell/reference-sources.d.ts +22 -0
  181. package/dist/components/shell/reference-sources.d.ts.map +1 -0
  182. package/dist/deck/index.d.ts +2 -2
  183. package/dist/deck/index.d.ts.map +1 -1
  184. package/dist/deck/index.js +1 -3
  185. package/dist/deck-builder/index.js +10 -17
  186. package/dist/document/index.d.ts +2 -2
  187. package/dist/document/index.d.ts.map +1 -1
  188. package/dist/hooks/useBlockDnd.d.ts +11 -0
  189. package/dist/hooks/useBlockDnd.d.ts.map +1 -1
  190. package/dist/hooks/useBuildStatus.d.ts +1 -1
  191. package/dist/hooks/useBuildStatus.d.ts.map +1 -1
  192. package/dist/hooks/useDocumentUploads.d.ts +1 -1
  193. package/dist/hooks/useDocumentUploads.d.ts.map +1 -1
  194. package/dist/hooks/useEditorPersistence.d.ts +5 -1
  195. package/dist/hooks/useEditorPersistence.d.ts.map +1 -1
  196. package/dist/hooks/useEditorPublish.d.ts +6 -3
  197. package/dist/hooks/useEditorPublish.d.ts.map +1 -1
  198. package/dist/hooks/useMediaPipeline.d.ts.map +1 -1
  199. package/dist/hooks/useNotice.d.ts +19 -0
  200. package/dist/hooks/useNotice.d.ts.map +1 -0
  201. package/dist/hooks/useSortableNavRow.d.ts +11 -0
  202. package/dist/hooks/useSortableNavRow.d.ts.map +1 -1
  203. package/dist/hooks/useSortableRow.d.ts +11 -0
  204. package/dist/hooks/useSortableRow.d.ts.map +1 -1
  205. package/dist/hooks/useStackedEscape.d.ts +32 -0
  206. package/dist/hooks/useStackedEscape.d.ts.map +1 -0
  207. package/dist/index.js +95 -48
  208. package/dist/lib/audience-secret.js +2 -2
  209. package/dist/lib/block-dnd.d.ts +5 -0
  210. package/dist/lib/block-dnd.d.ts.map +1 -1
  211. package/dist/lib/block-move.d.ts.map +1 -1
  212. package/dist/lib/brand-swatches.d.ts +12 -0
  213. package/dist/lib/brand-swatches.d.ts.map +1 -0
  214. package/dist/lib/container-ops.d.ts +3 -2
  215. package/dist/lib/container-ops.d.ts.map +1 -1
  216. package/dist/lib/dexie.d.ts +7 -1
  217. package/dist/lib/dexie.d.ts.map +1 -1
  218. package/dist/lib/dexie.js +12 -3
  219. package/dist/lib/env.d.ts +4 -0
  220. package/dist/lib/env.d.ts.map +1 -1
  221. package/dist/lib/env.js +5 -3
  222. package/dist/lib/events.d.ts +1 -2
  223. package/dist/lib/events.d.ts.map +1 -1
  224. package/dist/lib/image-background.d.ts +8 -0
  225. package/dist/lib/image-background.d.ts.map +1 -0
  226. package/dist/lib/image-variant-plan.d.ts +42 -0
  227. package/dist/lib/image-variant-plan.d.ts.map +1 -0
  228. package/dist/lib/image-variant-plan.js +53 -0
  229. package/dist/lib/index-ops.d.ts.map +1 -1
  230. package/dist/lib/index-ops.js +21 -17
  231. package/dist/lib/index.d.ts +7 -4
  232. package/dist/lib/index.d.ts.map +1 -1
  233. package/dist/lib/index.js +55 -26
  234. package/dist/lib/loader.d.ts +25 -12
  235. package/dist/lib/loader.d.ts.map +1 -1
  236. package/dist/lib/media-ops.d.ts +73 -0
  237. package/dist/lib/media-ops.d.ts.map +1 -0
  238. package/dist/lib/media-ops.js +60 -0
  239. package/dist/lib/nav-tree.d.ts +7 -0
  240. package/dist/lib/nav-tree.d.ts.map +1 -1
  241. package/dist/lib/nav.d.ts +38 -0
  242. package/dist/lib/nav.d.ts.map +1 -1
  243. package/dist/lib/pages.d.ts +2 -1
  244. package/dist/lib/pages.d.ts.map +1 -1
  245. package/dist/lib/platform-broker.d.ts +4 -2
  246. package/dist/lib/platform-broker.d.ts.map +1 -1
  247. package/dist/lib/platform-broker.js +21 -13
  248. package/dist/lib/reference-type.d.ts +2 -0
  249. package/dist/lib/reference-type.d.ts.map +1 -0
  250. package/dist/lib/reference-validation.d.ts +31 -0
  251. package/dist/lib/reference-validation.d.ts.map +1 -0
  252. package/dist/lib/reference-validation.js +39 -0
  253. package/dist/lib/references.d.ts +74 -0
  254. package/dist/lib/references.d.ts.map +1 -0
  255. package/dist/lib/registry.d.ts +35 -0
  256. package/dist/lib/registry.d.ts.map +1 -1
  257. package/dist/lib/{safeRedirect.d.ts → safe-redirect.d.ts} +1 -1
  258. package/dist/lib/safe-redirect.d.ts.map +1 -0
  259. package/dist/lib/sidecar-diagnostics.d.ts +20 -0
  260. package/dist/lib/sidecar-diagnostics.d.ts.map +1 -0
  261. package/dist/lib/sidecars.d.ts +118 -0
  262. package/dist/lib/sidecars.d.ts.map +1 -0
  263. package/dist/lib/sidecars.js +23 -0
  264. package/dist/lib/slug.d.ts +2 -0
  265. package/dist/lib/slug.d.ts.map +1 -0
  266. package/dist/lib/storage-tier.d.ts +17 -0
  267. package/dist/lib/storage-tier.d.ts.map +1 -0
  268. package/dist/lib/storage-tier.js +29 -0
  269. package/dist/lib/tags.d.ts +64 -0
  270. package/dist/lib/tags.d.ts.map +1 -0
  271. package/dist/lib/theme-vars.d.ts +9 -0
  272. package/dist/lib/theme-vars.d.ts.map +1 -1
  273. package/dist/media/index.d.ts +1 -1
  274. package/dist/media/index.d.ts.map +1 -1
  275. package/dist/media/index.js +18 -14
  276. package/dist/media/queue.d.ts +2 -0
  277. package/dist/media/queue.d.ts.map +1 -1
  278. package/dist/media/utils.d.ts +2 -0
  279. package/dist/media/utils.d.ts.map +1 -1
  280. package/dist/media/{videoPoster.d.ts → video-poster.d.ts} +1 -1
  281. package/dist/media/video-poster.d.ts.map +1 -0
  282. package/dist/media/worker.d.ts +1 -35
  283. package/dist/media/worker.d.ts.map +1 -1
  284. package/dist/schemas/audience.js +2 -2
  285. package/dist/schemas/index.d.ts +1 -0
  286. package/dist/schemas/index.d.ts.map +1 -1
  287. package/dist/schemas/index.js +25 -13
  288. package/dist/schemas/media.d.ts +4 -0
  289. package/dist/schemas/media.d.ts.map +1 -1
  290. package/dist/schemas/shared.d.ts +26 -0
  291. package/dist/schemas/shared.d.ts.map +1 -1
  292. package/dist/schemas/site-config.d.ts +6 -0
  293. package/dist/schemas/site-config.d.ts.map +1 -1
  294. package/dist/schemas/tags.d.ts +27 -0
  295. package/dist/schemas/tags.d.ts.map +1 -0
  296. package/dist/storage/index.js +2 -1
  297. package/dist/storage/memory.d.ts +21 -0
  298. package/dist/storage/memory.d.ts.map +1 -0
  299. package/dist/storage/memory.js +129 -0
  300. package/dist/storage/types.d.ts +9 -0
  301. package/dist/storage/types.d.ts.map +1 -1
  302. package/dist/types/database.d.ts.map +1 -1
  303. package/package.json +26 -1
  304. package/src/auth/cookies.ts +111 -0
  305. package/src/collab/rebase.ts +29 -9
  306. package/src/components/brandguide/ColorSwatchSettings.tsx +1 -1
  307. package/src/components/brandguide/ColorsEditable.tsx +1 -0
  308. package/src/components/chat/ChatPanel.tsx +2 -3
  309. package/src/components/chat/ChatWidget.tsx +2 -3
  310. package/src/components/docfile/DocFilePane.tsx +4 -12
  311. package/src/components/editor/ChildBlockWrapper.tsx +13 -19
  312. package/src/components/editor/ConflictDialog.tsx +27 -35
  313. package/src/components/editor/DeleteButton.tsx +2 -2
  314. package/src/components/editor/DragHandle.tsx +16 -3
  315. package/src/components/editor/DropEdgeIndicator.tsx +36 -10
  316. package/src/components/editor/InsertButton.tsx +2 -2
  317. package/src/components/editor/NavGroupRow.tsx +43 -14
  318. package/src/components/editor/PagesModal.tsx +99 -26
  319. package/src/components/editor/SectionWrapper.tsx +64 -23
  320. package/src/components/editor/SettingsButton.tsx +2 -2
  321. package/src/components/editor/SettingsForm.tsx +19 -2
  322. package/src/components/editor/StatusIndicator.tsx +4 -4
  323. package/src/components/editor/TagIndicator.tsx +80 -0
  324. package/src/components/primitives/DocumentDropZone.tsx +1 -1
  325. package/src/components/primitives/EditableGrid.tsx +15 -14
  326. package/src/components/primitives/EditableList.tsx +27 -74
  327. package/src/components/primitives/HeadingSection.tsx +5 -2
  328. package/src/components/primitives/ResolvedMedia.tsx +13 -0
  329. package/src/components/primitives/{defineHeadingSection.tsx → define-heading-section.tsx} +1 -0
  330. package/src/components/primitives/index.ts +1 -1
  331. package/src/components/primitives/useEditablePlainText.ts +5 -5
  332. package/src/components/sections/Button/CTAButton.tsx +3 -1
  333. package/src/components/sections/DoDontMedia/DoDontMediaBlock.tsx +4 -4
  334. package/src/components/sections/DoDontMedia/index.tsx +12 -3
  335. package/src/components/sections/IconList/DoDontToggle.tsx +2 -2
  336. package/src/components/sections/IconList/IconList.tsx +70 -37
  337. package/src/components/sections/IconList/IconListSettings.tsx +55 -17
  338. package/src/components/sections/IconList/index.tsx +10 -3
  339. package/src/components/sections/LinkHeading/index.tsx +1 -1
  340. package/src/components/sections/Media/MediaBlock.tsx +13 -2
  341. package/src/components/sections/Media/index.tsx +12 -4
  342. package/src/components/sections/Reference/ReferenceList.tsx +214 -0
  343. package/src/components/sections/Reference/ReferenceSettings.tsx +159 -0
  344. package/src/components/sections/Reference/index.tsx +47 -0
  345. package/src/components/sections/SectionSummary/SectionSummaryBlock.tsx +476 -0
  346. package/src/components/sections/SectionSummary/SectionSummarySettings.tsx +126 -0
  347. package/src/components/sections/SectionSummary/index.tsx +149 -0
  348. package/src/components/sections/SubHeading/index.tsx +1 -1
  349. package/src/components/sections/SubSubHeading/index.tsx +1 -1
  350. package/src/components/sections/brand-guide.ts +4 -3
  351. package/src/components/sections/core-sections.ts +2 -0
  352. package/src/components/shared/BrandSwatchesContext.ts +13 -0
  353. package/src/components/shared/Button.tsx +47 -34
  354. package/src/components/shared/Checkbox.tsx +21 -12
  355. package/src/components/shared/ConfirmDialog.tsx +87 -0
  356. package/src/components/shared/ConfirmInline.tsx +90 -0
  357. package/src/components/shared/ErrorBoundary.tsx +6 -18
  358. package/src/components/shared/Fab.tsx +15 -5
  359. package/src/components/shared/FabStack.tsx +28 -0
  360. package/src/components/shared/HistoryChangesModal.tsx +43 -41
  361. package/src/components/shared/HistoryPopover.tsx +7 -20
  362. package/src/components/shared/ImageBackgroundField.tsx +92 -0
  363. package/src/components/shared/{UploadRejectionAlert.tsx → InlineAlert.tsx} +21 -5
  364. package/src/components/shared/Input.tsx +23 -7
  365. package/src/components/shared/Navigation.tsx +22 -17
  366. package/src/components/shared/Notice.tsx +59 -0
  367. package/src/components/shared/Popover.tsx +7 -11
  368. package/src/components/shared/ReferenceSourcesContext.ts +27 -0
  369. package/src/components/shared/Select.tsx +5 -2
  370. package/src/components/shared/SplitButton.tsx +11 -17
  371. package/src/components/shared/SummaryAnchorsContext.ts +11 -0
  372. package/src/components/shared/Textarea.tsx +17 -2
  373. package/src/components/shared/ToolbarFrame.tsx +28 -0
  374. package/src/components/shared/VideoSourceField.tsx +1 -1
  375. package/src/components/shared/copy.ts +18 -0
  376. package/src/components/shared/icons.tsx +1 -17
  377. package/src/components/shell/AudienceAddForm.tsx +2 -2
  378. package/src/components/shell/AudienceDetailsPanel.tsx +23 -5
  379. package/src/components/shell/AudienceRow.tsx +22 -15
  380. package/src/components/shell/BugReportFAB.tsx +50 -40
  381. package/src/components/shell/CredentialList.tsx +33 -13
  382. package/src/components/shell/DocInspector.tsx +3 -12
  383. package/src/components/shell/DocumentEditorOverlay.tsx +33 -23
  384. package/src/components/shell/EditorContext.tsx +7 -0
  385. package/src/components/shell/EditorLoginForm.tsx +26 -36
  386. package/src/components/shell/EditorModal.tsx +8 -10
  387. package/src/components/shell/EditorShell.tsx +501 -338
  388. package/src/components/shell/HistoryToolbar.tsx +24 -26
  389. package/src/components/shell/MediaFolderTile.tsx +8 -3
  390. package/src/components/shell/MediaLibraryModal.tsx +59 -60
  391. package/src/components/shell/ProcessingIndicator.tsx +2 -2
  392. package/src/components/shell/RestoreModal.tsx +17 -16
  393. package/src/components/shell/SetPasswordForm.tsx +3 -3
  394. package/src/components/shell/SiteSettingsChatbot.tsx +61 -42
  395. package/src/components/shell/SiteSettingsDisplay.tsx +10 -20
  396. package/src/components/shell/SiteSettingsModal.tsx +24 -2
  397. package/src/components/shell/SiteSettingsTags.tsx +143 -0
  398. package/src/components/shell/SiteSettingsUsers.tsx +36 -26
  399. package/src/components/shell/SiteSettingsViewerAccess.tsx +2 -2
  400. package/src/components/shell/ViewerLoginForm.tsx +5 -4
  401. package/src/components/shell/reference-sources.ts +36 -0
  402. package/src/deck/index.ts +2 -2
  403. package/src/document/index.ts +2 -2
  404. package/src/hooks/useBlockDnd.ts +11 -0
  405. package/src/hooks/useBuildStatus.ts +53 -6
  406. package/src/hooks/useDocumentUploads.ts +1 -1
  407. package/src/hooks/useEditorPersistence.ts +141 -35
  408. package/src/hooks/useEditorPublish.ts +27 -31
  409. package/src/hooks/useMediaPipeline.ts +30 -24
  410. package/src/hooks/useNotice.ts +45 -0
  411. package/src/hooks/useSortableNavRow.ts +11 -0
  412. package/src/hooks/useSortableRow.ts +22 -2
  413. package/src/hooks/useStackedEscape.ts +62 -0
  414. package/src/lib/block-dnd.ts +6 -1
  415. package/src/lib/block-move.ts +3 -0
  416. package/src/lib/brand-swatches.ts +32 -0
  417. package/src/lib/container-ops.ts +5 -3
  418. package/src/lib/dexie.ts +24 -2
  419. package/src/lib/env.ts +9 -0
  420. package/src/lib/events.ts +1 -2
  421. package/src/lib/image-background.ts +31 -0
  422. package/src/lib/image-variant-plan.ts +92 -0
  423. package/src/lib/index-ops.ts +9 -18
  424. package/src/lib/index.ts +20 -4
  425. package/src/lib/loader.ts +28 -88
  426. package/src/lib/media-ops.ts +112 -0
  427. package/src/lib/nav-tree.ts +104 -4
  428. package/src/lib/nav.ts +196 -36
  429. package/src/lib/pages.ts +2 -3
  430. package/src/lib/platform-broker.ts +32 -14
  431. package/src/lib/reference-type.ts +3 -0
  432. package/src/lib/reference-validation.ts +69 -0
  433. package/src/lib/references.ts +130 -0
  434. package/src/lib/registry.ts +37 -0
  435. package/src/lib/sidecar-diagnostics.ts +29 -0
  436. package/src/lib/sidecars.ts +221 -0
  437. package/src/lib/slug.ts +6 -0
  438. package/src/lib/storage-tier.ts +38 -0
  439. package/src/lib/tags.ts +165 -0
  440. package/src/lib/theme-vars.ts +23 -0
  441. package/src/media/index.ts +1 -1
  442. package/src/media/queue.ts +3 -0
  443. package/src/media/utils.ts +19 -1
  444. package/src/media/{videoPoster.ts → video-poster.ts} +2 -2
  445. package/src/media/worker.ts +17 -8
  446. package/src/schemas/index.ts +1 -0
  447. package/src/schemas/media.ts +7 -2
  448. package/src/schemas/shared.ts +24 -1
  449. package/src/schemas/site-config.ts +6 -1
  450. package/src/schemas/tags.ts +33 -0
  451. package/src/storage/memory.ts +178 -0
  452. package/src/storage/types.ts +16 -3
  453. package/src/types/database.ts +2 -0
  454. package/dist/chunk-DNY72JZN.js +0 -86
  455. package/dist/chunk-F2LYQPXV.js +0 -77
  456. package/dist/chunk-JH762VUH.js +0 -128
  457. package/dist/chunk-K7DYZXVU.js +0 -138
  458. package/dist/components/primitives/defineHeadingSection.d.ts.map +0 -1
  459. package/dist/components/primitives/gridDrop.d.ts.map +0 -1
  460. package/dist/components/shared/UploadRejectionAlert.d.ts.map +0 -1
  461. package/dist/components/shell/BuildStatusIndicator.d.ts +0 -7
  462. package/dist/components/shell/BuildStatusIndicator.d.ts.map +0 -1
  463. package/dist/components/shell/blockMoveDispatch.d.ts.map +0 -1
  464. package/dist/hooks/index.d.ts +0 -9
  465. package/dist/hooks/index.d.ts.map +0 -1
  466. package/dist/lib/grid.d.ts +0 -2
  467. package/dist/lib/grid.d.ts.map +0 -1
  468. package/dist/lib/safeRedirect.d.ts.map +0 -1
  469. package/dist/media/videoPoster.d.ts.map +0 -1
  470. package/src/components/brandguide/ColorSwatchSettings.d.ts.map +0 -1
  471. package/src/components/brandguide/Colors.d.ts.map +0 -1
  472. package/src/components/primitives/CustomParagraph.d.ts.map +0 -1
  473. package/src/components/primitives/EditableGrid.d.ts.map +0 -1
  474. package/src/components/primitives/EditablePlainText.d.ts.map +0 -1
  475. package/src/components/primitives/EditableRichText.d.ts.map +0 -1
  476. package/src/components/primitives/HeadingSection.d.ts.map +0 -1
  477. package/src/components/primitives/IconPicker.d.ts.map +0 -1
  478. package/src/components/primitives/LinkPopover.d.ts.map +0 -1
  479. package/src/components/primitives/MediaSettingsForms.d.ts.map +0 -1
  480. package/src/components/primitives/ResolvedMedia.d.ts.map +0 -1
  481. package/src/components/primitives/RichTextToolbar.d.ts.map +0 -1
  482. package/src/components/primitives/tiptap-presets.d.ts.map +0 -1
  483. package/src/components/primitives/useEditableCollection.d.ts.map +0 -1
  484. package/src/components/primitives/useEditablePlainText.d.ts.map +0 -1
  485. package/src/components/primitives/useEditableRichText.d.ts.map +0 -1
  486. package/src/components/sections/Button/CTAButton.d.ts.map +0 -1
  487. package/src/components/sections/Button/index.d.ts.map +0 -1
  488. package/src/components/sections/Colors/index.d.ts.map +0 -1
  489. package/src/components/sections/IconList/IconList.d.ts.map +0 -1
  490. package/src/components/sections/IconList/IconListSettings.d.ts.map +0 -1
  491. package/src/components/sections/IconList/index.d.ts.map +0 -1
  492. package/src/components/sections/LinkHeading/index.d.ts.map +0 -1
  493. package/src/components/sections/Prose/Prose.d.ts.map +0 -1
  494. package/src/components/sections/Prose/index.d.ts.map +0 -1
  495. package/src/components/sections/SubHeading/index.d.ts.map +0 -1
  496. package/src/components/sections/SubSubHeading/index.d.ts.map +0 -1
  497. package/src/components/sections/register-schemas.d.ts.map +0 -1
  498. package/src/components/shared/Button.d.ts.map +0 -1
  499. package/src/components/shared/Checkbox.d.ts.map +0 -1
  500. package/src/components/shared/FormLabel.d.ts.map +0 -1
  501. package/src/components/shared/IconButton.d.ts.map +0 -1
  502. package/src/components/shared/Input.d.ts.map +0 -1
  503. package/src/components/shared/Select.d.ts.map +0 -1
  504. package/src/components/shared/icons.d.ts.map +0 -1
  505. package/src/components/shell/BuildStatusIndicator.tsx +0 -59
  506. package/src/components/shell/MediaLibraryContext.d.ts.map +0 -1
  507. package/src/hooks/index.ts +0 -8
  508. package/src/hooks/useResolvedMedia.d.ts.map +0 -1
  509. package/src/lib/cn.d.ts.map +0 -1
  510. package/src/lib/grid.d.ts.map +0 -1
  511. package/src/lib/grid.ts +0 -7
  512. package/src/lib/icons.d.ts.map +0 -1
  513. package/src/lib/loader.d.ts.map +0 -1
  514. package/src/lib/nav.d.ts.map +0 -1
  515. package/src/lib/registry.d.ts.map +0 -1
  516. package/src/lib/sanitize.d.ts.map +0 -1
  517. package/src/media/github.d.ts.map +0 -1
  518. package/src/media/index.d.ts.map +0 -1
  519. package/src/media/queue.d.ts.map +0 -1
  520. package/src/media/resolve.d.ts.map +0 -1
  521. package/src/media/types.d.ts.map +0 -1
  522. package/src/media/utils.d.ts.map +0 -1
  523. package/src/media/videoPoster.d.ts.map +0 -1
  524. package/src/schemas/auth.d.ts.map +0 -1
  525. package/src/schemas/media-grid-options.d.ts.map +0 -1
  526. package/src/schemas/media.d.ts.map +0 -1
  527. package/src/schemas/sections.d.ts.map +0 -1
  528. package/src/schemas/shared.d.ts.map +0 -1
  529. package/src/schemas/site-config.d.ts.map +0 -1
  530. /package/dist/{chunk-B7VBSE5X.js → chunk-3JDTXOIG.js} +0 -0
  531. /package/dist/{chunk-CXZ5YJG4.js → chunk-L45X7DKX.js} +0 -0
  532. /package/src/components/primitives/{gridDrop.ts → grid-drop.ts} +0 -0
  533. /package/src/components/shell/{blockMoveDispatch.ts → block-move-dispatch.ts} +0 -0
  534. /package/src/lib/{safeRedirect.ts → safe-redirect.ts} +0 -0
@@ -66,7 +66,7 @@ export default function ColorSwatchSettings({ color, onChange }: Props) {
66
66
  />
67
67
  ))}
68
68
  {!hasAnyValue(localColor) && (
69
- <p role="alert" className="mt-1 text-xs text-red-600">
69
+ <p role="alert" className="mt-1 text-xs text-danger">
70
70
  Enter at least one value — this color won&rsquo;t be saved until you do.
71
71
  </p>
72
72
  )}
@@ -71,6 +71,7 @@ export default function ColorsEditable({
71
71
  {collapsing && (
72
72
  <button
73
73
  onClick={() => setExpanded(!expanded)}
74
+ aria-expanded={expanded}
74
75
  className="cursor-pointer ml-auto flex items-center gap-1.5 text-sm text-base-contrast-light hover:text-base-contrast"
75
76
  >
76
77
  <span>{expanded ? "Hide Details" : "Show Details"}</span>
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useRef, useState, type MouseEvent } from "react";
2
- import { ArrowDown, ChevronDown, ChevronRight, History, Pin, PinOff, SquarePen, Trash2 } from "lucide-react";
2
+ import { ArrowDown, ChevronDown, ChevronRight, History, Pin, PinOff, SquarePen, Trash2, X } from "lucide-react";
3
3
  import { cn } from "../../lib/cn";
4
4
  import { ensureSanitizer } from "../../lib/sanitize";
5
5
  import { assistantHtml, MD_STYLES, USER_BUBBLE_CLASS } from "./markdown";
@@ -9,7 +9,6 @@ import { lockBodyScroll } from "../../lib/scroll-lock";
9
9
  import { loadHistory, upsertConversation, setConversationPinned, removeConversation, type StoredConversation } from "./chat-history";
10
10
  import { Select } from "../shared/Select";
11
11
  import { IconButton } from "../shared/IconButton";
12
- import { RemoveIcon } from "../shared/icons";
13
12
 
14
13
  export interface ChatMessage { role: "user" | "assistant"; content: string }
15
14
 
@@ -506,7 +505,7 @@ export default function ChatPanel({ open, closing, animateEnter, onClose, siteNa
506
505
  <IconButton icon={<SquarePen size={16} />} label="New conversation" onClick={clearConversation} className="rounded-inner hover:bg-base-accent" />
507
506
  )}
508
507
  <IconButton
509
- icon={mode === "docked" ? <ChevronRight size={18} /> : mode === "sheet" ? <ChevronDown size={18} /> : <RemoveIcon size={18} />}
508
+ icon={mode === "docked" ? <ChevronRight size={18} /> : mode === "sheet" ? <ChevronDown size={18} /> : <X size={18} />}
510
509
  label={mode === "docked" ? "Hide chat" : "Close chat"}
511
510
  onClick={onClose}
512
511
  className="rounded-inner hover:bg-base-accent"
@@ -17,6 +17,7 @@
17
17
  // bottom-16, bug report at bottom-28 above it), aligned to the content edge
18
18
  // via fab-container-right like its neighbors.
19
19
  import { lazy, Suspense, useEffect, useRef, useState } from "react";
20
+ import { MessageCircle } from "lucide-react";
20
21
  import Fab from "../shared/Fab";
21
22
 
22
23
  const ChatPanel = lazy(() => import("./ChatPanel"));
@@ -163,9 +164,7 @@ export default function ChatWidget({ siteName, botName, thinkingPhrases, tasks,
163
164
  aria-expanded={open}
164
165
  onClick={() => { setUserOpened(true); if (open) closePanel(); else openPanel(); }}
165
166
  >
166
- <svg xmlns="http://www.w3.org/2000/svg" className={variant === "editor" ? "h-5 w-5" : "h-6 w-6"} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
167
- <path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z" />
168
- </svg>
167
+ <MessageCircle className={variant === "editor" ? "h-5 w-5" : "h-6 w-6"} aria-hidden="true" />
169
168
  </Fab>
170
169
  {everOpened && (
171
170
  <Suspense fallback={null}>
@@ -9,6 +9,7 @@ import {
9
9
  ZoomOut,
10
10
  } from "lucide-react";
11
11
  import { useInitialFocus } from "../../hooks/useFocusTrap";
12
+ import { useStackedEscape } from "../../hooks/useStackedEscape";
12
13
  import type { SiteDocument } from "../../lib/documents";
13
14
  import { documentFileUrl } from "../../schemas/documents";
14
15
  import { lockBodyScroll } from "../../lib/scroll-lock";
@@ -59,18 +60,9 @@ export default function DocFilePane({
59
60
  // initial focus only, not a trap.
60
61
  useInitialFocus(paneRef, true);
61
62
 
62
- useEffect(() => {
63
- const onKey = (e: KeyboardEvent) => {
64
- if (e.key !== "Escape") return;
65
- // A modal opened on top of the pane owns Escape. Without this one keypress
66
- // dismissed both — the same stacking rule Popover applies.
67
- if (document.querySelector("[data-modal-layer]")) return;
68
- e.preventDefault();
69
- onClose();
70
- };
71
- window.addEventListener("keydown", onKey);
72
- return () => window.removeEventListener("keydown", onKey);
73
- }, [onClose]);
63
+ // A modal opened on top of the pane owns Escape. Without this one keypress
64
+ // dismissed both — the same stacking rule Popover applies.
65
+ useStackedEscape(onClose, { enabled: true });
74
66
 
75
67
  useEffect(() => {
76
68
  setState("loading");
@@ -3,6 +3,7 @@ import type { Edge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge
3
3
  import { CopyPlus } from "lucide-react";
4
4
  import { DragHandle } from "./DragHandle";
5
5
  import { DeleteButton } from "./DeleteButton";
6
+ import { DropEdgeIndicator } from "./DropEdgeIndicator";
6
7
  import { SettingsButton } from "./SettingsButton";
7
8
  import { ColSpanControl } from "./ColSpanControl";
8
9
  import { Tooltip, Kbd } from "../shared/Tooltip";
@@ -96,25 +97,18 @@ export const ChildBlockWrapper = forwardRef<HTMLDivElement, ChildBlockWrapperPro
96
97
  </Tooltip>
97
98
  </div>
98
99
 
99
- {/* Drop-edge indicators */}
100
- {closestEdge === "left" && (
101
- <div
102
- data-drop-edge="left"
103
- className="absolute bottom-0 left-0 top-0 z-10 w-0.5 -translate-x-1 bg-primary"
104
- />
105
- )}
106
- {closestEdge === "right" && (
107
- <div
108
- data-drop-edge="right"
109
- className="absolute bottom-0 right-0 top-0 z-10 w-0.5 translate-x-1 bg-primary"
110
- />
111
- )}
112
- {closestEdge === "top" && (
113
- <div data-drop-edge="top" className="absolute left-0 right-0 top-0 z-10 h-0.5 -translate-y-1 bg-primary" />
114
- )}
115
- {closestEdge === "bottom" && (
116
- <div data-drop-edge="bottom" className="absolute left-0 right-0 bottom-0 z-10 h-0.5 translate-y-1 bg-primary" />
117
- )}
100
+ {/* Drop-edge indicators. Left/right match DropEdgeIndicator's default
101
+ gutter (translate-x-1); top/bottom need a wider one (translate-y-1
102
+ vs the default's 50%-of-line-height), so those two go through the
103
+ `style` escape hatch. */}
104
+ <DropEdgeIndicator
105
+ edge={closestEdge}
106
+ style={
107
+ closestEdge === "top" ? { transform: "translateY(-0.25rem)" }
108
+ : closestEdge === "bottom" ? { transform: "translateY(0.25rem)" }
109
+ : undefined
110
+ }
111
+ />
118
112
 
119
113
  {children}
120
114
  </div>
@@ -1,6 +1,7 @@
1
- import { useRef, useState } from "react";
1
+ import { useState } from "react";
2
2
  import { Button } from "../shared/Button";
3
- import { useFocusTrap } from "../../hooks/useFocusTrap";
3
+ import { SegmentedControl } from "../shared/SegmentedControl";
4
+ import { EditorModal } from "../shell/EditorModal";
4
5
 
5
6
  export interface ConflictItem {
6
7
  sectionId: string;
@@ -22,40 +23,31 @@ export function ConflictDialog({
22
23
  const [choices, setChoices] = useState<Record<string, "mine" | "theirs">>(
23
24
  Object.fromEntries(conflicts.map((c) => [c.sectionId, "mine" as const])),
24
25
  );
25
- const panelRef = useRef<HTMLDivElement>(null);
26
- useFocusTrap(panelRef, true);
27
26
  return (
28
- <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50" role="dialog" aria-modal="true">
29
- <div ref={panelRef} className="max-w-md rounded-lg bg-base p-6 shadow-xl">
30
- <h2 className="mb-2 text-lg font-semibold text-base-contrast">Section changed by someone else</h2>
31
- <p className="mb-4 text-sm text-base-contrast-light">
32
- These sections were changed remotely while you edited them. Choose which version to keep — the other is safely stored locally.
33
- </p>
34
- <ul className="mb-4 space-y-2">
35
- {conflicts.map((c) => (
36
- <li key={c.sectionId} className="flex items-center justify-between gap-4 text-sm">
37
- <span className="font-medium text-base-contrast">{c.label}</span>
38
- <span className="flex gap-1">
39
- {(["mine", "theirs"] as const).map((side) => (
40
- <button
41
- key={side}
42
- type="button"
43
- onClick={() => setChoices((prev) => ({ ...prev, [c.sectionId]: side }))}
44
- className={choices[c.sectionId] === side
45
- ? "rounded bg-primary px-2 py-1 text-primary-contrast"
46
- : "rounded border border-base-200 px-2 py-1 text-base-contrast hover:bg-base-accent"}
47
- >
48
- {side === "mine" ? "Keep mine" : "Take theirs"}
49
- </button>
50
- ))}
51
- </span>
52
- </li>
53
- ))}
54
- </ul>
55
- <div className="flex justify-end">
56
- <Button variant="primary" size="md" onClick={() => onResolve(choices)}>Continue</Button>
57
- </div>
27
+ <EditorModal isOpen onClose={() => {}} blocking size="standard" title="Section changed by someone else">
28
+ <p className="mb-4 text-sm text-base-contrast-light">
29
+ These sections were changed remotely while you edited them. Choose which version to keep — the other is safely stored locally.
30
+ </p>
31
+ <ul className="mb-4 space-y-2">
32
+ {conflicts.map((c) => (
33
+ <li key={c.sectionId} className="flex items-center justify-between gap-4 text-sm">
34
+ <span className="font-medium text-base-contrast">{c.label}</span>
35
+ <SegmentedControl
36
+ options={[
37
+ { value: "mine", label: "Keep mine" },
38
+ { value: "theirs", label: "Take theirs" },
39
+ ]}
40
+ value={choices[c.sectionId]}
41
+ onChange={(value) =>
42
+ setChoices((prev) => ({ ...prev, [c.sectionId]: value as "mine" | "theirs" }))
43
+ }
44
+ />
45
+ </li>
46
+ ))}
47
+ </ul>
48
+ <div className="flex justify-end">
49
+ <Button variant="primary" size="md" onClick={() => onResolve(choices)}>Continue</Button>
58
50
  </div>
59
- </div>
51
+ </EditorModal>
60
52
  );
61
53
  }
@@ -1,4 +1,4 @@
1
- import { DeleteIcon } from "../shared/icons";
1
+ import { Trash2 } from "lucide-react";
2
2
  import { IconButton } from "../shared/IconButton";
3
3
 
4
4
  interface DeleteButtonProps {
@@ -8,7 +8,7 @@ interface DeleteButtonProps {
8
8
  export function DeleteButton({ onDelete }: DeleteButtonProps) {
9
9
  return (
10
10
  <IconButton
11
- icon={<DeleteIcon size={16} />}
11
+ icon={<Trash2 size={16} />}
12
12
  label="Delete section"
13
13
  intent="destructive"
14
14
  onClick={onDelete}
@@ -3,8 +3,20 @@ import { DragHandle as DragHandleIcon } from "../shared/icons";
3
3
  import { IconButton } from "../shared/IconButton";
4
4
  import { Tooltip, Kbd } from "../shared/Tooltip";
5
5
 
6
- export const DragHandle = forwardRef<HTMLButtonElement, { tooltipSide?: "bottom" | "right" }>(function DragHandle(
7
- { tooltipSide },
6
+ interface DragHandleProps {
7
+ tooltipSide?: "bottom" | "right";
8
+ /**
9
+ * Set by callers offering a keyboard alternative (SectionWrapper's Move
10
+ * up/down buttons) so the handle itself is reachable by keyboard and its
11
+ * `aria-describedby` hint announces the alternative. Callers with no
12
+ * keyboard alternative leave this at the default -1 (drag-only, mouse/touch).
13
+ */
14
+ tabIndex?: number;
15
+ "aria-describedby"?: string;
16
+ }
17
+
18
+ export const DragHandle = forwardRef<HTMLButtonElement, DragHandleProps>(function DragHandle(
19
+ { tooltipSide, tabIndex = -1, "aria-describedby": ariaDescribedBy },
8
20
  ref,
9
21
  ) {
10
22
  return (
@@ -14,7 +26,8 @@ export const DragHandle = forwardRef<HTMLButtonElement, { tooltipSide?: "bottom"
14
26
  icon={<DragHandleIcon size={18} />}
15
27
  label="Drag to reorder section"
16
28
  className="pointer-events-auto cursor-grab active:cursor-grabbing rounded-md text-base-contrast-light/80 hover:bg-base-contrast-light/10 hover:text-base-contrast"
17
- tabIndex={-1}
29
+ tabIndex={tabIndex}
30
+ aria-describedby={ariaDescribedBy}
18
31
  />
19
32
  </Tooltip>
20
33
  );
@@ -1,20 +1,46 @@
1
+ import type { CSSProperties } from "react";
2
+ import { cn } from "../../lib/cn";
3
+
1
4
  /**
2
- * The horizontal insertion line shown at the top or bottom edge of a row during
3
- * a closest-edge drag-to-reorder, paired with `useSortableRow`'s `closestEdge`.
5
+ * The insertion line shown at an edge of a row/cell during a closest-edge
6
+ * drag-to-reorder, paired with `useSortableRow`'s (or `useSortableNavRow`'s)
7
+ * `closestEdge`. `top`/`bottom` render a horizontal line spanning the row;
8
+ * `left`/`right` render a vertical one spanning its height.
4
9
  *
5
- * `inset` starts the line at the nested-row indent, which is the ONLY thing
6
- * distinguishing "drop inside this group" from "drop before this group" — and
10
+ * `inset` starts a horizontal line at the nested-row indent — the ONLY thing
11
+ * distinguishing "drop inside this group" from "drop before this group", and
7
12
  * a group's last member slot from the top-level slot that follows it.
13
+ *
14
+ * `style` is the escape hatch for a caller whose perpendicular offset differs
15
+ * from the default (a wider cell gutter, a caller-specific `top`) — it wins
16
+ * over the default Tailwind transform/position via normal inline-style
17
+ * precedence, so callers only need to override the property that differs.
8
18
  */
9
- export function DropEdgeIndicator({ edge, inset = false }: { edge: "top" | "bottom" | null; inset?: boolean }) {
19
+ export function DropEdgeIndicator({
20
+ edge,
21
+ inset = false,
22
+ style,
23
+ }: {
24
+ edge: "top" | "bottom" | "left" | "right" | null;
25
+ inset?: boolean;
26
+ style?: CSSProperties;
27
+ }) {
10
28
  if (!edge) return null;
29
+ const horizontal = edge === "top" || edge === "bottom";
11
30
  return (
12
31
  <div
13
- className={[
14
- "absolute right-0 z-10 h-0.5 bg-primary",
15
- inset ? "left-6" : "left-0",
16
- edge === "top" ? "top-0 -translate-y-1/2" : "bottom-0 translate-y-1/2",
17
- ].join(" ")}
32
+ data-drop-edge={edge}
33
+ className={cn(
34
+ "absolute z-10 bg-primary",
35
+ horizontal
36
+ ? cn("right-0 h-0.5", inset ? "left-6" : "left-0")
37
+ : "top-0 bottom-0 w-0.5",
38
+ edge === "top" && "top-0 -translate-y-1/2",
39
+ edge === "bottom" && "bottom-0 translate-y-1/2",
40
+ edge === "left" && "left-0 -translate-x-1",
41
+ edge === "right" && "right-0 translate-x-1",
42
+ )}
43
+ style={style}
18
44
  />
19
45
  );
20
46
  }
@@ -1,4 +1,4 @@
1
- import { AddIcon } from "../shared/icons";
1
+ import { Plus } from "lucide-react";
2
2
  import { IconButton } from "../shared/IconButton";
3
3
  import { Tooltip, Kbd } from "../shared/Tooltip";
4
4
 
@@ -11,7 +11,7 @@ export function InsertButton({ index, onInsert }: InsertButtonProps) {
11
11
  return (
12
12
  <Tooltip content={<><Kbd>Click</Kbd> to add below<br /><Kbd>Alt+Click</Kbd> to add above</>}>
13
13
  <IconButton
14
- icon={<AddIcon size={18} />}
14
+ icon={<Plus size={18} />}
15
15
  label="Add section"
16
16
  className="pointer-events-auto rounded-md text-base-contrast-light/80 hover:bg-base-contrast-light/10 hover:text-base-contrast"
17
17
  tabIndex={-1}
@@ -1,11 +1,13 @@
1
- import { useEffect, useState } from "react";
2
- import { ChevronDown } from "lucide-react";
1
+ import { useEffect, useId, useRef, useState } from "react";
2
+ import { ChevronDown, ChevronUp } from "lucide-react";
3
3
  import type { NavGroupEntry } from "../../schemas/nav";
4
4
  import type { NavLocation } from "../../lib/nav-tree";
5
5
  import { groupDisplayLabel } from "../../lib/nav-tree";
6
6
  import { pluralize } from "../../lib/text";
7
7
  import { cn } from "../../lib/cn";
8
8
  import { Button } from "../shared/Button";
9
+ import { ConfirmInline } from "../shared/ConfirmInline";
10
+ import { IconButton } from "../shared/IconButton";
9
11
  import { Input } from "../shared/Input";
10
12
  import { Toggle } from "../shared/Toggle";
11
13
  import { DragHandle } from "./DragHandle";
@@ -15,6 +17,9 @@ import { useSortableNavRow } from "../../hooks/useSortableNavRow";
15
17
  interface Props {
16
18
  group: NavGroupEntry;
17
19
  entryIndex: number;
20
+ /** Total top-level entries — groups move among these only (never into a
21
+ * group, unlike a page). */
22
+ entryCount: number;
18
23
  memberCount: number;
19
24
  /** Opens the settings panel on mount. The `+ Add group` flow sets this so a
20
25
  * brand-new group lands with its label input focused. */
@@ -35,17 +40,21 @@ interface Props {
35
40
  }
36
41
 
37
42
  export function NavGroupRow({
38
- group, entryIndex, memberCount, autoOpenSettings = false,
43
+ group, entryIndex, entryCount, memberCount, autoOpenSettings = false,
39
44
  onRename, onSetStartCollapsed, onDelete, onMove, onDragStateChange,
40
45
  }: Props) {
41
46
  const [settingsOpen, setSettingsOpen] = useState(autoOpenSettings);
42
47
  const [confirmingDelete, setConfirmingDelete] = useState(false);
43
48
  const [showError, setShowError] = useState(false);
49
+ const deleteButtonRef = useRef<HTMLButtonElement>(null);
44
50
 
45
51
  const { rowRef, handleRef, isDragging, closestEdge } = useSortableNavRow<HTMLDivElement, HTMLButtonElement>({
46
52
  row: { kind: "group", groupId: group.id, index: entryIndex },
47
53
  entryIndex, kind: "group", onMove,
48
54
  });
55
+ const dragHintId = useId();
56
+ const moveTo = (delta: 1 | -1) =>
57
+ onMove({ groupId: null, index: entryIndex }, { groupId: null, index: entryIndex + delta });
49
58
 
50
59
  // Surface the hook's drag state upward so the modal can collapse this group
51
60
  // while it is the one being dragged.
@@ -65,8 +74,27 @@ export function NavGroupRow({
65
74
  return (
66
75
  <div ref={rowRef} data-testid={`nav-row-group-${group.id}`} className={cn("relative flex items-start gap-1", isDragging && "opacity-50")}>
67
76
  <DropEdgeIndicator edge={closestEdge} />
68
- <div className="flex shrink-0 items-center py-2 [&_[role=tooltip]]:hidden">
69
- <DragHandle ref={handleRef} />
77
+ <div className="flex shrink-0 items-center gap-1 py-2 [&_[role=tooltip]]:hidden">
78
+ <DragHandle ref={handleRef} tabIndex={0} aria-describedby={dragHintId} />
79
+ <div className="flex flex-col">
80
+ <IconButton
81
+ icon={<ChevronUp size={12} />}
82
+ label="Move up"
83
+ size="sm"
84
+ disabled={entryIndex === 0}
85
+ onClick={() => moveTo(-1)}
86
+ />
87
+ <IconButton
88
+ icon={<ChevronDown size={12} />}
89
+ label="Move down"
90
+ size="sm"
91
+ disabled={entryIndex === entryCount - 1}
92
+ onClick={() => moveTo(1)}
93
+ />
94
+ </div>
95
+ <span id={dragHintId} className="sr-only">
96
+ Use Move up / Move down to reorder with the keyboard.
97
+ </span>
70
98
  </div>
71
99
  <div className="min-w-0 flex-1 rounded-md border border-base-200 bg-base">
72
100
  <div className="flex items-center">
@@ -106,17 +134,18 @@ export function NavGroupRow({
106
134
  </div>
107
135
 
108
136
  {confirmingDelete ? (
109
- <div className="flex flex-col gap-2 rounded-inner border border-base-200 p-3">
110
- <p className="text-sm text-base-contrast">
111
- Delete this group? {pluralize(memberCount, "page")} will move to the top level.
112
- </p>
113
- <div className="flex justify-end gap-2">
114
- <Button variant="secondary" size="sm" onClick={() => setConfirmingDelete(false)}>Cancel</Button>
115
- <Button variant="destructive" size="sm" aria-label="Confirm delete" onClick={onDelete}>Delete</Button>
116
- </div>
117
- </div>
137
+ <ConfirmInline
138
+ message={`Delete this group? ${pluralize(memberCount, "page")} will move to the top level.`}
139
+ confirmLabel="Delete"
140
+ confirmAriaLabel="Confirm delete"
141
+ tone="neutral"
142
+ onConfirm={onDelete}
143
+ onCancel={() => setConfirmingDelete(false)}
144
+ returnFocusTo={deleteButtonRef}
145
+ />
118
146
  ) : (
119
147
  <Button
148
+ ref={deleteButtonRef}
120
149
  variant="destructive" size="sm" aria-label="Delete group" className="self-start"
121
150
  onClick={() => (memberCount === 0 ? onDelete() : setConfirmingDelete(true))}
122
151
  >