@drawnagency/primitives 0.1.113 → 0.1.114
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.
- package/README.md +1 -1
- package/dist/auth/cookies.d.ts +39 -0
- package/dist/auth/cookies.d.ts.map +1 -1
- package/dist/auth/index.js +3 -3
- package/dist/{chunk-GPPVYLEI.js → chunk-45FA7Z55.js} +1 -1
- package/dist/{chunk-REDDTTGJ.js → chunk-4Y2JQQZL.js} +19 -1
- package/dist/chunk-5GFACGSN.js +6 -0
- package/dist/chunk-5KSAS4VY.js +275 -0
- package/dist/{chunk-Z7W3DQTR.js → chunk-7SAAJVDE.js} +408 -28
- package/dist/{chunk-S2L3BPLS.js → chunk-7SX42OP4.js} +1 -1
- package/dist/{chunk-GGXZZ77Z.js → chunk-AASEGXNT.js} +18 -1
- package/dist/{chunk-WKZ7OENC.js → chunk-BQ5TZZUE.js} +5 -1
- package/dist/chunk-DIMDRBFK.js +11 -0
- package/dist/{chunk-WUJ3XNFI.js → chunk-GGYY3JQJ.js} +19 -24
- package/dist/{chunk-NHN2LSIU.js → chunk-IP2SEBAJ.js} +5 -1
- package/dist/{chunk-IINIZBQB.js → chunk-JCDZAFX2.js} +30 -10
- package/dist/chunk-JR24U7FJ.js +120 -0
- package/dist/{chunk-SW6PCQQD.js → chunk-KQA772WQ.js} +2 -1
- package/dist/{chunk-KR2MHTNJ.js → chunk-N3G7DOU3.js} +609 -61
- package/dist/chunk-OAGJBCSH.js +67 -0
- package/dist/{chunk-6BZ2KNTP.js → chunk-PLANHXS7.js} +191 -61
- package/dist/{chunk-VWWY5TL5.js → chunk-PNSCDBU7.js} +38 -56
- package/dist/{chunk-AHALSCQH.js → chunk-PTY2RG2K.js} +1 -1
- package/dist/{chunk-BDFTMGCL.js → chunk-PZPGJZRG.js} +9 -8
- package/dist/{chunk-FRE2CCLV.js → chunk-QHMKIODQ.js} +17 -4
- package/dist/{chunk-HBULBDGP.js → chunk-S37DZPHW.js} +1 -1
- package/dist/{chunk-4I5OO5UB.js → chunk-TEOAKGZA.js} +0 -1
- package/dist/chunk-VUYCRBJK.js +174 -0
- package/dist/{chunk-4RNF2DRG.js → chunk-XDEPXTBY.js} +0 -2
- package/dist/{chunk-DS4GCYV2.js → chunk-Y5QECJX7.js} +223 -16
- package/dist/collab/rebase.d.ts +2 -1
- package/dist/collab/rebase.d.ts.map +1 -1
- package/dist/collab/rebase.js +20 -5
- package/dist/components/brandguide/ColorsEditable.d.ts.map +1 -1
- package/dist/components/chat/ChatPanel.d.ts.map +1 -1
- package/dist/components/chat/ChatWidget.d.ts.map +1 -1
- package/dist/components/docfile/DocFilePane.d.ts.map +1 -1
- package/dist/components/editor/ChildBlockWrapper.d.ts.map +1 -1
- package/dist/components/editor/ConflictDialog.d.ts.map +1 -1
- package/dist/components/editor/DragHandle.d.ts +12 -2
- package/dist/components/editor/DragHandle.d.ts.map +1 -1
- package/dist/components/editor/DropEdgeIndicator.d.ts +15 -6
- package/dist/components/editor/DropEdgeIndicator.d.ts.map +1 -1
- package/dist/components/editor/NavGroupRow.d.ts +4 -1
- package/dist/components/editor/NavGroupRow.d.ts.map +1 -1
- package/dist/components/editor/PagesModal.d.ts.map +1 -1
- package/dist/components/editor/SectionWrapper.d.ts +1 -1
- package/dist/components/editor/SectionWrapper.d.ts.map +1 -1
- package/dist/components/editor/SettingsForm.d.ts.map +1 -1
- package/dist/components/editor/TagIndicator.d.ts +15 -0
- package/dist/components/editor/TagIndicator.d.ts.map +1 -0
- package/dist/components/editor/index.js +148 -77
- package/dist/components/primitives/DocumentDropZone.d.ts +1 -1
- package/dist/components/primitives/EditableGrid.d.ts.map +1 -1
- package/dist/components/primitives/EditableList.d.ts.map +1 -1
- package/dist/components/primitives/HeadingSection.d.ts +4 -1
- package/dist/components/primitives/HeadingSection.d.ts.map +1 -1
- package/dist/components/primitives/ResolvedMedia.d.ts +5 -1
- package/dist/components/primitives/ResolvedMedia.d.ts.map +1 -1
- package/dist/components/primitives/{defineHeadingSection.d.ts → define-heading-section.d.ts} +1 -1
- package/dist/components/primitives/define-heading-section.d.ts.map +1 -0
- package/dist/components/primitives/{gridDrop.d.ts → grid-drop.d.ts} +1 -1
- package/dist/components/primitives/grid-drop.d.ts.map +1 -0
- package/dist/components/primitives/index.d.ts +1 -1
- package/dist/components/primitives/index.d.ts.map +1 -1
- package/dist/components/primitives/index.js +17 -154
- package/dist/components/sections/Button/CTAButton.d.ts.map +1 -1
- package/dist/components/sections/DoDontMedia/DoDontMediaBlock.d.ts +2 -6
- package/dist/components/sections/DoDontMedia/DoDontMediaBlock.d.ts.map +1 -1
- package/dist/components/sections/DoDontMedia/index.d.ts +8 -0
- package/dist/components/sections/DoDontMedia/index.d.ts.map +1 -1
- package/dist/components/sections/IconList/IconList.d.ts +2 -1
- package/dist/components/sections/IconList/IconList.d.ts.map +1 -1
- package/dist/components/sections/IconList/IconListSettings.d.ts +2 -1
- package/dist/components/sections/IconList/IconListSettings.d.ts.map +1 -1
- package/dist/components/sections/IconList/index.d.ts +1 -0
- package/dist/components/sections/IconList/index.d.ts.map +1 -1
- package/dist/components/sections/Media/MediaBlock.d.ts +2 -1
- package/dist/components/sections/Media/MediaBlock.d.ts.map +1 -1
- package/dist/components/sections/Media/index.d.ts +8 -0
- package/dist/components/sections/Media/index.d.ts.map +1 -1
- package/dist/components/sections/Reference/ReferenceList.d.ts +35 -0
- package/dist/components/sections/Reference/ReferenceList.d.ts.map +1 -0
- package/dist/components/sections/Reference/ReferenceSettings.d.ts +12 -0
- package/dist/components/sections/Reference/ReferenceSettings.d.ts.map +1 -0
- package/dist/components/sections/Reference/index.d.ts +9 -0
- package/dist/components/sections/Reference/index.d.ts.map +1 -0
- package/dist/components/sections/SectionSummary/SectionSummaryBlock.d.ts +38 -0
- package/dist/components/sections/SectionSummary/SectionSummaryBlock.d.ts.map +1 -0
- package/dist/components/sections/SectionSummary/SectionSummarySettings.d.ts +20 -0
- package/dist/components/sections/SectionSummary/SectionSummarySettings.d.ts.map +1 -0
- package/dist/components/sections/SectionSummary/index.d.ts +33 -0
- package/dist/components/sections/SectionSummary/index.d.ts.map +1 -0
- package/dist/components/sections/all-sections.d.ts +53 -0
- package/dist/components/sections/all-sections.d.ts.map +1 -1
- package/dist/components/sections/brand-guide.d.ts +41 -2
- package/dist/components/sections/brand-guide.d.ts.map +1 -1
- package/dist/components/sections/brand-guide.js +12 -10
- package/dist/components/sections/core-sections.d.ts +14 -0
- package/dist/components/sections/core-sections.d.ts.map +1 -1
- package/dist/components/sections/register-schemas.js +19 -17
- package/dist/components/sections/register.js +19 -17
- package/dist/components/shared/BrandSwatchesContext.d.ts +9 -0
- package/dist/components/shared/BrandSwatchesContext.d.ts.map +1 -0
- package/dist/components/shared/Button.d.ts +11 -3
- package/dist/components/shared/Button.d.ts.map +1 -1
- package/dist/components/shared/Checkbox.d.ts +6 -0
- package/dist/components/shared/Checkbox.d.ts.map +1 -1
- package/dist/components/shared/ConfirmDialog.d.ts +25 -0
- package/dist/components/shared/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/shared/ConfirmInline.d.ts +25 -0
- package/dist/components/shared/ConfirmInline.d.ts.map +1 -0
- package/dist/components/shared/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/shared/Fab.d.ts +11 -2
- package/dist/components/shared/Fab.d.ts.map +1 -1
- package/dist/components/shared/FabStack.d.ts +22 -0
- package/dist/components/shared/FabStack.d.ts.map +1 -0
- package/dist/components/shared/HistoryChangesModal.d.ts.map +1 -1
- package/dist/components/shared/HistoryPopover.d.ts.map +1 -1
- package/dist/components/shared/ImageBackgroundField.d.ts +9 -0
- package/dist/components/shared/ImageBackgroundField.d.ts.map +1 -0
- package/dist/components/shared/{UploadRejectionAlert.d.ts → InlineAlert.d.ts} +4 -2
- package/dist/components/shared/InlineAlert.d.ts.map +1 -0
- package/dist/components/shared/Input.d.ts +10 -0
- package/dist/components/shared/Input.d.ts.map +1 -1
- package/dist/components/shared/Navigation.d.ts.map +1 -1
- package/dist/components/shared/Notice.d.ts +10 -0
- package/dist/components/shared/Notice.d.ts.map +1 -0
- package/dist/components/shared/Popover.d.ts.map +1 -1
- package/dist/components/shared/ReferenceSourcesContext.d.ts +25 -0
- package/dist/components/shared/ReferenceSourcesContext.d.ts.map +1 -0
- package/dist/components/shared/Select.d.ts +3 -2
- package/dist/components/shared/Select.d.ts.map +1 -1
- package/dist/components/shared/SplitButton.d.ts.map +1 -1
- package/dist/components/shared/SummaryAnchorsContext.d.ts +10 -0
- package/dist/components/shared/SummaryAnchorsContext.d.ts.map +1 -0
- package/dist/components/shared/Textarea.d.ts +7 -0
- package/dist/components/shared/Textarea.d.ts.map +1 -1
- package/dist/components/shared/ToolbarFrame.d.ts +17 -0
- package/dist/components/shared/ToolbarFrame.d.ts.map +1 -0
- package/dist/components/shared/copy.d.ts +13 -0
- package/dist/components/shared/copy.d.ts.map +1 -0
- package/dist/components/shared/icons.d.ts +0 -12
- package/dist/components/shared/icons.d.ts.map +1 -1
- package/dist/components/shell/AudienceDetailsPanel.d.ts +7 -1
- package/dist/components/shell/AudienceDetailsPanel.d.ts.map +1 -1
- package/dist/components/shell/AudienceRow.d.ts.map +1 -1
- package/dist/components/shell/BugReportFAB.d.ts +7 -1
- package/dist/components/shell/BugReportFAB.d.ts.map +1 -1
- package/dist/components/shell/CredentialList.d.ts.map +1 -1
- package/dist/components/shell/DocInspector.d.ts.map +1 -1
- package/dist/components/shell/DocumentEditorOverlay.d.ts.map +1 -1
- package/dist/components/shell/EditorContext.d.ts +4 -0
- package/dist/components/shell/EditorContext.d.ts.map +1 -1
- package/dist/components/shell/EditorLoginForm.d.ts.map +1 -1
- package/dist/components/shell/EditorModal.d.ts.map +1 -1
- package/dist/components/shell/EditorShell.d.ts.map +1 -1
- package/dist/components/shell/HistoryToolbar.d.ts.map +1 -1
- package/dist/components/shell/MediaFolderTile.d.ts +4 -1
- package/dist/components/shell/MediaFolderTile.d.ts.map +1 -1
- package/dist/components/shell/MediaLibraryModal.d.ts.map +1 -1
- package/dist/components/shell/RestoreModal.d.ts.map +1 -1
- package/dist/components/shell/SiteSettingsChatbot.d.ts.map +1 -1
- package/dist/components/shell/SiteSettingsDisplay.d.ts.map +1 -1
- package/dist/components/shell/SiteSettingsModal.d.ts +3 -1
- package/dist/components/shell/SiteSettingsModal.d.ts.map +1 -1
- package/dist/components/shell/SiteSettingsTags.d.ts +13 -0
- package/dist/components/shell/SiteSettingsTags.d.ts.map +1 -0
- package/dist/components/shell/SiteSettingsUsers.d.ts.map +1 -1
- package/dist/components/shell/ViewerLoginForm.d.ts.map +1 -1
- package/dist/components/shell/{blockMoveDispatch.d.ts → block-move-dispatch.d.ts} +1 -1
- package/dist/components/shell/block-move-dispatch.d.ts.map +1 -0
- package/dist/components/shell/reference-sources.d.ts +22 -0
- package/dist/components/shell/reference-sources.d.ts.map +1 -0
- package/dist/deck/index.d.ts +2 -2
- package/dist/deck/index.d.ts.map +1 -1
- package/dist/deck/index.js +1 -3
- package/dist/deck-builder/index.js +11 -18
- package/dist/document/index.d.ts +2 -2
- package/dist/document/index.d.ts.map +1 -1
- package/dist/hooks/useBlockDnd.d.ts +11 -0
- package/dist/hooks/useBlockDnd.d.ts.map +1 -1
- package/dist/hooks/useBuildStatus.d.ts +1 -1
- package/dist/hooks/useBuildStatus.d.ts.map +1 -1
- package/dist/hooks/useDocumentUploads.d.ts +1 -1
- package/dist/hooks/useDocumentUploads.d.ts.map +1 -1
- package/dist/hooks/useEditorPersistence.d.ts +5 -1
- package/dist/hooks/useEditorPersistence.d.ts.map +1 -1
- package/dist/hooks/useEditorPublish.d.ts +2 -2
- package/dist/hooks/useEditorPublish.d.ts.map +1 -1
- package/dist/hooks/useNotice.d.ts +19 -0
- package/dist/hooks/useNotice.d.ts.map +1 -0
- package/dist/hooks/useSortableNavRow.d.ts +11 -0
- package/dist/hooks/useSortableNavRow.d.ts.map +1 -1
- package/dist/hooks/useSortableRow.d.ts +11 -0
- package/dist/hooks/useSortableRow.d.ts.map +1 -1
- package/dist/hooks/useStackedEscape.d.ts +32 -0
- package/dist/hooks/useStackedEscape.d.ts.map +1 -0
- package/dist/index.js +67 -49
- package/dist/lib/audience-secret.js +2 -2
- package/dist/lib/block-dnd.d.ts +5 -0
- package/dist/lib/block-dnd.d.ts.map +1 -1
- package/dist/lib/block-move.d.ts.map +1 -1
- package/dist/lib/brand-swatches.d.ts +12 -0
- package/dist/lib/brand-swatches.d.ts.map +1 -0
- package/dist/lib/container-ops.d.ts +3 -2
- package/dist/lib/container-ops.d.ts.map +1 -1
- package/dist/lib/dexie.d.ts.map +1 -1
- package/dist/lib/dexie.js +9 -1
- package/dist/lib/env.d.ts +4 -0
- package/dist/lib/env.d.ts.map +1 -1
- package/dist/lib/env.js +5 -3
- package/dist/lib/events.d.ts +1 -2
- package/dist/lib/events.d.ts.map +1 -1
- package/dist/lib/image-background.d.ts +8 -0
- package/dist/lib/image-background.d.ts.map +1 -0
- package/dist/lib/index-ops.js +3 -3
- package/dist/lib/index.d.ts +6 -4
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +29 -21
- package/dist/lib/loader.d.ts +21 -7
- package/dist/lib/loader.d.ts.map +1 -1
- package/dist/lib/nav-tree.d.ts +1 -0
- package/dist/lib/nav-tree.d.ts.map +1 -1
- package/dist/lib/nav.d.ts +38 -0
- package/dist/lib/nav.d.ts.map +1 -1
- package/dist/lib/platform-broker.d.ts +4 -2
- package/dist/lib/platform-broker.d.ts.map +1 -1
- package/dist/lib/platform-broker.js +21 -13
- package/dist/lib/reference-type.d.ts +2 -0
- package/dist/lib/reference-type.d.ts.map +1 -0
- package/dist/lib/reference-validation.d.ts +31 -0
- package/dist/lib/reference-validation.d.ts.map +1 -0
- package/dist/lib/reference-validation.js +39 -0
- package/dist/lib/references.d.ts +74 -0
- package/dist/lib/references.d.ts.map +1 -0
- package/dist/lib/registry.d.ts +35 -0
- package/dist/lib/registry.d.ts.map +1 -1
- package/dist/lib/{safeRedirect.d.ts → safe-redirect.d.ts} +1 -1
- package/dist/lib/safe-redirect.d.ts.map +1 -0
- package/dist/lib/tags.d.ts +58 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/theme-vars.d.ts +9 -0
- package/dist/lib/theme-vars.d.ts.map +1 -1
- package/dist/media/index.d.ts +1 -1
- package/dist/media/index.d.ts.map +1 -1
- package/dist/media/index.js +8 -4
- package/dist/media/utils.d.ts +2 -0
- package/dist/media/utils.d.ts.map +1 -1
- package/dist/media/{videoPoster.d.ts → video-poster.d.ts} +1 -1
- package/dist/media/video-poster.d.ts.map +1 -0
- package/dist/schemas/audience.js +2 -2
- package/dist/schemas/index.d.ts +1 -0
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +14 -8
- package/dist/schemas/shared.d.ts +26 -0
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/site-config.d.ts +6 -0
- package/dist/schemas/site-config.d.ts.map +1 -1
- package/dist/schemas/tags.d.ts +27 -0
- package/dist/schemas/tags.d.ts.map +1 -0
- package/dist/storage/index.js +1 -1
- package/dist/types/database.d.ts.map +1 -1
- package/package.json +6 -1
- package/src/auth/cookies.ts +111 -0
- package/src/collab/rebase.ts +26 -2
- package/src/components/brandguide/ColorSwatchSettings.tsx +1 -1
- package/src/components/brandguide/ColorsEditable.tsx +1 -0
- package/src/components/chat/ChatPanel.tsx +2 -3
- package/src/components/chat/ChatWidget.tsx +2 -3
- package/src/components/docfile/DocFilePane.tsx +4 -12
- package/src/components/editor/ChildBlockWrapper.tsx +13 -19
- package/src/components/editor/ConflictDialog.tsx +27 -35
- package/src/components/editor/DeleteButton.tsx +2 -2
- package/src/components/editor/DragHandle.tsx +16 -3
- package/src/components/editor/DropEdgeIndicator.tsx +36 -10
- package/src/components/editor/InsertButton.tsx +2 -2
- package/src/components/editor/NavGroupRow.tsx +43 -14
- package/src/components/editor/PagesModal.tsx +99 -26
- package/src/components/editor/SectionWrapper.tsx +64 -23
- package/src/components/editor/SettingsButton.tsx +2 -2
- package/src/components/editor/SettingsForm.tsx +19 -2
- package/src/components/editor/StatusIndicator.tsx +4 -4
- package/src/components/editor/TagIndicator.tsx +80 -0
- package/src/components/primitives/DocumentDropZone.tsx +1 -1
- package/src/components/primitives/EditableGrid.tsx +15 -14
- package/src/components/primitives/EditableList.tsx +27 -74
- package/src/components/primitives/HeadingSection.tsx +5 -2
- package/src/components/primitives/ResolvedMedia.tsx +13 -0
- package/src/components/primitives/{defineHeadingSection.tsx → define-heading-section.tsx} +1 -0
- package/src/components/primitives/index.ts +1 -1
- package/src/components/primitives/useEditablePlainText.ts +5 -5
- package/src/components/sections/Button/CTAButton.tsx +3 -1
- package/src/components/sections/DoDontMedia/DoDontMediaBlock.tsx +4 -4
- package/src/components/sections/DoDontMedia/index.tsx +12 -3
- package/src/components/sections/IconList/DoDontToggle.tsx +2 -2
- package/src/components/sections/IconList/IconList.tsx +70 -37
- package/src/components/sections/IconList/IconListSettings.tsx +55 -17
- package/src/components/sections/IconList/index.tsx +10 -3
- package/src/components/sections/LinkHeading/index.tsx +1 -1
- package/src/components/sections/Media/MediaBlock.tsx +13 -2
- package/src/components/sections/Media/index.tsx +12 -4
- package/src/components/sections/Reference/ReferenceList.tsx +214 -0
- package/src/components/sections/Reference/ReferenceSettings.tsx +159 -0
- package/src/components/sections/Reference/index.tsx +47 -0
- package/src/components/sections/SectionSummary/SectionSummaryBlock.tsx +476 -0
- package/src/components/sections/SectionSummary/SectionSummarySettings.tsx +126 -0
- package/src/components/sections/SectionSummary/index.tsx +149 -0
- package/src/components/sections/SubHeading/index.tsx +1 -1
- package/src/components/sections/SubSubHeading/index.tsx +1 -1
- package/src/components/sections/brand-guide.ts +4 -3
- package/src/components/sections/core-sections.ts +2 -0
- package/src/components/shared/BrandSwatchesContext.ts +13 -0
- package/src/components/shared/Button.tsx +47 -34
- package/src/components/shared/Checkbox.tsx +21 -12
- package/src/components/shared/ConfirmDialog.tsx +87 -0
- package/src/components/shared/ConfirmInline.tsx +90 -0
- package/src/components/shared/ErrorBoundary.tsx +6 -18
- package/src/components/shared/Fab.tsx +15 -5
- package/src/components/shared/FabStack.tsx +28 -0
- package/src/components/shared/HistoryChangesModal.tsx +43 -41
- package/src/components/shared/HistoryPopover.tsx +7 -20
- package/src/components/shared/ImageBackgroundField.tsx +92 -0
- package/src/components/shared/{UploadRejectionAlert.tsx → InlineAlert.tsx} +21 -5
- package/src/components/shared/Input.tsx +23 -7
- package/src/components/shared/Navigation.tsx +22 -17
- package/src/components/shared/Notice.tsx +59 -0
- package/src/components/shared/Popover.tsx +7 -11
- package/src/components/shared/ReferenceSourcesContext.ts +27 -0
- package/src/components/shared/Select.tsx +5 -2
- package/src/components/shared/SplitButton.tsx +11 -17
- package/src/components/shared/SummaryAnchorsContext.ts +11 -0
- package/src/components/shared/Textarea.tsx +17 -2
- package/src/components/shared/ToolbarFrame.tsx +28 -0
- package/src/components/shared/VideoSourceField.tsx +1 -1
- package/src/components/shared/copy.ts +18 -0
- package/src/components/shared/icons.tsx +1 -17
- package/src/components/shell/AudienceAddForm.tsx +2 -2
- package/src/components/shell/AudienceDetailsPanel.tsx +23 -5
- package/src/components/shell/AudienceRow.tsx +22 -15
- package/src/components/shell/BugReportFAB.tsx +50 -40
- package/src/components/shell/CredentialList.tsx +33 -13
- package/src/components/shell/DocInspector.tsx +3 -12
- package/src/components/shell/DocumentEditorOverlay.tsx +33 -23
- package/src/components/shell/EditorContext.tsx +7 -0
- package/src/components/shell/EditorLoginForm.tsx +26 -36
- package/src/components/shell/EditorModal.tsx +8 -10
- package/src/components/shell/EditorShell.tsx +499 -339
- package/src/components/shell/HistoryToolbar.tsx +24 -26
- package/src/components/shell/MediaFolderTile.tsx +8 -3
- package/src/components/shell/MediaLibraryModal.tsx +59 -60
- package/src/components/shell/ProcessingIndicator.tsx +2 -2
- package/src/components/shell/RestoreModal.tsx +17 -16
- package/src/components/shell/SetPasswordForm.tsx +3 -3
- package/src/components/shell/SiteSettingsChatbot.tsx +61 -42
- package/src/components/shell/SiteSettingsDisplay.tsx +10 -20
- package/src/components/shell/SiteSettingsModal.tsx +24 -2
- package/src/components/shell/SiteSettingsTags.tsx +143 -0
- package/src/components/shell/SiteSettingsUsers.tsx +36 -26
- package/src/components/shell/SiteSettingsViewerAccess.tsx +2 -2
- package/src/components/shell/ViewerLoginForm.tsx +5 -4
- package/src/components/shell/reference-sources.ts +36 -0
- package/src/deck/index.ts +2 -2
- package/src/document/index.ts +2 -2
- package/src/hooks/useBlockDnd.ts +11 -0
- package/src/hooks/useBuildStatus.ts +53 -6
- package/src/hooks/useDocumentUploads.ts +1 -1
- package/src/hooks/useEditorPersistence.ts +141 -35
- package/src/hooks/useEditorPublish.ts +18 -27
- package/src/hooks/useMediaPipeline.ts +1 -1
- package/src/hooks/useNotice.ts +45 -0
- package/src/hooks/useSortableNavRow.ts +11 -0
- package/src/hooks/useSortableRow.ts +22 -2
- package/src/hooks/useStackedEscape.ts +62 -0
- package/src/lib/block-dnd.ts +6 -1
- package/src/lib/block-move.ts +3 -0
- package/src/lib/brand-swatches.ts +32 -0
- package/src/lib/container-ops.ts +5 -3
- package/src/lib/dexie.ts +15 -1
- package/src/lib/env.ts +9 -0
- package/src/lib/events.ts +1 -2
- package/src/lib/image-background.ts +31 -0
- package/src/lib/index.ts +5 -4
- package/src/lib/loader.ts +54 -55
- package/src/lib/nav-tree.ts +71 -0
- package/src/lib/nav.ts +196 -36
- package/src/lib/platform-broker.ts +32 -14
- package/src/lib/reference-type.ts +3 -0
- package/src/lib/reference-validation.ts +69 -0
- package/src/lib/references.ts +130 -0
- package/src/lib/registry.ts +37 -0
- package/src/lib/tags.ts +148 -0
- package/src/lib/theme-vars.ts +23 -0
- package/src/media/index.ts +1 -1
- package/src/media/utils.ts +18 -0
- package/src/media/{videoPoster.ts → video-poster.ts} +2 -2
- package/src/schemas/index.ts +1 -0
- package/src/schemas/shared.ts +24 -1
- package/src/schemas/site-config.ts +6 -1
- package/src/schemas/tags.ts +33 -0
- package/src/storage/types.ts +1 -1
- package/src/types/database.ts +2 -0
- package/dist/chunk-DNY72JZN.js +0 -86
- package/dist/chunk-F2LYQPXV.js +0 -77
- package/dist/chunk-JH762VUH.js +0 -128
- package/dist/chunk-K7DYZXVU.js +0 -138
- package/dist/components/primitives/defineHeadingSection.d.ts.map +0 -1
- package/dist/components/primitives/gridDrop.d.ts.map +0 -1
- package/dist/components/shared/UploadRejectionAlert.d.ts.map +0 -1
- package/dist/components/shell/BuildStatusIndicator.d.ts +0 -7
- package/dist/components/shell/BuildStatusIndicator.d.ts.map +0 -1
- package/dist/components/shell/blockMoveDispatch.d.ts.map +0 -1
- package/dist/hooks/index.d.ts +0 -9
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/lib/grid.d.ts +0 -2
- package/dist/lib/grid.d.ts.map +0 -1
- package/dist/lib/safeRedirect.d.ts.map +0 -1
- package/dist/media/videoPoster.d.ts.map +0 -1
- package/src/components/brandguide/ColorSwatchSettings.d.ts.map +0 -1
- package/src/components/brandguide/Colors.d.ts.map +0 -1
- package/src/components/primitives/CustomParagraph.d.ts.map +0 -1
- package/src/components/primitives/EditableGrid.d.ts.map +0 -1
- package/src/components/primitives/EditablePlainText.d.ts.map +0 -1
- package/src/components/primitives/EditableRichText.d.ts.map +0 -1
- package/src/components/primitives/HeadingSection.d.ts.map +0 -1
- package/src/components/primitives/IconPicker.d.ts.map +0 -1
- package/src/components/primitives/LinkPopover.d.ts.map +0 -1
- package/src/components/primitives/MediaSettingsForms.d.ts.map +0 -1
- package/src/components/primitives/ResolvedMedia.d.ts.map +0 -1
- package/src/components/primitives/RichTextToolbar.d.ts.map +0 -1
- package/src/components/primitives/tiptap-presets.d.ts.map +0 -1
- package/src/components/primitives/useEditableCollection.d.ts.map +0 -1
- package/src/components/primitives/useEditablePlainText.d.ts.map +0 -1
- package/src/components/primitives/useEditableRichText.d.ts.map +0 -1
- package/src/components/sections/Button/CTAButton.d.ts.map +0 -1
- package/src/components/sections/Button/index.d.ts.map +0 -1
- package/src/components/sections/Colors/index.d.ts.map +0 -1
- package/src/components/sections/IconList/IconList.d.ts.map +0 -1
- package/src/components/sections/IconList/IconListSettings.d.ts.map +0 -1
- package/src/components/sections/IconList/index.d.ts.map +0 -1
- package/src/components/sections/LinkHeading/index.d.ts.map +0 -1
- package/src/components/sections/Prose/Prose.d.ts.map +0 -1
- package/src/components/sections/Prose/index.d.ts.map +0 -1
- package/src/components/sections/SubHeading/index.d.ts.map +0 -1
- package/src/components/sections/SubSubHeading/index.d.ts.map +0 -1
- package/src/components/sections/register-schemas.d.ts.map +0 -1
- package/src/components/shared/Button.d.ts.map +0 -1
- package/src/components/shared/Checkbox.d.ts.map +0 -1
- package/src/components/shared/FormLabel.d.ts.map +0 -1
- package/src/components/shared/IconButton.d.ts.map +0 -1
- package/src/components/shared/Input.d.ts.map +0 -1
- package/src/components/shared/Select.d.ts.map +0 -1
- package/src/components/shared/icons.d.ts.map +0 -1
- package/src/components/shell/BuildStatusIndicator.tsx +0 -59
- package/src/components/shell/MediaLibraryContext.d.ts.map +0 -1
- package/src/hooks/index.ts +0 -8
- package/src/hooks/useResolvedMedia.d.ts.map +0 -1
- package/src/lib/cn.d.ts.map +0 -1
- package/src/lib/grid.d.ts.map +0 -1
- package/src/lib/grid.ts +0 -7
- package/src/lib/icons.d.ts.map +0 -1
- package/src/lib/loader.d.ts.map +0 -1
- package/src/lib/nav.d.ts.map +0 -1
- package/src/lib/registry.d.ts.map +0 -1
- package/src/lib/sanitize.d.ts.map +0 -1
- package/src/media/github.d.ts.map +0 -1
- package/src/media/index.d.ts.map +0 -1
- package/src/media/queue.d.ts.map +0 -1
- package/src/media/resolve.d.ts.map +0 -1
- package/src/media/types.d.ts.map +0 -1
- package/src/media/utils.d.ts.map +0 -1
- package/src/media/videoPoster.d.ts.map +0 -1
- package/src/schemas/auth.d.ts.map +0 -1
- package/src/schemas/media-grid-options.d.ts.map +0 -1
- package/src/schemas/media.d.ts.map +0 -1
- package/src/schemas/sections.d.ts.map +0 -1
- package/src/schemas/shared.d.ts.map +0 -1
- package/src/schemas/site-config.d.ts.map +0 -1
- /package/dist/{chunk-B7VBSE5X.js → chunk-3JDTXOIG.js} +0 -0
- /package/dist/{chunk-CXZ5YJG4.js → chunk-L45X7DKX.js} +0 -0
- /package/src/components/primitives/{gridDrop.ts → grid-drop.ts} +0 -0
- /package/src/components/shell/{blockMoveDispatch.ts → block-move-dispatch.ts} +0 -0
- /package/src/lib/{safeRedirect.ts → safe-redirect.ts} +0 -0
|
@@ -74,10 +74,10 @@ export function deriveStatusDisplay({ mainStatus, savedStatus, contentDiffers, i
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
const dotColorClasses: Record<StatusColor, string> = {
|
|
77
|
-
live: "bg-
|
|
78
|
-
draft: "bg-
|
|
79
|
-
archived: "bg-white border-
|
|
80
|
-
modified: "bg-
|
|
77
|
+
live: "bg-status-live-text",
|
|
78
|
+
draft: "bg-status-draft-text",
|
|
79
|
+
archived: "bg-white border-status-draft-text",
|
|
80
|
+
modified: "bg-status-modified-text",
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useState, type FormEvent } from "react";
|
|
2
|
+
import { Plus } from "lucide-react";
|
|
3
|
+
import { cn } from "../../lib/cn";
|
|
4
|
+
import { tagDisplayLabel } from "../../lib/tags";
|
|
5
|
+
import type { TagEntry } from "../../schemas/tags";
|
|
6
|
+
import { IndicatorPill } from "./IndicatorPill";
|
|
7
|
+
import { PopoverItem } from "../shared/PopoverItem";
|
|
8
|
+
import { IconButton } from "../shared/IconButton";
|
|
9
|
+
import { CheckboxBox } from "../shared/Checkbox";
|
|
10
|
+
|
|
11
|
+
interface TagIndicatorProps {
|
|
12
|
+
/** The site's tag registry, already reconciled (siteTags). */
|
|
13
|
+
tags: TagEntry[];
|
|
14
|
+
/** The ids of the tags on this section. */
|
|
15
|
+
assignedIds: string[];
|
|
16
|
+
onToggle: (tagId: string, tagged: boolean) => void;
|
|
17
|
+
/** Create a tag from a typed name and put it on this section. */
|
|
18
|
+
onCreate: (label: string) => void;
|
|
19
|
+
/** Display-only mode — the pill still summarizes, but the picker never opens. */
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function TagIndicator({ tags, assignedIds, onToggle, onCreate, disabled }: TagIndicatorProps) {
|
|
24
|
+
const [draft, setDraft] = useState("");
|
|
25
|
+
const assigned = tags.filter((t) => assignedIds.includes(t.id));
|
|
26
|
+
|
|
27
|
+
const labelText = assigned.length === 0
|
|
28
|
+
? "No tags"
|
|
29
|
+
: assigned.length === 1 ? tagDisplayLabel(assigned[0].label) : `${assigned.length} tags`;
|
|
30
|
+
const ariaSummary = assigned.length === 0 ? "none" : assigned.map((t) => tagDisplayLabel(t.label)).join(", ");
|
|
31
|
+
|
|
32
|
+
function submit(e: FormEvent) {
|
|
33
|
+
e.preventDefault();
|
|
34
|
+
const label = draft.trim();
|
|
35
|
+
if (!label) return;
|
|
36
|
+
onCreate(label);
|
|
37
|
+
setDraft("");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<IndicatorPill
|
|
42
|
+
dots={[]}
|
|
43
|
+
label={labelText}
|
|
44
|
+
ariaLabel={`Tags: ${ariaSummary}`}
|
|
45
|
+
buttonClassName={assigned.length === 0 ? "text-base-contrast-light" : undefined}
|
|
46
|
+
disabled={disabled}
|
|
47
|
+
clickContent={
|
|
48
|
+
<div className="w-56 py-1">
|
|
49
|
+
{tags.length > 0 && (
|
|
50
|
+
<ul role="list" className="max-h-64 overflow-y-auto">
|
|
51
|
+
{tags.map((t) => {
|
|
52
|
+
const checked = assignedIds.includes(t.id);
|
|
53
|
+
return (
|
|
54
|
+
<li key={t.id}>
|
|
55
|
+
<PopoverItem role="checkbox" aria-checked={checked} onClick={() => onToggle(t.id, !checked)}>
|
|
56
|
+
<CheckboxBox checked={checked} />
|
|
57
|
+
<span className={cn("truncate font-medium text-base-contrast", !t.label && "italic text-base-contrast/60")}>
|
|
58
|
+
{tagDisplayLabel(t.label)}
|
|
59
|
+
</span>
|
|
60
|
+
</PopoverItem>
|
|
61
|
+
</li>
|
|
62
|
+
);
|
|
63
|
+
})}
|
|
64
|
+
</ul>
|
|
65
|
+
)}
|
|
66
|
+
<form onSubmit={submit} className={cn("flex items-center gap-1 px-3 py-1.5", tags.length > 0 && "border-t border-base-200")}>
|
|
67
|
+
<input
|
|
68
|
+
aria-label="New tag"
|
|
69
|
+
value={draft}
|
|
70
|
+
placeholder={tags.length > 0 ? "New tag" : "Create the first tag"}
|
|
71
|
+
onChange={(e) => setDraft(e.target.value)}
|
|
72
|
+
className="min-w-0 flex-1 rounded border border-base-200 bg-base px-2 py-1 text-xs text-base-contrast focus:border-base-contrast focus:outline-none"
|
|
73
|
+
/>
|
|
74
|
+
<IconButton icon={<Plus size={14} />} label="Create tag" size="sm" type="submit" />
|
|
75
|
+
</form>
|
|
76
|
+
</div>
|
|
77
|
+
}
|
|
78
|
+
/>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
@@ -19,7 +19,7 @@ const isDocumentFile = (file: File) => file.type in DOCUMENT_MIME_TO_EXT;
|
|
|
19
19
|
*
|
|
20
20
|
* Deliberately thin on validation: every rejection (wrong type, too large, no
|
|
21
21
|
* documents store) belongs to `uploadDocument`, which already routes typed copy
|
|
22
|
-
* through the pipeline's `onUploadError` → `
|
|
22
|
+
* through the pipeline's `onUploadError` → `InlineAlert` channel. The
|
|
23
23
|
* one judgement made here is WHICH file of a multi-file drop to hand over.
|
|
24
24
|
*/
|
|
25
25
|
export function DocumentDropZone({ onDocumentSelected, className }: DocumentDropZoneProps) {
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { useRef, useEffect, useState, useId, type ReactNode } from "react";
|
|
2
|
-
import { ImageIcon } from "lucide-react";
|
|
3
|
-
import {
|
|
2
|
+
import { ImageIcon, Plus, Trash2, Settings } from "lucide-react";
|
|
3
|
+
import { DragHandle } from "../shared/icons";
|
|
4
4
|
import { IconButton } from "../shared/IconButton";
|
|
5
|
+
import { DropEdgeIndicator } from "../editor/DropEdgeIndicator";
|
|
5
6
|
import { cn } from "../../lib/cn";
|
|
6
7
|
import { containerGridClass } from "../../lib/container-grid";
|
|
7
8
|
import { useEditableCollection } from "./useEditableCollection";
|
|
8
|
-
import { resolveDropIndex } from "./
|
|
9
|
+
import { resolveDropIndex } from "./grid-drop";
|
|
9
10
|
|
|
10
11
|
interface EditableGridProps<T> {
|
|
11
12
|
items: T[];
|
|
@@ -166,7 +167,7 @@ export function EditableGrid<T>({
|
|
|
166
167
|
|
|
167
168
|
{/* Add button — absolute, centered below the grid */}
|
|
168
169
|
<IconButton
|
|
169
|
-
icon={<
|
|
170
|
+
icon={<Plus size={16} />}
|
|
170
171
|
label="Add item"
|
|
171
172
|
size="lg"
|
|
172
173
|
intent="primary"
|
|
@@ -287,18 +288,18 @@ function GridCell<T>({
|
|
|
287
288
|
isCellDragging && "opacity-50",
|
|
288
289
|
)}
|
|
289
290
|
>
|
|
290
|
-
{/* Drop indicator — centered in the gap between cells
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
291
|
+
{/* Drop indicator — centered in the gap between cells. The gap is wider
|
|
292
|
+
here than DropEdgeIndicator's default gutter, so the offset goes
|
|
293
|
+
through `style`. */}
|
|
294
|
+
<DropEdgeIndicator
|
|
295
|
+
edge={showLeftEdge ? "left" : showRightEdge ? "right" : null}
|
|
296
|
+
style={{ transform: showLeftEdge ? "translateX(-0.5rem)" : "translateX(0.5rem)" }}
|
|
297
|
+
/>
|
|
297
298
|
|
|
298
299
|
{/* Insert button — centered in the gap between cells */}
|
|
299
300
|
{!isDragging && !isLast && (
|
|
300
301
|
<IconButton
|
|
301
|
-
icon={<
|
|
302
|
+
icon={<Plus size={12} />}
|
|
302
303
|
label="Insert item"
|
|
303
304
|
size="sm"
|
|
304
305
|
intent="primary"
|
|
@@ -328,14 +329,14 @@ function GridCell<T>({
|
|
|
328
329
|
)}
|
|
329
330
|
{onSettings && (
|
|
330
331
|
<IconButton
|
|
331
|
-
icon={<
|
|
332
|
+
icon={<Settings size={16} />}
|
|
332
333
|
label="Item settings"
|
|
333
334
|
onClick={onSettings}
|
|
334
335
|
className="bg-base/80 shadow-sm"
|
|
335
336
|
/>
|
|
336
337
|
)}
|
|
337
338
|
<IconButton
|
|
338
|
-
icon={<
|
|
339
|
+
icon={<Trash2 size={16} />}
|
|
339
340
|
label="Delete item"
|
|
340
341
|
intent="destructive"
|
|
341
342
|
onClick={() => onRemove(id)}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DragHandle
|
|
1
|
+
import { useId, type ReactNode } from "react";
|
|
2
|
+
import { DragHandle } from "../shared/icons";
|
|
3
|
+
import { Trash2 } from "lucide-react";
|
|
3
4
|
import { IconButton } from "../shared/IconButton";
|
|
5
|
+
import { DropEdgeIndicator } from "../editor/DropEdgeIndicator";
|
|
4
6
|
import { cn } from "../../lib/cn";
|
|
5
7
|
import { useEditableCollection } from "./useEditableCollection";
|
|
8
|
+
import { useSortableRow } from "../../hooks/useSortableRow";
|
|
6
9
|
|
|
7
10
|
interface EditableListProps<T> {
|
|
8
11
|
items: T[];
|
|
@@ -26,11 +29,11 @@ export function EditableList<T>({
|
|
|
26
29
|
onChange,
|
|
27
30
|
createItem,
|
|
28
31
|
});
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
// One shared dragType per EditableList instance — a bare "list-row" let a
|
|
33
|
+
// row dragged out of one list reorder a DIFFERENT list it was hovered over,
|
|
34
|
+
// since useSortableRow's DnD matching keys off dragType alone.
|
|
35
|
+
const listId = useId();
|
|
36
|
+
const dragType = `list-row-${listId}`;
|
|
34
37
|
|
|
35
38
|
if (!isEditMode) {
|
|
36
39
|
return (
|
|
@@ -51,10 +54,9 @@ export function EditableList<T>({
|
|
|
51
54
|
key={wrapped.id}
|
|
52
55
|
id={wrapped.id}
|
|
53
56
|
index={index}
|
|
57
|
+
dragType={dragType}
|
|
54
58
|
onReorder={onReorder}
|
|
55
59
|
onRemove={onRemove}
|
|
56
|
-
dragState={dragState}
|
|
57
|
-
setDragState={setDragState}
|
|
58
60
|
>
|
|
59
61
|
{renderItem(wrapped.data, { isEditMode: true, index })}
|
|
60
62
|
</ListRow>
|
|
@@ -72,85 +74,36 @@ export function EditableList<T>({
|
|
|
72
74
|
function ListRow({
|
|
73
75
|
id,
|
|
74
76
|
index,
|
|
77
|
+
dragType,
|
|
75
78
|
onReorder,
|
|
76
79
|
onRemove,
|
|
77
|
-
dragState,
|
|
78
|
-
setDragState,
|
|
79
80
|
children,
|
|
80
81
|
}: {
|
|
81
82
|
id: string;
|
|
82
83
|
index: number;
|
|
84
|
+
dragType: string;
|
|
83
85
|
onReorder: (from: number, to: number) => void;
|
|
84
86
|
onRemove: (id: string) => void;
|
|
85
|
-
dragState: { sourceId: string | null; targetId: string | null };
|
|
86
|
-
setDragState: React.Dispatch<React.SetStateAction<{ sourceId: string | null; targetId: string | null }>>;
|
|
87
87
|
children: ReactNode;
|
|
88
88
|
}) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
useEffect(() => {
|
|
101
|
-
const row = rowRef.current;
|
|
102
|
-
const handle = handleRef.current;
|
|
103
|
-
if (!row || !handle) return;
|
|
104
|
-
|
|
105
|
-
let cleanup: (() => void) | undefined;
|
|
106
|
-
let cancelled = false;
|
|
107
|
-
|
|
108
|
-
import("@atlaskit/pragmatic-drag-and-drop/element/adapter").then(({ draggable, dropTargetForElements }) => {
|
|
109
|
-
if (cancelled) return;
|
|
110
|
-
|
|
111
|
-
const cleanupDraggable = draggable({
|
|
112
|
-
element: handle,
|
|
113
|
-
getInitialData: () => ({ dragType: "list-row", id, index }),
|
|
114
|
-
onDragStart: () => setDragState({ sourceId: id, targetId: null }),
|
|
115
|
-
onDrop: () => setDragState({ sourceId: null, targetId: null }),
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const cleanupDropTarget = dropTargetForElements({
|
|
119
|
-
element: row,
|
|
120
|
-
canDrop: ({ source }) => source.data.dragType === "list-row",
|
|
121
|
-
getData: () => ({ id, index }),
|
|
122
|
-
onDragEnter: () => setDragState((prev) => ({ ...prev, targetId: id })),
|
|
123
|
-
onDragLeave: () => setDragState((prev) => prev.targetId === id ? { ...prev, targetId: null } : prev),
|
|
124
|
-
onDrop: ({ source }) => {
|
|
125
|
-
const fromIndex = source.data.index as number;
|
|
126
|
-
if (fromIndex !== index) {
|
|
127
|
-
onReorderRef.current(fromIndex, index);
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
cleanup = () => {
|
|
133
|
-
cleanupDraggable();
|
|
134
|
-
cleanupDropTarget();
|
|
135
|
-
};
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
return () => {
|
|
139
|
-
cancelled = true;
|
|
140
|
-
cleanup?.();
|
|
141
|
-
};
|
|
142
|
-
}, [id, index, setDragState]);
|
|
143
|
-
|
|
144
|
-
const isDropTarget = dragState.targetId === id && dragState.sourceId !== id;
|
|
89
|
+
// The row itself is the draggable (handle stays the visual grab affordance
|
|
90
|
+
// and drag-initiation target); drop-feedback is the closest-edge line, and a
|
|
91
|
+
// drop lands before/after by pointer half — useSortableRow reads onReorder
|
|
92
|
+
// through a ref internally, so a fresh arrow every render (as EditorShell's
|
|
93
|
+
// callers pass) doesn't re-register the drag mid-gesture.
|
|
94
|
+
const { rowRef, handleRef, isDragging, closestEdge } = useSortableRow<HTMLDivElement, HTMLButtonElement>({
|
|
95
|
+
index,
|
|
96
|
+
dragType,
|
|
97
|
+
onReorder,
|
|
98
|
+
});
|
|
145
99
|
|
|
146
100
|
return (
|
|
147
101
|
<div
|
|
148
102
|
ref={rowRef}
|
|
149
|
-
className={cn(
|
|
150
|
-
"group/row relative flex items-center gap-2",
|
|
151
|
-
isDropTarget && "border-t-2 border-primary",
|
|
152
|
-
)}
|
|
103
|
+
className={cn("group/row relative flex items-center gap-2", isDragging && "opacity-50")}
|
|
153
104
|
>
|
|
105
|
+
<DropEdgeIndicator edge={closestEdge} />
|
|
106
|
+
|
|
154
107
|
{/* Drag handle — left edge, visible on hover or no-hover devices */}
|
|
155
108
|
<IconButton
|
|
156
109
|
ref={handleRef}
|
|
@@ -167,7 +120,7 @@ function ListRow({
|
|
|
167
120
|
|
|
168
121
|
{/* Delete button — right edge, visible on hover or no-hover devices */}
|
|
169
122
|
<IconButton
|
|
170
|
-
icon={<
|
|
123
|
+
icon={<Trash2 size={14} />}
|
|
171
124
|
label="Delete item"
|
|
172
125
|
size="sm"
|
|
173
126
|
intent="destructive"
|
|
@@ -7,10 +7,13 @@ interface Props {
|
|
|
7
7
|
tag: "h2" | "h3" | "h4";
|
|
8
8
|
placeholder: string;
|
|
9
9
|
className?: string;
|
|
10
|
+
/** Overrides the heading-derived id — the `<heading>-<reference id>` anchor stamped on a copy a
|
|
11
|
+
* Reference pulled in (withNavAnchors). */
|
|
12
|
+
anchor?: string;
|
|
10
13
|
onChange?: (heading: string) => void;
|
|
11
14
|
}
|
|
12
15
|
|
|
13
|
-
export function HeadingSection({ heading, tag, placeholder, className, onChange }: Props) {
|
|
16
|
+
export function HeadingSection({ heading, tag, placeholder, className, anchor, onChange }: Props) {
|
|
14
17
|
return (
|
|
15
18
|
<EditablePlainText
|
|
16
19
|
tag={tag}
|
|
@@ -18,7 +21,7 @@ export function HeadingSection({ heading, tag, placeholder, className, onChange
|
|
|
18
21
|
onChange={onChange ?? (() => {})}
|
|
19
22
|
isEditMode={!!onChange}
|
|
20
23
|
placeholder={placeholder}
|
|
21
|
-
id={toSectionId(heading)}
|
|
24
|
+
id={anchor ?? toSectionId(heading)}
|
|
22
25
|
className={cn("scroll-mt-20", className)}
|
|
23
26
|
/>
|
|
24
27
|
);
|
|
@@ -2,6 +2,7 @@ import { useState } from "react";
|
|
|
2
2
|
import { cn } from "../../lib/cn";
|
|
3
3
|
import { ImageIcon } from "lucide-react";
|
|
4
4
|
import { useResolvedMedia } from "../../hooks/useResolvedMedia";
|
|
5
|
+
import type { ImageBackdrop } from "../../lib/image-background";
|
|
5
6
|
|
|
6
7
|
interface ResolvedMediaProps {
|
|
7
8
|
imageId: string | undefined;
|
|
@@ -13,6 +14,9 @@ interface ResolvedMediaProps {
|
|
|
13
14
|
className?: string;
|
|
14
15
|
imgClassName?: string;
|
|
15
16
|
invertFrom?: string;
|
|
17
|
+
/** Painted above the loading placeholder and below the media, so it holds in
|
|
18
|
+
* the zero-JS viewer (where the placeholder never fades) and after load. */
|
|
19
|
+
backdrop?: ImageBackdrop;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
22
|
export function ResolvedMedia({
|
|
@@ -25,6 +29,7 @@ export function ResolvedMedia({
|
|
|
25
29
|
className,
|
|
26
30
|
imgClassName,
|
|
27
31
|
invertFrom,
|
|
32
|
+
backdrop,
|
|
28
33
|
}: ResolvedMediaProps) {
|
|
29
34
|
const resolved = useResolvedMedia(imageId);
|
|
30
35
|
// A successful live resolution is always fresher than baked props (the ref
|
|
@@ -64,6 +69,14 @@ export function ResolvedMedia({
|
|
|
64
69
|
loaded ? "opacity-0" : "opacity-100",
|
|
65
70
|
)}
|
|
66
71
|
/>
|
|
72
|
+
{backdrop && (
|
|
73
|
+
<div
|
|
74
|
+
aria-hidden="true"
|
|
75
|
+
data-testid="media-backdrop"
|
|
76
|
+
className={cn("pointer-events-none absolute inset-0", backdrop.className)}
|
|
77
|
+
style={backdrop.style}
|
|
78
|
+
/>
|
|
79
|
+
)}
|
|
67
80
|
{kind === "video" ? (
|
|
68
81
|
<video
|
|
69
82
|
src={src}
|
|
@@ -56,6 +56,7 @@ export function defineHeadingSection<T extends string>(config: HeadingSectionCon
|
|
|
56
56
|
heading={content.content.heading}
|
|
57
57
|
tag={config.tag}
|
|
58
58
|
placeholder={config.placeholder}
|
|
59
|
+
anchor={(content as { navAnchor?: string }).navAnchor}
|
|
59
60
|
onChange={onChange ? (heading: string) => onChange({ ...content, content: { ...content.content, heading } }) : undefined}
|
|
60
61
|
/>
|
|
61
62
|
),
|
|
@@ -7,7 +7,7 @@ export { EditableGrid } from "./EditableGrid";
|
|
|
7
7
|
export { ImageDropZone } from "./ImageDropZone";
|
|
8
8
|
export { ResolvedMedia } from "./ResolvedMedia";
|
|
9
9
|
export { LinkPopover } from "./LinkPopover";
|
|
10
|
-
export { defineHeadingSection } from "./
|
|
10
|
+
export { defineHeadingSection } from "./define-heading-section";
|
|
11
11
|
export { MediaBlock } from "../sections/Media/MediaBlock";
|
|
12
12
|
// Link selector (external URL / internal page + section) plus the pages context
|
|
13
13
|
// that feeds its dropdowns, so custom sections can reuse the same link picker the
|
|
@@ -37,11 +37,11 @@ export function useEditablePlainText({
|
|
|
37
37
|
}, [onChange]);
|
|
38
38
|
|
|
39
39
|
// Commit on every input, not only on blur — the same contract
|
|
40
|
-
// useEditableRichText adopted, and for the same reason:
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
40
|
+
// useEditableRichText adopted, and for the same reason: clicking Save (or an
|
|
41
|
+
// autosave flush) while the field is still focused flushes persistence before
|
|
42
|
+
// blur ever fires, so a blur-only commit silently drops the in-progress edit.
|
|
43
|
+
// Deliberately NOT debounced: any debounce window is the same bug, just
|
|
44
|
+
// narrower.
|
|
45
45
|
const handleInput = useCallback((text: string) => {
|
|
46
46
|
setValue(text);
|
|
47
47
|
if (text !== lastPropValue.current) {
|
|
@@ -45,5 +45,7 @@ export default function Button({ text, link, download, onChange }: Props) {
|
|
|
45
45
|
);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
// No link configured: not an interactive control, so render inert markup
|
|
49
|
+
// rather than a focusable button that does nothing on activation.
|
|
50
|
+
return <span className={cn(base, variant)}>{text}</span>;
|
|
49
51
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Check, X } from "lucide-react";
|
|
2
2
|
import type { SingleMediaReference } from "../../../schemas/shared";
|
|
3
3
|
import type { LinkValue } from "../../../schemas/link";
|
|
4
|
-
import { MediaBlock } from "../Media/MediaBlock";
|
|
4
|
+
import { MediaBlock, type MediaBlockProps } from "../Media/MediaBlock";
|
|
5
5
|
|
|
6
6
|
export interface DoDontMediaBlockProps {
|
|
7
7
|
refValue: SingleMediaReference;
|
|
8
|
-
options:
|
|
8
|
+
options: MediaBlockProps["options"];
|
|
9
9
|
link?: LinkValue;
|
|
10
10
|
dodont: "do" | "dont";
|
|
11
11
|
isEditMode: boolean;
|
|
@@ -20,8 +20,8 @@ export function DoDontMediaBlock({ refValue, options, link, dodont, isEditMode,
|
|
|
20
20
|
<div>
|
|
21
21
|
<div className="flex h-10 items-center justify-center pb-1">
|
|
22
22
|
{dodont === "do"
|
|
23
|
-
? <Check size={28} className="text-
|
|
24
|
-
: <X size={28} className="text-
|
|
23
|
+
? <Check size={28} className="text-success" />
|
|
24
|
+
: <X size={28} className="text-danger" />}
|
|
25
25
|
</div>
|
|
26
26
|
<MediaBlock
|
|
27
27
|
refValue={refValue}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { defineSection } from "../../../lib/registry";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { Image as ImageIcon } from "lucide-react";
|
|
4
|
-
import { SingleMediaReferenceSchema } from "../../../schemas/shared";
|
|
4
|
+
import { SingleMediaReferenceSchema, ImageBackgroundSchema } from "../../../schemas/shared";
|
|
5
5
|
import { LinkValueSchema, DEFAULT_LINK } from "../../../schemas/link";
|
|
6
6
|
import { DoDontMediaBlock } from "./DoDontMediaBlock";
|
|
7
|
+
import type { MediaBlockProps } from "../Media/MediaBlock";
|
|
7
8
|
|
|
8
9
|
const schema = z.object({
|
|
9
10
|
type: z.literal("dodont_media"),
|
|
@@ -27,6 +28,9 @@ const schema = z.object({
|
|
|
27
28
|
.enum(["cover", "contain"])
|
|
28
29
|
.describe("How the image fills its box: 'contain' (fit whole image) or 'cover' (fill and crop).")
|
|
29
30
|
.optional(),
|
|
31
|
+
background: ImageBackgroundSchema.describe(
|
|
32
|
+
"Optional backdrop filling the image box, for images that need contrast (e.g. a white transparent logo). 'theme' picks the site's light or dark surface separately for light and dark mode; 'custom' uses one hex for both. Images only — ignored for video. Omit for none.",
|
|
33
|
+
).optional(),
|
|
30
34
|
})
|
|
31
35
|
.default({}),
|
|
32
36
|
});
|
|
@@ -42,7 +46,7 @@ export default defineSection({
|
|
|
42
46
|
component: ({ content, options, onChange }) => (
|
|
43
47
|
<DoDontMediaBlock
|
|
44
48
|
refValue={content.content.ref}
|
|
45
|
-
options={(options ?? {}) as
|
|
49
|
+
options={(options ?? {}) as MediaBlockProps["options"]}
|
|
46
50
|
link={content.content.link}
|
|
47
51
|
dodont={content.content.dodont}
|
|
48
52
|
isEditMode={!!onChange}
|
|
@@ -74,6 +78,11 @@ export default defineSection({
|
|
|
74
78
|
{ label: "Cover", value: "cover" },
|
|
75
79
|
],
|
|
76
80
|
},
|
|
81
|
+
background: {
|
|
82
|
+
type: "image-background",
|
|
83
|
+
label: "Image background",
|
|
84
|
+
hidden: (values) => (values.ref as { type?: string } | undefined)?.type === "video",
|
|
85
|
+
},
|
|
77
86
|
link: { type: "link", label: "Link", default: DEFAULT_LINK, target: "content" },
|
|
78
87
|
dodont: {
|
|
79
88
|
type: "select",
|
|
@@ -88,7 +97,7 @@ export default defineSection({
|
|
|
88
97
|
},
|
|
89
98
|
inheritableSettings: ["square", "showCaption", "border", "objectFit"],
|
|
90
99
|
settingsTabs: [
|
|
91
|
-
{ label: "Display", fields: ["square", "showCaption", "border", "objectFit"] },
|
|
100
|
+
{ label: "Display", fields: ["square", "showCaption", "border", "objectFit", "background"] },
|
|
92
101
|
{ label: "Link", fields: ["link"] },
|
|
93
102
|
{ label: "Do / Don't", fields: ["dodont"] },
|
|
94
103
|
],
|
|
@@ -49,7 +49,7 @@ export function DoDontToggle({ value, onSelect, onClose }: DoDontToggleProps) {
|
|
|
49
49
|
aria-label="Do"
|
|
50
50
|
className={cn(
|
|
51
51
|
"cursor-pointer flex flex-col items-center justify-center gap-1 rounded py-2 transition-colors",
|
|
52
|
-
"text-
|
|
52
|
+
"text-success hover:bg-base-accent",
|
|
53
53
|
value === "do" && "ring-2 ring-primary bg-base-accent",
|
|
54
54
|
)}
|
|
55
55
|
onClick={() => onSelect("do")}
|
|
@@ -62,7 +62,7 @@ export function DoDontToggle({ value, onSelect, onClose }: DoDontToggleProps) {
|
|
|
62
62
|
aria-label="Don't"
|
|
63
63
|
className={cn(
|
|
64
64
|
"cursor-pointer flex flex-col items-center justify-center gap-1 rounded py-2 transition-colors",
|
|
65
|
-
"text-
|
|
65
|
+
"text-danger hover:bg-base-accent",
|
|
66
66
|
value === "dont" && "ring-2 ring-primary bg-base-accent",
|
|
67
67
|
)}
|
|
68
68
|
onClick={() => onSelect("dont")}
|