alinea 2.0.0-preview.9 → 2.0.0-rc2
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/dist/.init/.mcp.json +11 -0
- package/dist/.init/AGENTS.md +17 -0
- package/dist/.init/CLAUDE.md +1 -0
- package/dist/.init/content/pages/welcome.json +1 -1
- package/dist/.init/package.json +1 -1
- package/dist/.init/src/cms.ts +4 -2
- package/dist/.init-pm/bun.lock +0 -0
- package/dist/.mcp/later/dev.json +1 -0
- package/dist/.mcp/lock/dev.json +1 -0
- package/dist/.mcp/online/dev.json +1 -0
- package/dist/LICENSES.md +2239 -294
- package/dist/adapter/next/cms.d.ts +2 -2
- package/dist/adapter/next/cms.js +66 -32
- package/dist/adapter/next/context.js +5 -6
- package/dist/adapter/next/dashboardUrl.d.ts +6 -0
- package/dist/adapter/next/dashboardUrl.js +13 -0
- package/dist/adapter/next/devCache.d.ts +16 -0
- package/dist/adapter/next/devCache.js +32 -0
- package/dist/adapter/next/handler.js +18 -4
- package/dist/adapter/next/syncCheck.d.ts +15 -2
- package/dist/adapter/next/syncCheck.js +26 -9
- package/dist/adapter/next/with-alinea.js +27 -20
- package/dist/backend/CommitEntries.d.ts +17 -0
- package/dist/backend/CommitEntries.js +39 -0
- package/dist/backend/Handler.d.ts +15 -1
- package/dist/backend/Handler.js +106 -32
- package/dist/backend/api/BasicAuth.js +5 -1
- package/dist/backend/api/BlobStore.d.ts +21 -0
- package/dist/backend/api/BlobStore.js +63 -0
- package/dist/backend/api/CreateBackend.js +10 -8
- package/dist/backend/api/DatabaseApi.d.ts +4 -1
- package/dist/backend/api/DatabaseApi.js +104 -7
- package/dist/backend/api/GithubApi.d.ts +13 -0
- package/dist/backend/api/GithubApi.js +217 -54
- package/dist/backend/api/OAuth2.js +21 -26
- package/dist/backend/api/ProxyMedia.js +3 -0
- package/dist/backend/api/database.js +6 -6
- package/dist/backend/store/GeneratedDatabase.js +4 -2
- package/dist/backend/store/GeneratedDatabaseNode.d.ts +5 -1
- package/dist/backend/store/GeneratedDatabaseNode.js +9 -19
- package/dist/backend/store/GeneratedRelease.d.ts +1 -1
- package/dist/backend/store/GeneratedRelease.js +3 -4
- package/dist/backend/util/JWKS.d.ts +4 -0
- package/dist/backend/util/JWKS.js +40 -0
- package/dist/backend/util/Syncable.d.ts +6 -0
- package/dist/backend/util/Syncable.js +3 -1
- package/dist/bundled.d.ts +7124 -1459
- package/dist/chunks/{node-sqlite-XVNTNMCY.js → bun-sqlite-RI6BYU5S.js} +3 -3
- package/dist/chunks/ccitt-Y7TDCCPM.js +90 -0
- package/dist/chunks/{chunk-ASYKC6IE.js → chunk-2PP7WJUJ.js} +2 -12
- package/dist/chunks/{chunk-DWR5A5KL.js → chunk-4VKHBA57.js} +25 -6
- package/dist/chunks/{chunk-QJGGYF6E.js → chunk-4ZA6KZHS.js} +5 -5
- package/dist/chunks/{chunk-OFEKTDRF.js → chunk-7DDPSWRY.js} +8383 -5156
- package/dist/chunks/{chunk-ETWOY4AL.js → chunk-A2I6MCCS.js} +1 -1
- package/dist/chunks/chunk-CYVOGRSD.js +218 -0
- package/dist/chunks/{chunk-TIJTT5ZI.js → chunk-G43W7AME.js} +1 -0
- package/dist/chunks/{chunk-KMLLLZ6X.js → chunk-NP4M2257.js} +1 -0
- package/dist/chunks/{chunk-D6RGFNUW.js → chunk-PMGIIYDD.js} +14215 -8950
- package/dist/chunks/{chunk-IYAQC63Y.js → chunk-PSSMQKAH.js} +1607 -744
- package/dist/chunks/{chunk-AIU6CMVT.js → chunk-PTYZMV5G.js} +1 -1
- package/dist/chunks/{chunk-66YZ47TY.js → chunk-RAR44T5O.js} +1 -1
- package/dist/chunks/chunk-RE6CDK2M.js +254 -0
- package/dist/chunks/{chunk-UPY2RUZF.js → chunk-TWBREZWC.js} +30 -0
- package/dist/chunks/{chunk-QSN6RH6X.js → chunk-VA6NC3MI.js} +1 -1
- package/dist/chunks/dist-IDG44KDI.js +7499 -0
- package/dist/chunks/jpeg-OJTBZV3C.js +292 -0
- package/dist/chunks/jpx-4VRYG2JB.js +667 -0
- package/dist/chunks/{bun-sqlite-5SHXN3AT.js → node-sqlite-C7VJ2NSN.js} +3 -3
- package/dist/cli/Generate.d.ts +2 -1
- package/dist/cli/Generate.js +55 -24
- package/dist/cli/Init.d.ts +43 -2
- package/dist/cli/Init.js +144 -28
- package/dist/cli/Mcp.d.ts +25 -0
- package/dist/cli/Mcp.js +106 -0
- package/dist/cli/Serve.d.ts +1 -1
- package/dist/cli/Serve.js +14 -6
- package/dist/cli/bin.js +33 -11
- package/dist/cli/build/BuildEmitter.d.ts +5 -1
- package/dist/cli/build/BuildEmitter.js +8 -3
- package/dist/cli/generate/CompileConfig.js +10 -6
- package/dist/cli/generate/CopyStaticFiles.d.ts +1 -1
- package/dist/cli/generate/CopyStaticFiles.js +27 -14
- package/dist/cli/generate/DevDB.d.ts +4 -1
- package/dist/cli/generate/DevDB.js +15 -7
- package/dist/cli/generate/GenerateContext.d.ts +3 -0
- package/dist/cli/generate/GenerateDashboard.d.ts +1 -1
- package/dist/cli/generate/GenerateDashboard.js +20 -6
- package/dist/cli/generate/GeneratedPaths.d.ts +21 -0
- package/dist/cli/generate/GeneratedPaths.js +33 -0
- package/dist/cli/generate/LinkMediaFiles.d.ts +7 -0
- package/dist/cli/generate/LinkMediaFiles.js +52 -0
- package/dist/cli/generate/MediaLocations.d.ts +18 -0
- package/dist/cli/generate/MediaLocations.js +69 -0
- package/dist/cli/serve/CreateLocalServer.d.ts +2 -1
- package/dist/cli/serve/CreateLocalServer.js +41 -11
- package/dist/cli/serve/DevLock.d.ts +11 -0
- package/dist/cli/serve/DevLock.js +42 -0
- package/dist/cli/serve/DevServer.d.ts +3 -2
- package/dist/cli/serve/DevServer.js +18 -6
- package/dist/cli/serve/LiveReload.d.ts +1 -1
- package/dist/cli/serve/LiveReload.js +3 -2
- package/dist/cli/serve/ServeContext.d.ts +0 -1
- package/dist/cli/serve/StartServer.d.ts +2 -1
- package/dist/cli/serve/StartServer.js +4 -2
- package/dist/cli/serve/mcp/DevMcp.d.ts +16 -0
- package/dist/cli/serve/mcp/DevMcp.js +50 -0
- package/dist/cli/serve/mcp/McpGraph.d.ts +35 -0
- package/dist/cli/serve/mcp/McpGraph.js +64 -0
- package/dist/cli/serve/mcp/McpInput.d.ts +11 -0
- package/dist/cli/serve/mcp/McpInput.js +254 -0
- package/dist/cli/serve/mcp/McpInstructions.d.ts +1 -0
- package/dist/cli/serve/mcp/McpInstructions.js +16 -0
- package/dist/cli/serve/mcp/McpSchema.d.ts +31 -0
- package/dist/cli/serve/mcp/McpSchema.js +184 -0
- package/dist/cli/serve/mcp/McpServer.d.ts +47 -0
- package/dist/cli/serve/mcp/McpServer.js +112 -0
- package/dist/cli/serve/mcp/McpTools.d.ts +25 -0
- package/dist/cli/serve/mcp/McpTools.js +618 -0
- package/dist/cli/static/dashboard/entry.js +2 -1
- package/dist/cli/static/init/agents.md +13 -0
- package/dist/cli/static/init/cms.js +4 -2
- package/dist/cli/util/ForwardCommand.js +4 -12
- package/dist/cli/util/PublicDefines.d.ts +1 -0
- package/dist/cli/util/PublicDefines.js +2 -1
- package/dist/cli/util/RunForwarded.d.ts +13 -0
- package/dist/cli/util/RunForwarded.js +166 -0
- package/dist/cli/util/WarnPublicEnv.js +2 -0
- package/dist/cloud/CloudHandshake.js +9 -46
- package/dist/cloud/CloudRemote.js +21 -7
- package/dist/cms.d.ts +21 -0
- package/dist/cms.js +49 -0
- package/dist/components/Alert.d.ts +29 -0
- package/dist/components/Alert.js +86 -0
- package/dist/components/AppShell.d.ts +15 -0
- package/dist/components/AppShell.js +38 -0
- package/dist/components/AsyncList.d.ts +52 -0
- package/dist/components/AsyncList.js +69 -0
- package/dist/components/Badge.d.ts +13 -0
- package/dist/components/Badge.js +53 -0
- package/dist/components/Blockquote.d.ts +7 -0
- package/dist/components/Blockquote.js +26 -0
- package/dist/components/Breadcrumbs.d.ts +39 -3
- package/dist/components/Breadcrumbs.js +103 -22
- package/dist/components/Button.d.ts +33 -8
- package/dist/components/Button.js +73 -23
- package/dist/components/Calendar.d.ts +28 -3
- package/dist/components/Calendar.js +163 -54
- package/dist/components/Checkbox.d.ts +18 -7
- package/dist/components/Checkbox.js +84 -38
- package/dist/components/CheckboxGroup.d.ts +11 -5
- package/dist/components/CheckboxGroup.js +55 -19
- package/dist/components/Code.d.ts +10 -0
- package/dist/components/Code.js +49 -0
- package/dist/components/Collapsible.d.ts +25 -0
- package/dist/components/Collapsible.js +146 -0
- package/dist/components/ColorSwatch.d.ts +9 -2
- package/dist/components/ColorSwatch.js +20 -20
- package/dist/components/ColorSwatchPicker.d.ts +18 -3
- package/dist/components/ColorSwatchPicker.js +31 -27
- package/dist/components/ComboBox.d.ts +46 -10
- package/dist/components/ComboBox.js +223 -94
- package/dist/components/Command.d.ts +66 -0
- package/dist/components/Command.js +237 -0
- package/dist/components/ContentCard.d.ts +32 -0
- package/dist/components/ContentCard.js +221 -0
- package/dist/components/ContentGrid.d.ts +58 -0
- package/dist/components/ContentGrid.js +220 -0
- package/dist/components/DataList.d.ts +27 -0
- package/dist/components/DataList.js +68 -0
- package/dist/components/DateField.d.ts +19 -4
- package/dist/components/DateField.js +51 -44
- package/dist/components/DatePicker.d.ts +17 -4
- package/dist/components/DatePicker.js +61 -68
- package/dist/components/DateRangePicker.d.ts +19 -4
- package/dist/components/DateRangePicker.js +69 -80
- package/dist/components/Dialog.d.ts +64 -3
- package/dist/components/Dialog.js +215 -20
- package/dist/components/DropZone.d.ts +25 -3
- package/dist/components/DropZone.js +99 -18
- package/dist/components/DropdownMenu.d.ts +78 -0
- package/dist/components/DropdownMenu.js +318 -0
- package/dist/components/Empty.d.ts +46 -0
- package/dist/components/Empty.js +93 -0
- package/dist/components/Field.d.ts +34 -0
- package/dist/components/Field.js +166 -0
- package/dist/components/FileTrigger.d.ts +21 -0
- package/dist/components/FileTrigger.js +53 -0
- package/dist/components/FoldIcon.js +2 -1
- package/dist/components/Form.d.ts +23 -0
- package/dist/components/Form.js +64 -0
- package/dist/components/Heading.d.ts +13 -0
- package/dist/components/Heading.js +48 -0
- package/dist/components/Icon.d.ts +1 -1
- package/dist/components/Icon.js +3 -3
- package/dist/components/Kbd.d.ts +8 -0
- package/dist/components/Kbd.js +27 -0
- package/dist/components/Link.d.ts +21 -4
- package/dist/components/Link.js +22 -20
- package/dist/components/List.d.ts +23 -63
- package/dist/components/List.js +131 -251
- package/dist/components/MediaPreview.d.ts +35 -0
- package/dist/components/MediaPreview.js +227 -0
- package/dist/components/MultipleSelect.d.ts +27 -20
- package/dist/components/MultipleSelect.js +234 -216
- package/dist/components/NavRail.d.ts +41 -0
- package/dist/components/NavRail.js +121 -0
- package/dist/components/NumberField.d.ts +23 -5
- package/dist/components/NumberField.js +103 -60
- package/dist/components/Page.d.ts +57 -0
- package/dist/components/Page.js +130 -0
- package/dist/components/Popover.d.ts +39 -5
- package/dist/components/Popover.js +146 -22
- package/dist/components/PreviewFrame.d.ts +46 -0
- package/dist/components/PreviewFrame.js +182 -0
- package/dist/components/RadioGroup.d.ts +20 -7
- package/dist/components/RadioGroup.js +121 -31
- package/dist/components/Resizable.d.ts +51 -0
- package/dist/components/Resizable.js +1349 -0
- package/dist/components/SearchField.d.ts +42 -6
- package/dist/components/SearchField.js +117 -56
- package/dist/components/Select.d.ts +38 -10
- package/dist/components/Select.js +179 -101
- package/dist/components/Sheet.d.ts +52 -0
- package/dist/components/Sheet.js +216 -0
- package/dist/components/Sidebar.d.ts +56 -0
- package/dist/components/Sidebar.js +136 -0
- package/dist/components/SortableList.d.ts +84 -0
- package/dist/components/SortableList.js +368 -0
- package/dist/components/Spinner.d.ts +8 -0
- package/dist/components/Spinner.js +86 -0
- package/dist/components/Stack.d.ts +20 -0
- package/dist/components/Stack.js +45 -0
- package/dist/components/Surface.js +13 -3
- package/dist/components/Switch.d.ts +15 -4
- package/dist/components/Switch.js +30 -18
- package/dist/components/Table.d.ts +121 -14
- package/dist/components/Table.js +537 -96
- package/dist/components/Tabs.d.ts +33 -12
- package/dist/components/Tabs.js +68 -51
- package/dist/components/TagGroup.d.ts +26 -9
- package/dist/components/TagGroup.js +97 -31
- package/dist/components/Text.d.ts +16 -0
- package/dist/components/Text.js +44 -0
- package/dist/components/TextField.d.ts +33 -9
- package/dist/components/TextField.js +152 -47
- package/dist/components/TimeField.d.ts +25 -4
- package/dist/components/TimeField.js +82 -42
- package/dist/components/Timestamp.d.ts +17 -0
- package/dist/components/Timestamp.js +131 -0
- package/dist/components/Toggle.d.ts +15 -7
- package/dist/components/Toggle.js +4 -54
- package/dist/components/ToggleGroup.d.ts +33 -0
- package/dist/components/ToggleGroup.js +90 -0
- package/dist/components/Toolbar.d.ts +27 -8
- package/dist/components/Toolbar.js +51 -40
- package/dist/components/Tooltip.d.ts +22 -4
- package/dist/components/Tooltip.js +78 -34
- package/dist/components/Tree.d.ts +47 -20
- package/dist/components/Tree.js +230 -98
- package/dist/components/internal/Accept.d.ts +5 -0
- package/dist/components/internal/Accept.js +17 -0
- package/dist/components/internal/DateControl.d.ts +18 -0
- package/dist/components/internal/DateControl.js +92 -0
- package/dist/components/internal/DateValue.d.ts +16 -0
- package/dist/components/internal/DateValue.js +40 -0
- package/dist/components/internal/FormScope.d.ts +2 -0
- package/dist/components/internal/FormScope.js +8 -0
- package/dist/components/internal/ListBoxGroup.d.ts +12 -0
- package/dist/components/internal/ListBoxGroup.js +46 -0
- package/dist/components/internal/ListBoxOption.d.ts +20 -0
- package/dist/components/internal/ListBoxOption.js +111 -0
- package/dist/components/internal/Locale.d.ts +7 -0
- package/dist/components/internal/Locale.js +18 -0
- package/dist/components/internal/Placement.d.ts +3 -0
- package/dist/components/internal/Placement.js +13 -0
- package/dist/components/internal/PopoverSurface.d.ts +21 -0
- package/dist/components/internal/PopoverSurface.js +67 -0
- package/dist/components/internal/SelectionCheckbox.d.ts +8 -0
- package/dist/components/internal/SelectionCheckbox.js +57 -0
- package/dist/components/internal/Slot.d.ts +7 -0
- package/dist/components/internal/Slot.js +26 -0
- package/dist/components/internal/ToggleButton.d.ts +26 -0
- package/dist/components/internal/ToggleButton.js +68 -0
- package/dist/components/internal/Trigger.d.ts +16 -0
- package/dist/components/internal/Trigger.js +34 -0
- package/dist/components/internal/sortableDrag.d.ts +19 -0
- package/dist/components/internal/sortableDrag.js +175 -0
- package/dist/components/internal/useDragDrop.d.ts +22 -0
- package/dist/components/internal/useDragDrop.js +110 -0
- package/dist/components/types.d.ts +110 -0
- package/dist/components/types.js +0 -0
- package/dist/components.d.ts +33 -5
- package/dist/components.js +32 -5
- package/dist/config.d.ts +2 -0
- package/dist/config.js +12 -0
- package/dist/core/Client.js +12 -1
- package/dist/core/Config.d.ts +60 -2
- package/dist/core/Config.js +162 -9
- package/dist/core/Connection.d.ts +13 -1
- package/dist/core/Connection.js +9 -1
- package/dist/core/DashboardEntry.d.ts +19 -0
- package/dist/core/DashboardEntry.js +0 -0
- package/dist/core/Document.d.ts +12 -2
- package/dist/core/Document.js +39 -7
- package/dist/core/EntryFields.d.ts +11 -0
- package/dist/core/EntrySeed.d.ts +5 -1
- package/dist/core/EntrySeed.js +5 -6
- package/dist/core/Expr.d.ts +11 -0
- package/dist/core/Field.d.ts +39 -3
- package/dist/core/Field.js +25 -2
- package/dist/core/Filter.d.ts +31 -1
- package/dist/core/Filter.js +5 -0
- package/dist/core/Graph.d.ts +36 -8
- package/dist/core/Infer.d.ts +17 -0
- package/dist/core/Internal.d.ts +3 -0
- package/dist/core/Internal.js +4 -0
- package/dist/core/Overview.d.ts +315 -0
- package/dist/core/Overview.js +48 -0
- package/dist/core/Role.d.ts +6 -1
- package/dist/core/Role.js +55 -53
- package/dist/core/Root.d.ts +32 -3
- package/dist/core/Root.js +17 -7
- package/dist/core/Schema.js +7 -2
- package/dist/core/Scope.d.ts +14 -0
- package/dist/core/Scope.js +88 -10
- package/dist/core/TextDoc.d.ts +14 -1
- package/dist/core/Type.d.ts +71 -11
- package/dist/core/Type.js +67 -17
- package/dist/core/Validation.d.ts +60 -0
- package/dist/core/Validation.js +116 -0
- package/dist/core/Workspace.d.ts +1 -0
- package/dist/core/Workspace.js +5 -1
- package/dist/core/db/EntryReference.d.ts +8 -1
- package/dist/core/db/LinkResolver.d.ts +3 -0
- package/dist/core/db/LocalStore.d.ts +19 -0
- package/dist/core/db/Operation.d.ts +28 -1
- package/dist/core/db/Operation.js +161 -25
- package/dist/core/db/SyncStats.d.ts +16 -0
- package/dist/core/db/SyncStats.js +56 -0
- package/dist/core/db/WriteableGraph.d.ts +6 -14
- package/dist/core/db/WriteableGraph.js +5 -3
- package/dist/core/field/CreateField.d.ts +2 -3
- package/dist/core/field/ListField.js +29 -10
- package/dist/core/field/RecordField.js +12 -4
- package/dist/core/field/RichTextField.js +81 -24
- package/dist/core/field/ScalarField.d.ts +2 -2
- package/dist/core/field/UnionField.js +27 -4
- package/dist/core/media/CompressPdf.browser.d.ts +5 -0
- package/dist/core/media/CompressPdf.browser.js +13 -0
- package/dist/core/media/CompressPdf.d.ts +6 -0
- package/dist/core/media/CompressPdf.js +45 -0
- package/dist/core/media/CreatePreview.browser.d.ts +5 -1
- package/dist/core/media/CreatePreview.browser.js +16 -0
- package/dist/core/media/CreatePreview.d.ts +2 -1
- package/dist/core/media/CreatePreview.js +2 -0
- package/dist/core/media/FileAccept.d.ts +7 -0
- package/dist/core/media/FileAccept.js +29 -0
- package/dist/core/media/FileKinds.d.ts +10 -0
- package/dist/core/media/FileKinds.js +25 -0
- package/dist/core/media/ImageTransform.d.ts +78 -0
- package/dist/core/media/ImageTransform.js +108 -0
- package/dist/core/media/MediaRoot.js +4 -4
- package/dist/core/media/MediaTypes.d.ts +137 -9
- package/dist/core/media/MediaTypes.js +277 -51
- package/dist/core/media/Pdf.d.ts +15 -0
- package/dist/core/media/Pdf.js +31 -0
- package/dist/core/media/Summary.d.ts +9 -9
- package/dist/core/media/Summary.js +10 -10
- package/dist/core/media/TransformImage.browser.d.ts +7 -0
- package/dist/core/media/TransformImage.browser.js +38 -0
- package/dist/core/media/TransformImage.d.ts +7 -0
- package/dist/core/media/TransformImage.js +38 -0
- package/dist/core/source/GithubSource.d.ts +4 -0
- package/dist/core/source/GithubSource.js +127 -25
- package/dist/core/source/GithubUsage.d.ts +21 -0
- package/dist/core/source/GithubUsage.js +47 -0
- package/dist/core/source/Source.d.ts +2 -0
- package/dist/core/source/Source.js +11 -0
- package/dist/core/text/MarkdownToTextDoc.d.ts +29 -0
- package/dist/core/text/MarkdownToTextDoc.js +524 -0
- package/dist/core/text/TextDocToMarkdown.d.ts +20 -0
- package/dist/core/text/TextDocToMarkdown.js +316 -0
- package/dist/core/util/Async.d.ts +2 -0
- package/dist/core/util/Async.js +12 -1
- package/dist/core/util/Checks.js +1 -1
- package/dist/core/util/JWT.d.ts +1 -1
- package/dist/core/util/Objects.d.ts +2 -0
- package/dist/core/util/Objects.js +7 -0
- package/dist/core/util/OrderKeys.d.ts +11 -0
- package/dist/core/util/OrderKeys.js +64 -0
- package/dist/core/util/Slugs.js +4 -3
- package/dist/core.d.ts +3 -0
- package/dist/core.js +8 -1
- package/dist/dashboard/App.css +56 -86
- package/dist/dashboard/App.d.ts +6 -2
- package/dist/dashboard/App.js +41 -20
- package/dist/dashboard/Href.d.ts +37 -0
- package/dist/dashboard/Href.js +46 -0
- package/dist/dashboard/ViewKeys.d.ts +2 -0
- package/dist/dashboard/ViewKeys.js +2 -0
- package/dist/dashboard/app/AccessDenied.js +26 -18
- package/dist/dashboard/app/ActivityStatus.d.ts +5 -4
- package/dist/dashboard/app/ActivityStatus.js +138 -153
- package/dist/dashboard/app/AppearanceToggle.js +31 -12
- package/dist/dashboard/app/AuthView.js +75 -63
- package/dist/dashboard/app/BlockSheet.d.ts +50 -0
- package/dist/dashboard/app/BlockSheet.js +207 -0
- package/dist/dashboard/app/BlockSheetStoryFrame.d.ts +6 -0
- package/dist/dashboard/app/BlockSheetStoryFrame.js +29 -0
- package/dist/dashboard/app/BlockTabs.d.ts +12 -0
- package/dist/dashboard/app/BlockTabs.js +26 -0
- package/dist/dashboard/app/CompactField.d.ts +19 -6
- package/dist/dashboard/app/CompactField.js +177 -50
- package/dist/dashboard/app/CroppedImage.d.ts +17 -0
- package/dist/dashboard/app/CroppedImage.js +73 -0
- package/dist/dashboard/app/DashboardErrorBoundary.js +27 -15
- package/dist/dashboard/app/DashboardLayout.d.ts +5 -3
- package/dist/dashboard/app/DashboardLayout.js +59 -37
- package/dist/dashboard/app/EntryActions.d.ts +11 -0
- package/dist/dashboard/app/EntryActions.js +30 -0
- package/dist/dashboard/app/EntryFields.d.ts +26 -13
- package/dist/dashboard/app/EntryFields.js +19 -9
- package/dist/dashboard/app/EntryForm.d.ts +6 -0
- package/dist/dashboard/app/EntryForm.js +28 -0
- package/dist/dashboard/app/EntryHeader.d.ts +2 -2
- package/dist/dashboard/app/EntryHeader.js +226 -144
- package/dist/dashboard/app/EntryHeaderActions.d.ts +4 -1
- package/dist/dashboard/app/EntryHeaderActions.js +8 -12
- package/dist/dashboard/app/EntryReferences.d.ts +13 -1
- package/dist/dashboard/app/EntryReferences.js +62 -55
- package/dist/dashboard/app/EntrySidebar.d.ts +7 -5
- package/dist/dashboard/app/EntrySidebar.js +104 -98
- package/dist/dashboard/app/EntrySidebarPreview.d.ts +4 -1
- package/dist/dashboard/app/EntrySidebarPreview.js +37 -106
- package/dist/dashboard/app/EntrySidebarToggle.js +5 -6
- package/dist/dashboard/app/EntryStatusIcon.d.ts +23 -0
- package/dist/dashboard/app/EntryStatusIcon.js +58 -0
- package/dist/dashboard/app/EntryTranslationBanner.js +37 -45
- package/dist/dashboard/app/EntryValidationModal.d.ts +13 -0
- package/dist/dashboard/app/EntryValidationModal.js +77 -0
- package/dist/dashboard/app/Explorer.d.ts +15 -6
- package/dist/dashboard/app/Explorer.js +276 -520
- package/dist/dashboard/app/ExplorerBatchActions.d.ts +19 -0
- package/dist/dashboard/app/ExplorerBatchActions.js +183 -0
- package/dist/dashboard/app/ExplorerBreadcrumbs.d.ts +13 -0
- package/dist/dashboard/app/ExplorerBreadcrumbs.js +119 -0
- package/dist/dashboard/app/ExplorerCards.d.ts +8 -3
- package/dist/dashboard/app/ExplorerCards.js +91 -289
- package/dist/dashboard/app/ExplorerControls.d.ts +20 -0
- package/dist/dashboard/app/ExplorerControls.js +170 -0
- package/dist/dashboard/app/ExplorerList.d.ts +7 -4
- package/dist/dashboard/app/ExplorerList.js +160 -95
- package/dist/dashboard/app/ExplorerModal.d.ts +2 -5
- package/dist/dashboard/app/ExplorerModal.js +7 -19
- package/dist/dashboard/app/ExplorerOverviewHeader.d.ts +6 -0
- package/dist/dashboard/app/ExplorerOverviewHeader.js +28 -0
- package/dist/dashboard/app/ExplorerPickerContent.d.ts +19 -3
- package/dist/dashboard/app/ExplorerPickerContent.js +87 -5
- package/dist/dashboard/app/ExplorerScope.d.ts +7 -0
- package/dist/dashboard/app/ExplorerScope.js +159 -0
- package/dist/dashboard/app/ExplorerTable.d.ts +8 -4
- package/dist/dashboard/app/ExplorerTable.js +150 -359
- package/dist/dashboard/app/ExplorerTabs.d.ts +12 -0
- package/dist/dashboard/app/ExplorerTabs.js +42 -0
- package/dist/dashboard/app/ExternalLinkPicker.js +45 -55
- package/dist/dashboard/app/FileKind.d.ts +8 -0
- package/dist/dashboard/app/FileKind.js +40 -0
- package/dist/dashboard/app/ImageEditor.d.ts +13 -0
- package/dist/dashboard/app/ImageEditor.js +302 -0
- package/dist/dashboard/app/ImageEditorCrop.d.ts +19 -0
- package/dist/dashboard/app/ImageEditorCrop.js +90 -0
- package/dist/dashboard/app/ImagePicker.d.ts +1 -1
- package/dist/dashboard/app/ImagePicker.js +30 -89
- package/dist/dashboard/app/LinkPicker.d.ts +1 -1
- package/dist/dashboard/app/LinkPicker.js +108 -126
- package/dist/dashboard/app/LocaleMenu.d.ts +4 -2
- package/dist/dashboard/app/LocaleMenu.js +59 -48
- package/dist/dashboard/app/MediaPreviewCell.d.ts +8 -0
- package/dist/dashboard/app/MediaPreviewCell.js +50 -0
- package/dist/dashboard/app/MoveConfirmDialog.d.ts +5 -0
- package/dist/dashboard/app/MoveConfirmDialog.js +79 -0
- package/dist/dashboard/app/MoveDialog.d.ts +10 -0
- package/dist/dashboard/app/MoveDialog.js +161 -0
- package/dist/dashboard/app/NodeEditor.d.ts +11 -0
- package/dist/dashboard/app/NodeEditor.js +13 -0
- package/dist/dashboard/app/OverviewCell.d.ts +15 -0
- package/dist/dashboard/app/OverviewCell.js +249 -0
- package/dist/dashboard/app/PendingUploadsDialog.d.ts +2 -0
- package/dist/dashboard/app/PendingUploadsDialog.js +49 -0
- package/dist/dashboard/app/PendingUploadsView.d.ts +20 -0
- package/dist/dashboard/app/PendingUploadsView.js +233 -0
- package/dist/dashboard/app/ReadOnlyBadge.d.ts +1 -1
- package/dist/dashboard/app/ReadOnlyBadge.js +1 -1
- package/dist/dashboard/app/RemoveDialog.d.ts +17 -0
- package/dist/dashboard/app/RemoveDialog.js +294 -0
- package/dist/dashboard/app/RemoveRedirect.d.ts +7 -0
- package/dist/dashboard/app/RemoveRedirect.js +123 -0
- package/dist/dashboard/app/SearchBar.d.ts +9 -0
- package/dist/dashboard/app/SearchBar.js +31 -0
- package/dist/dashboard/app/SidebarLayout.d.ts +2 -1
- package/dist/dashboard/app/SidebarLayout.js +28 -1133
- package/dist/dashboard/app/SidebarTree.d.ts +12 -6
- package/dist/dashboard/app/SidebarTree.js +220 -295
- package/dist/dashboard/app/ViewToggle.d.ts +1 -1
- package/dist/dashboard/app/ViewToggle.js +17 -10
- package/dist/dashboard/app/WorkspaceMenu.d.ts +5 -6
- package/dist/dashboard/app/WorkspaceMenu.js +76 -111
- package/dist/dashboard/app/WorkspaceRoots.d.ts +2 -4
- package/dist/dashboard/app/WorkspaceRoots.js +144 -172
- package/dist/dashboard/app/editor/FileEditor.js +161 -125
- package/dist/dashboard/app/editor/FilePreview.d.ts +8 -6
- package/dist/dashboard/app/editor/FilePreview.js +16 -143
- package/dist/dashboard/app/editor/MediaAltField.view.js +5 -5
- package/dist/dashboard/app/modals/CreateEntry.js +98 -106
- package/dist/dashboard/app/pages/EntryPage.d.ts +2 -1
- package/dist/dashboard/app/pages/EntryPage.js +139 -97
- package/dist/dashboard/app/pages/RootPage.js +4 -6
- package/dist/dashboard/app/pages/SplashPage.d.ts +19 -0
- package/dist/dashboard/app/pages/SplashPage.js +208 -193
- package/dist/dashboard/app/pages/UsersPage.d.ts +20 -1
- package/dist/dashboard/app/pages/UsersPage.js +182 -255
- package/dist/dashboard/app/ui/DashboardModal.d.ts +18 -12
- package/dist/dashboard/app/ui/DashboardModal.js +54 -69
- package/dist/dashboard/atoms/ReactiveNode.js +58 -19
- package/dist/dashboard/atoms/activity.d.ts +1 -0
- package/dist/dashboard/atoms/activity.js +8 -5
- package/dist/dashboard/atoms/auth.js +2 -2
- package/dist/dashboard/atoms/config.d.ts +5 -1
- package/dist/dashboard/atoms/core.d.ts +16 -2
- package/dist/dashboard/atoms/core.js +19 -7
- package/dist/dashboard/atoms/create.js +15 -14
- package/dist/dashboard/atoms/dashboard.d.ts +16 -0
- package/dist/dashboard/atoms/dashboard.js +11 -1
- package/dist/dashboard/atoms/editor.d.ts +7 -1
- package/dist/dashboard/atoms/editor.js +29 -42
- package/dist/dashboard/atoms/entry.d.ts +32 -42
- package/dist/dashboard/atoms/entry.js +240 -182
- package/dist/dashboard/atoms/entryTable.d.ts +10 -0
- package/dist/dashboard/atoms/entryTable.js +43 -0
- package/dist/dashboard/atoms/explorer.d.ts +212 -36
- package/dist/dashboard/atoms/explorer.js +597 -259
- package/dist/dashboard/atoms/graph.d.ts +5 -0
- package/dist/dashboard/atoms/graph.js +27 -2
- package/dist/dashboard/atoms/link.d.ts +2 -0
- package/dist/dashboard/atoms/link.js +11 -5
- package/dist/dashboard/atoms/move.d.ts +64 -0
- package/dist/dashboard/atoms/move.js +128 -0
- package/dist/dashboard/atoms/moveConfirmation.d.ts +34 -0
- package/dist/dashboard/atoms/moveConfirmation.js +95 -0
- package/dist/dashboard/atoms/nav.d.ts +36 -12
- package/dist/dashboard/atoms/nav.js +280 -53
- package/dist/dashboard/atoms/overview.d.ts +228 -0
- package/dist/dashboard/atoms/overview.js +519 -0
- package/dist/dashboard/atoms/remove.d.ts +112 -0
- package/dist/dashboard/atoms/remove.js +268 -0
- package/dist/dashboard/atoms/root.d.ts +44 -22
- package/dist/dashboard/atoms/root.js +294 -164
- package/dist/dashboard/atoms/upload.d.ts +105 -3
- package/dist/dashboard/atoms/upload.js +266 -11
- package/dist/dashboard/atoms/user.js +1 -1
- package/dist/dashboard/atoms/utils.d.ts +12 -4
- package/dist/dashboard/atoms/utils.js +35 -2
- package/dist/dashboard/boot/ActivityEvent.d.ts +1 -1
- package/dist/dashboard/boot/Boot.d.ts +2 -0
- package/dist/dashboard/boot/Boot.js +33 -18
- package/dist/dashboard/boot/BootDev.js +13 -10
- package/dist/dashboard/boot/BootProd.d.ts +6 -1
- package/dist/dashboard/boot/BootProd.js +3 -2
- package/dist/dashboard/boot/DashboardWorker.d.ts +7 -0
- package/dist/dashboard/boot/DashboardWorker.js +108 -24
- package/dist/dashboard/boot/LoadWorker.js +21 -11
- package/dist/dashboard/boot/SyncEvent.d.ts +7 -0
- package/dist/dashboard/boot/SyncEvent.js +14 -0
- package/dist/dashboard/boot/WorkerDB.d.ts +1 -0
- package/dist/dashboard/boot/WorkerDB.js +3 -0
- package/dist/dashboard/cms/EntryTable.d.ts +56 -0
- package/dist/dashboard/cms/EntryTable.js +273 -0
- package/dist/dashboard/cms/FieldChrome.d.ts +21 -0
- package/dist/dashboard/cms/FieldChrome.js +26 -0
- package/dist/dashboard/cms/ViewProps.d.ts +42 -0
- package/dist/dashboard/cms/ViewProps.js +0 -0
- package/dist/dashboard/cms/hooks.d.ts +120 -0
- package/dist/dashboard/cms/hooks.js +132 -0
- package/dist/dashboard/contexts.d.ts +59 -0
- package/dist/dashboard/contexts.js +43 -0
- package/dist/dashboard/editor/UseField.d.ts +29 -6
- package/dist/dashboard/fixture/cms.d.ts +2 -2
- package/dist/dashboard/hook/UseEntryEditor.d.ts +4 -1
- package/dist/dashboard/hook/UseEntryEditor.js +7 -3
- package/dist/dashboard/hook/UseGraph.d.ts +3 -1
- package/dist/dashboard/hook/UseLocale.d.ts +3 -1
- package/dist/dashboard/hook/UseRoot.d.ts +3 -1
- package/dist/dashboard/hook/UseSearchShortcut.d.ts +11 -0
- package/dist/dashboard/hook/UseSearchShortcut.js +32 -0
- package/dist/dashboard/hook/UseWorkspace.d.ts +3 -1
- package/dist/dashboard/hooks.d.ts +16 -98
- package/dist/dashboard/hooks.js +15 -90
- package/dist/dashboard/icons.d.ts +11 -0
- package/dist/dashboard/icons.js +125 -0
- package/dist/dashboard.d.ts +23 -1
- package/dist/dashboard.js +5 -2
- package/dist/database/BrowserEntryStore.d.ts +17 -24
- package/dist/database/BrowserEntryStore.js +139 -137
- package/dist/database/DatabaseTables.js +2 -2
- package/dist/database/EntryDatabase.d.ts +15 -1
- package/dist/database/EntryDatabase.js +61 -10
- package/dist/database/EntryStore.js +32 -20
- package/dist/database/EntryTransaction.d.ts +0 -5
- package/dist/database/EntryTransaction.js +173 -58
- package/dist/database/EntryUrlAliases.d.ts +4 -0
- package/dist/database/EntryUrlAliases.js +16 -10
- package/dist/database/Version.d.ts +2 -2
- package/dist/database/Version.js +1 -1
- package/dist/database/driver/RuntimeDatabase.js +3 -3
- package/dist/database/driver/WasmDatabase.d.ts +5 -18
- package/dist/database/driver/WasmDatabase.js +16 -15
- package/dist/database/entry/EntryTable.d.ts +5 -3
- package/dist/database/entry/EntryTable.js +34 -10
- package/dist/database/query/Condition.d.ts +9 -1
- package/dist/database/query/Condition.js +25 -6
- package/dist/database/query/EntryQuery.d.ts +4 -0
- package/dist/database/query/EntryQuery.js +148 -25
- package/dist/database/query/EntryReferences.d.ts +1 -1
- package/dist/database/query/EntryReferences.js +3 -2
- package/dist/database/query/Relation.d.ts +13 -1
- package/dist/database/query/Relation.js +33 -5
- package/dist/database/query/ResolveQuery.d.ts +1 -1
- package/dist/database/query/ResolveQuery.js +27 -18
- package/dist/database/query/Search.d.ts +10 -1
- package/dist/database/query/Search.js +83 -10
- package/dist/database/sync/Derive.d.ts +2 -1
- package/dist/database/sync/Derive.js +15 -10
- package/dist/database/sync/EntryParser.js +8 -7
- package/dist/database/sync/EntrySyncer.d.ts +3 -0
- package/dist/database/sync/EntrySyncer.js +10 -7
- package/dist/database/sync/Ingest.d.ts +2 -1
- package/dist/database/sync/Ingest.js +79 -49
- package/dist/database/sync/SyncQueries.d.ts +3 -2
- package/dist/database/sync/SyncQueries.js +19 -19
- package/dist/field/check/CheckField.js +3 -1
- package/dist/field/check/CheckField.view.js +13 -11
- package/dist/field/code/CodeField.d.ts +9 -0
- package/dist/field/code/CodeField.view.d.ts +3 -1
- package/dist/field/code/CodeField.view.js +30 -20
- package/dist/field/code/SimpleCodeEditor.js +0 -18
- package/dist/field/date/DateField.view.js +9 -25
- package/dist/field/link/EntryLink.d.ts +8 -9
- package/dist/field/link/FileLink.d.ts +11 -8
- package/dist/field/link/FileLink.js +7 -6
- package/dist/field/link/ImageLink.d.ts +16 -16
- package/dist/field/link/ImageLink.js +14 -23
- package/dist/field/link/Link.d.ts +1 -1
- package/dist/field/link/Link.js +2 -2
- package/dist/field/link/LinkField.d.ts +10 -5
- package/dist/field/link/LinkField.js +2 -0
- package/dist/field/link/LinkField.view.js +501 -684
- package/dist/field/link/UrlLink.d.ts +5 -4
- package/dist/field/link.d.ts +1 -0
- package/dist/field/list/ListField.d.ts +9 -5
- package/dist/field/list/ListField.js +10 -5
- package/dist/field/list/ListField.view.d.ts +15 -0
- package/dist/field/list/ListField.view.js +525 -645
- package/dist/field/localiser/LocalisedField.view.js +37 -88
- package/dist/field/localiser/LocalisedFieldTab.d.ts +7 -0
- package/dist/field/localiser/LocalisedFieldTab.js +30 -0
- package/dist/field/localiser/LocalisedFieldTabs.js +5 -5
- package/dist/field/localiser/Localiser.d.ts +17 -1
- package/dist/field/localiser/Localiser.js +152 -7
- package/dist/field/localiser/SelectLocale.d.ts +5 -0
- package/dist/field/localiser/SelectLocale.js +12 -0
- package/dist/field/metadata/MetadataAudit.d.ts +39 -0
- package/dist/field/metadata/MetadataAudit.js +124 -0
- package/dist/field/metadata/MetadataField.d.ts +20 -30
- package/dist/field/metadata/MetadataField.js +24 -107
- package/dist/field/metadata/MetadataField.view.d.ts +1 -0
- package/dist/field/metadata/MetadataField.view.js +36 -38
- package/dist/field/number/NumberField.view.js +9 -9
- package/dist/field/object/ObjectField.d.ts +3 -1
- package/dist/field/object/ObjectField.view.js +35 -25
- package/dist/field/path/PathField.view.js +3 -3
- package/dist/field/path/SlugField.d.ts +1 -2
- package/dist/field/path/SlugField.js +5 -7
- package/dist/field/richtext/PickTextAnchor.js +10 -10
- package/dist/field/richtext/PickTextLink.js +28 -41
- package/dist/field/richtext/RichTextBlock.d.ts +3 -1
- package/dist/field/richtext/RichTextBlock.js +190 -78
- package/dist/field/richtext/RichTextBlockHost.js +1 -1
- package/dist/field/richtext/RichTextExtensions.js +26 -20
- package/dist/field/richtext/RichTextField.story.d.ts +1 -0
- package/dist/field/richtext/RichTextField.view.js +13 -6
- package/dist/field/richtext/RichTextInsertMenu.js +59 -36
- package/dist/field/richtext/RichTextToolbar.js +82 -34
- package/dist/field/richtext/Toolbar.d.ts +9 -1
- package/dist/field/richtext/Toolbar.js +12 -2
- package/dist/field/richtext.d.ts +2 -0
- package/dist/field/richtext.js +2 -0
- package/dist/field/select/SelectField.view.js +15 -79
- package/dist/field/tabs/Tabs.d.ts +12 -3
- package/dist/field/tabs/Tabs.js +11 -2
- package/dist/field/tabs/Tabs.view.js +8 -8
- package/dist/field/text/TextField.view.js +9 -8
- package/dist/field/time/TimeField.view.js +10 -18
- package/dist/field/views.js +4 -0
- package/dist/field.d.ts +2 -2
- package/dist/field.js +3 -2
- package/dist/index.css +5408 -5223
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/next.cjs +27 -20
- package/dist/next.d.ts +2 -0
- package/dist/next.edge.d.ts +2 -0
- package/dist/picker/entry/EntryPicker.d.ts +11 -4
- package/dist/picker/entry/EntryPicker.js +15 -1
- package/dist/picker/url/UrlPicker.js +1 -0
- package/dist/preview/react.js +3 -0
- package/dist/preview/widget.d.ts +3 -0
- package/dist/preview/widget.js +26 -8
- package/dist/query.d.ts +41 -266
- package/dist/query.js +4 -0
- package/dist/types.d.ts +12 -5
- package/dist/ui/RichText.js +31 -1
- package/dist/ui/Stack.d.ts +4 -2
- package/docs/ai-agents.md +316 -0
- package/docs/ai-setup.md +297 -0
- package/docs/cli.md +96 -0
- package/docs/components/alert.md +122 -0
- package/docs/components/app-shell.md +77 -0
- package/docs/components/badge.md +89 -0
- package/docs/components/blockquote.md +24 -0
- package/docs/components/breadcrumb.md +83 -0
- package/docs/components/button.md +142 -0
- package/docs/components/calendar.md +32 -0
- package/docs/components/checkbox-group.md +38 -0
- package/docs/components/checkbox.md +61 -0
- package/docs/components/code.md +37 -0
- package/docs/components/collapsible.md +53 -0
- package/docs/components/color-swatch-picker.md +47 -0
- package/docs/components/combo-box.md +146 -0
- package/docs/components/command.md +101 -0
- package/docs/components/content-card.md +64 -0
- package/docs/components/content-grid.md +71 -0
- package/docs/components/data-list.md +64 -0
- package/docs/components/date-field.md +34 -0
- package/docs/components/date-picker.md +35 -0
- package/docs/components/date-range-picker.md +34 -0
- package/docs/components/dialog.md +233 -0
- package/docs/components/drop-zone.md +45 -0
- package/docs/components/dropdown-menu.md +223 -0
- package/docs/components/empty.md +81 -0
- package/docs/components/field.md +66 -0
- package/docs/components/file-trigger.md +33 -0
- package/docs/components/fold-icon.md +34 -0
- package/docs/components/form.md +67 -0
- package/docs/components/heading.md +33 -0
- package/docs/components/icon.md +43 -0
- package/docs/components/kbd.md +29 -0
- package/docs/components/link.md +45 -0
- package/docs/components/list.md +105 -0
- package/docs/components/media-preview.md +43 -0
- package/docs/components/multiple-select.md +48 -0
- package/docs/components/nav-rail.md +79 -0
- package/docs/components/number-field.md +53 -0
- package/docs/components/page.md +97 -0
- package/docs/components/popover.md +71 -0
- package/docs/components/preview-frame.md +63 -0
- package/docs/components/radio-group.md +47 -0
- package/docs/components/resizable-panel-group.md +63 -0
- package/docs/components/search-field.md +54 -0
- package/docs/components/select.md +127 -0
- package/docs/components/sidebar.md +104 -0
- package/docs/components/sortable-list.md +110 -0
- package/docs/components/spinner.md +29 -0
- package/docs/components/stack.md +42 -0
- package/docs/components/surface.md +54 -0
- package/docs/components/switch.md +52 -0
- package/docs/components/table.md +262 -0
- package/docs/components/tabs.md +120 -0
- package/docs/components/tag-group.md +56 -0
- package/docs/components/text-field.md +142 -0
- package/docs/components/text.md +44 -0
- package/docs/components/time-field.md +41 -0
- package/docs/components/timestamp.md +45 -0
- package/docs/components/toggle-group.md +46 -0
- package/docs/components/toggle.md +37 -0
- package/docs/components/toolbar.md +96 -0
- package/docs/components/tooltip.md +78 -0
- package/docs/components/tree.md +67 -0
- package/docs/components.md +169 -0
- package/docs/configuration.md +177 -0
- package/docs/content-model.md +87 -0
- package/docs/custom-fields.md +359 -0
- package/docs/dashboard-ui.md +3 -0
- package/docs/deploy/alinea-cloud.md +26 -0
- package/docs/deploy/self-host.md +195 -0
- package/docs/deploy.md +127 -0
- package/docs/editing-content.md +195 -0
- package/docs/fields/check.md +40 -0
- package/docs/fields/code.md +35 -0
- package/docs/fields/date.md +90 -0
- package/docs/fields/entry.md +179 -0
- package/docs/fields/file.md +60 -0
- package/docs/fields/image.md +138 -0
- package/docs/fields/link.md +121 -0
- package/docs/fields/list.md +149 -0
- package/docs/fields/number.md +58 -0
- package/docs/fields/object.md +93 -0
- package/docs/fields/path.md +105 -0
- package/docs/fields/rich-text.md +267 -0
- package/docs/fields/select.md +99 -0
- package/docs/fields/tabs.md +111 -0
- package/docs/fields/text.md +46 -0
- package/docs/fields/url.md +51 -0
- package/docs/fields.md +231 -0
- package/docs/get-started.md +3 -0
- package/docs/guides.md +3 -0
- package/docs/index.md +140 -0
- package/docs/instant-publishing.md +61 -0
- package/docs/internationalization.md +218 -0
- package/docs/introduction.md +5 -0
- package/docs/live-previews.md +151 -0
- package/docs/mcp.md +500 -0
- package/docs/overviews.md +580 -0
- package/docs/query/advanced.md +123 -0
- package/docs/query/examples.md +231 -0
- package/docs/query/filtering.md +162 -0
- package/docs/query/related.md +178 -0
- package/docs/query/structural.md +165 -0
- package/docs/query.md +190 -0
- package/docs/quickstart.md +203 -0
- package/docs/reference.md +3 -0
- package/docs/roles-permissions.md +234 -0
- package/docs/schema/document.md +100 -0
- package/docs/schema/type.md +133 -0
- package/docs/schema.md +66 -0
- package/docs/tutorial/step-1-landing-page.md +244 -0
- package/docs/tutorial/step-2-block-list.md +364 -0
- package/docs/tutorial/step-3-layout-root.md +200 -0
- package/docs/tutorial/step-4-blog.md +384 -0
- package/docs/tutorial/step-5-catch-all.md +222 -0
- package/docs/tutorial.md +21 -0
- package/docs/typescript.md +115 -0
- package/docs/upgrading.md +368 -0
- package/docs/workspaces/media.md +134 -0
- package/docs/workspaces/root.md +127 -0
- package/docs/workspaces.md +98 -0
- package/llms-full.txt +13007 -3217
- package/package.json +25 -6
- package/readme.md +136 -55
- package/dist/adapter/next/previews.spec.d.ts +0 -1
- package/dist/chunks/chunk-AC4U3IMS.js +0 -205
- package/dist/chunks/chunk-DNJX6CRV.js +0 -129
- package/dist/chunks/chunk-NIVGVRDS.js +0 -6363
- package/dist/chunks/chunk-S4AU6SRS.js +0 -5503
- package/dist/chunks/chunk-SJBZFMQ2.js +0 -2966
- package/dist/components/Disclosure.d.ts +0 -5
- package/dist/components/Disclosure.js +0 -106
- package/dist/components/Label.d.ts +0 -48
- package/dist/components/Label.js +0 -210
- package/dist/components/Menu.d.ts +0 -16
- package/dist/components/Menu.js +0 -95
- package/dist/components/Modal.d.ts +0 -7
- package/dist/components/Modal.js +0 -58
- package/dist/components/ProgressCircle.d.ts +0 -6
- package/dist/components/ProgressCircle.js +0 -96
- package/dist/dashboard/app/AppShell.d.ts +0 -4
- package/dist/dashboard/app/AppShell.js +0 -29
- package/dist/dashboard/app/Badge.d.ts +0 -8
- package/dist/dashboard/app/Badge.js +0 -42
- package/dist/dashboard/app/EditorBackButton.d.ts +0 -5
- package/dist/dashboard/app/EditorBackButton.js +0 -33
- package/dist/dashboard/app/EntrySidebarPreview.spec.d.ts +0 -1
- package/dist/dashboard/app/ExplorerFileCard.d.ts +0 -10
- package/dist/dashboard/app/ExplorerFileCard.js +0 -115
- package/dist/dashboard/app/StatusBadge.d.ts +0 -6
- package/dist/dashboard/app/StatusBadge.js +0 -26
- package/dist/dashboard/app/WorkspaceMenu.spec.d.ts +0 -1
- package/dist/dashboard/app/WorkspaceMenu.stories.d.ts +0 -7
- package/dist/dashboard/app/ui/Rail.d.ts +0 -18
- package/dist/dashboard/app/ui/Rail.js +0 -41
- package/dist/dashboard/app/ui/Sidebar.d.ts +0 -15
- package/dist/dashboard/app/ui/Sidebar.js +0 -55
- package/dist/field/link/LinkField.spec.d.ts +0 -1
- package/dist/field/link/LinkField.stories.d.ts +0 -15
- package/dist/field/list/ListField.spec.d.ts +0 -1
- package/dist/field/list/ListField.stories.d.ts +0 -7
- package/dist/field/richtext/RichTextField.spec.d.ts +0 -1
- package/dist/chunks/{chunk-MOWR65LM.js → chunk-PYDOMKJZ.js} +71 -71
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Structural
|
|
2
|
+
|
|
3
|
+
Most queries start by saying which entries you want: of a type, at a url, in a root, in a locale. Then you choose what to get back and in which order. This page covers both; to match on field values see [Filtering](filtering.md).
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
import {cms} from '@/cms'
|
|
7
|
+
import {BlogPost} from '@/schema'
|
|
8
|
+
import {Query} from 'alinea'
|
|
9
|
+
|
|
10
|
+
const posts = await cms.find({
|
|
11
|
+
type: BlogPost,
|
|
12
|
+
root: cms.workspaces.main.pages,
|
|
13
|
+
locale: 'en',
|
|
14
|
+
select: {title: Query.title, url: Query.url},
|
|
15
|
+
orderBy: {desc: BlogPost.publishDate},
|
|
16
|
+
take: 10
|
|
17
|
+
})
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Selecting entries
|
|
21
|
+
|
|
22
|
+
- `type`: a type, or an array of types to match any of them: `type: [Page, BlogPost]`. It also narrows the result type.
|
|
23
|
+
- `id`: the entry id.
|
|
24
|
+
- `url`: the entry's url, for example `'/blog/hello-world'`. Handy in a catch-all route.
|
|
25
|
+
- `path`: the entry's path, the last segment of its url.
|
|
26
|
+
- `parentId`: the id of the parent entry. `null` matches entries at the top of a root.
|
|
27
|
+
- `level`: the depth in the tree. `0` is the top of a root, `1` their children, and so on.
|
|
28
|
+
- `workspace` and `root`: a name, or the object from your CMS instance: `cms.workspaces.main`, `cms.workspaces.main.pages`.
|
|
29
|
+
- `location`: a workspace, a root or a seeded page. With a seeded page, such as `cms.workspaces.main.pages.blog`, it matches the entries below it.
|
|
30
|
+
- `alias`: a previous url stored in the entry's [metadata aliases](../schema/document.md), to redirect old urls.
|
|
31
|
+
- `createdAt` and `updatedAt`: the audit timestamps of documents, in Unix seconds.
|
|
32
|
+
|
|
33
|
+
`id`, `url`, `path`, `parentId`, `level`, `alias`, `createdAt`, `updatedAt`, `workspace` and `root` take a value or a condition with the [operators](filtering.md) from filters:
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
import {cms} from '@/cms'
|
|
37
|
+
import {Query} from 'alinea'
|
|
38
|
+
|
|
39
|
+
// Several ids
|
|
40
|
+
await cms.find({id: {in: ['2g8FtR', '2g8FtS']}})
|
|
41
|
+
|
|
42
|
+
// Everything below /docs
|
|
43
|
+
await cms.find({url: {startsWith: '/docs/'}})
|
|
44
|
+
|
|
45
|
+
// Top-level entries of a root, for a main menu
|
|
46
|
+
await cms.find({
|
|
47
|
+
root: cms.workspaces.main.pages,
|
|
48
|
+
level: 0,
|
|
49
|
+
select: {title: Query.title, url: Query.url}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
// Entries below a seeded page
|
|
53
|
+
await cms.find({location: cms.workspaces.main.pages.blog})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Locales
|
|
57
|
+
|
|
58
|
+
In a root with [i18n](../internationalization.md), every translation is a separate entry version. Without a `locale`, a query matches all of them, so `find` returns an entry once per language and `first` returns whichever comes first.
|
|
59
|
+
|
|
60
|
+
- `locale`: only entries in this locale (compared case-insensitively). `null` matches entries in roots without i18n.
|
|
61
|
+
- `preferredLocale`: entries in this locale plus entries without a locale. Use it when a query spans translated and untranslated roots.
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
import {cms} from '@/cms'
|
|
65
|
+
import {Query} from 'alinea'
|
|
66
|
+
|
|
67
|
+
export async function pageByUrl(locale: string, slug: Array<string>) {
|
|
68
|
+
return cms.first({
|
|
69
|
+
locale,
|
|
70
|
+
url: `/${[locale, ...slug].join('/')}`,
|
|
71
|
+
select: {title: Query.title, type: Query.type}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Status
|
|
77
|
+
|
|
78
|
+
`status` chooses between published, draft and archived versions:
|
|
79
|
+
|
|
80
|
+
- `'published'` (default): only published entries.
|
|
81
|
+
- `'draft'` or `'archived'`: only drafts, or only archived entries.
|
|
82
|
+
- `'preferDraft'`: one version per entry: the draft if there is one, then the published version, then the archived one.
|
|
83
|
+
- `'preferPublished'`: one version per entry: the published one if there is one, then the archived one, then the draft.
|
|
84
|
+
- `'preview'`: what a preview shows, like `preferDraft` without archived entries. An archived entry that is being previewed shows as published. This is the default in Next.js draft mode.
|
|
85
|
+
- `'all'`: every version, so an entry can appear more than once.
|
|
86
|
+
|
|
87
|
+
Relations inside the query use the same status.
|
|
88
|
+
|
|
89
|
+
## Choosing what to return
|
|
90
|
+
|
|
91
|
+
- `select`: the fields and properties to return, in any shape. A single expression, such as `select: Query.url`, returns plain values. See [What a query returns](../query.md).
|
|
92
|
+
- `include`: extra values to add to the full entry, typically [related entries](related.md). It only applies when there's no `select`; with a `select`, put everything in the select.
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
import {cms} from '@/cms'
|
|
96
|
+
import {BlogPost} from '@/schema'
|
|
97
|
+
import {Query} from 'alinea'
|
|
98
|
+
|
|
99
|
+
// All fields of the post, plus its parent
|
|
100
|
+
const post = await cms.get({
|
|
101
|
+
type: BlogPost,
|
|
102
|
+
path: 'hello-world',
|
|
103
|
+
include: {
|
|
104
|
+
blog: Query.parent({select: {title: Query.title, url: Query.url}})
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
// Only what the card needs
|
|
109
|
+
const card = await cms.get({
|
|
110
|
+
type: BlogPost,
|
|
111
|
+
path: 'hello-world',
|
|
112
|
+
select: {
|
|
113
|
+
title: Query.title,
|
|
114
|
+
intro: BlogPost.intro,
|
|
115
|
+
blog: Query.parent({select: {title: Query.title, url: Query.url}})
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Sorting and pagination
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
import {cms} from '@/cms'
|
|
124
|
+
import {BlogPost} from '@/schema'
|
|
125
|
+
import {Query} from 'alinea'
|
|
126
|
+
|
|
127
|
+
const page = 2
|
|
128
|
+
const perPage = 10
|
|
129
|
+
|
|
130
|
+
const posts = await cms.find({
|
|
131
|
+
type: BlogPost,
|
|
132
|
+
select: {title: Query.title, url: Query.url},
|
|
133
|
+
orderBy: [
|
|
134
|
+
// Newest first
|
|
135
|
+
{desc: BlogPost.publishDate},
|
|
136
|
+
// Same date: alphabetical
|
|
137
|
+
{asc: Query.title}
|
|
138
|
+
],
|
|
139
|
+
skip: (page - 1) * perPage,
|
|
140
|
+
take: perPage
|
|
141
|
+
})
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
- `orderBy`: one `{asc: ...}` or `{desc: ...}`, or an array to break ties. Pass a field or a `Query` property. Text is compared case-insensitively unless you add `caseSensitive: true`, and entries without a value come last in both directions.
|
|
145
|
+
- Without `orderBy`, entries come in their stored order: the order of siblings in the sidebar. Queries with `search` are ordered by relevance.
|
|
146
|
+
- `skip` and `take`: skip a number of results and return at most `take`. Both must be whole numbers of 0 or more. For the total, run `cms.count` with the same options but without `skip` and `take`.
|
|
147
|
+
|
|
148
|
+
## One entry per value
|
|
149
|
+
|
|
150
|
+
`groupBy` keeps one entry for every distinct value of a field or property: the first match in stored order, or the most relevant one when searching. Sorting and pagination apply afterwards, to the remaining entries.
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
import {cms} from '@/cms'
|
|
154
|
+
import {BlogPost} from '@/schema'
|
|
155
|
+
import {Query} from 'alinea'
|
|
156
|
+
|
|
157
|
+
// The first post of every blog
|
|
158
|
+
const firstPosts = await cms.find({
|
|
159
|
+
type: BlogPost,
|
|
160
|
+
groupBy: Query.parentId,
|
|
161
|
+
select: {title: Query.title, url: Query.url}
|
|
162
|
+
})
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`groupBy` takes a single field. Because the entry for each value is picked before sorting, it can't give you "the newest post per blog", and it doesn't return lists of entries per value: for those, query the entries and group them in your own code. Group on plain values such as text, select or date fields; link fields store a unique id per link, so they don't group.
|
package/docs/query.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Querying content
|
|
2
|
+
|
|
3
|
+
Read content with the methods on your CMS instance. Queries are plain objects, typed from your schema, and run on the server: in server components, route handlers, `generateMetadata` and `generateStaticParams`. They read from a local copy of your content that ships with your deploy and is kept in sync when the content changes, see [Instant publishing](instant-publishing.md).
|
|
4
|
+
|
|
5
|
+
File: app/page.tsx
|
|
6
|
+
```tsx
|
|
7
|
+
import {cms} from '@/cms'
|
|
8
|
+
import {HomePage} from '@/schema'
|
|
9
|
+
|
|
10
|
+
export default async function Page() {
|
|
11
|
+
const home = await cms.get({type: HomePage})
|
|
12
|
+
return <h1>{home.title}</h1>
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Methods
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import {cms} from '@/cms'
|
|
20
|
+
import {BlogPost} from '@/schema'
|
|
21
|
+
|
|
22
|
+
// All matches, as an array (possibly empty)
|
|
23
|
+
const posts = await cms.find({type: BlogPost})
|
|
24
|
+
|
|
25
|
+
// The first match, or null
|
|
26
|
+
const latest = await cms.first({
|
|
27
|
+
type: BlogPost,
|
|
28
|
+
orderBy: {desc: BlogPost.publishDate}
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// The first match, or throws "Entry not found"
|
|
32
|
+
const post = await cms.get({type: BlogPost, path: 'hello-world'})
|
|
33
|
+
|
|
34
|
+
// The number of matches
|
|
35
|
+
const total = await cms.count({type: BlogPost})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Use `first` when a missing entry is a normal case, such as a url that may not exist (call `notFound()` when it returns `null`), and `get` for entries that must exist, like a seeded home page.
|
|
39
|
+
|
|
40
|
+
## What a query returns
|
|
41
|
+
|
|
42
|
+
Without a `select`, you get the fields of the type you passed as `type`, plus the entry's own properties, prefixed with an underscore. A query without `type` returns only those properties.
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
import {cms} from '@/cms'
|
|
46
|
+
import {BlogPost} from '@/schema'
|
|
47
|
+
|
|
48
|
+
const post = await cms.get({type: BlogPost, path: 'hello-world'})
|
|
49
|
+
post.title // a field of the type
|
|
50
|
+
post.publishDate // "2026-09-23"
|
|
51
|
+
post.author // link fields are resolved: {title, url, ...} or null
|
|
52
|
+
post._id // the entry id
|
|
53
|
+
post._url // "/blog/hello-world"
|
|
54
|
+
post._locale // "en", or null in roots without i18n
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The entry properties are `_id`, `_type`, `_index`, `_workspace`, `_root`, `_status`, `_parentId`, `_locale`, `_path`, `_url`, `_createdAt` and `_updatedAt`.
|
|
58
|
+
|
|
59
|
+
With `select` you get exactly what you ask for, in the shape you ask for. Select fields through the type (`BlogPost.publishDate`) and entry properties through `Query`:
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
import {cms} from '@/cms'
|
|
63
|
+
import {BlogPost} from '@/schema'
|
|
64
|
+
import {Query} from 'alinea'
|
|
65
|
+
|
|
66
|
+
const cards = await cms.find({
|
|
67
|
+
type: BlogPost,
|
|
68
|
+
select: {
|
|
69
|
+
title: Query.title,
|
|
70
|
+
url: Query.url,
|
|
71
|
+
date: BlogPost.publishDate,
|
|
72
|
+
cover: BlogPost.cover
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
// Array<{title: string, url: string, date: string, cover: ImageLink | null}>
|
|
76
|
+
|
|
77
|
+
// A single expression returns plain values
|
|
78
|
+
const urls = await cms.find({type: BlogPost, select: Query.url})
|
|
79
|
+
// Array<string>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`Query` has `id`, `title`, `type`, `index`, `workspace`, `root`, `status`, `parentId`, `locale`, `path`, `url`, `aliases`, `createdAt` and `updatedAt`, plus the relation helpers such as `Query.children` and `Query.referencedBy` described in [Related content](query/related.md) and `Query.snippet` for [search results](query/filtering.md).
|
|
83
|
+
|
|
84
|
+
### Query fields and type fields
|
|
85
|
+
|
|
86
|
+
There are two kinds of references you can select. `Query.*` are the built-in properties every entry has, whatever its type: `Query.id`, `Query.title`, `Query.url` and the others above. The fields you define are selected through their type: `BlogPost.intro` is the `intro` field of `BlogPost`, `BlogPost.cover` its cover image. Type fields are typed from their definition and resolved like they are without a select, so `BlogPost.cover` returns an `ImageLink`. Combine both in one `select`:
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
import {cms} from '@/cms'
|
|
90
|
+
import {BlogPost} from '@/schema'
|
|
91
|
+
import {Query} from 'alinea'
|
|
92
|
+
|
|
93
|
+
const posts = await cms.find({
|
|
94
|
+
type: BlogPost,
|
|
95
|
+
select: {
|
|
96
|
+
// Built-in properties of the entry
|
|
97
|
+
id: Query.id,
|
|
98
|
+
title: Query.title,
|
|
99
|
+
url: Query.url,
|
|
100
|
+
// Fields of the BlogPost type
|
|
101
|
+
intro: BlogPost.intro,
|
|
102
|
+
cover: BlogPost.cover
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
// Array<{id: string, title: string, url: string, intro: string, cover: ImageLink | null}>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
A type field only has a value on entries of that type, so select it in a query for that `type` (or one filtered on `_type`). `Query` fields work in any query, also one without a `type`, such as a search across all entries. Fields that `Config.document` adds, like `title` and `path`, are available both ways: `Query.title` and `BlogPost.title` return the same value.
|
|
109
|
+
|
|
110
|
+
Fields inside an [object field](fields/object.md) are selected through the object: `Page.seo.title` returns the `title` of the `seo` object, typed like the field. That works wherever a field can be selected, also inside relations such as `Query.children`, and in `orderBy`:
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
import {cms} from '@/cms'
|
|
114
|
+
import {Config, Field, Query} from 'alinea'
|
|
115
|
+
|
|
116
|
+
export const Page = Config.document('Page', {
|
|
117
|
+
fields: {
|
|
118
|
+
seo: Field.object('SEO', {
|
|
119
|
+
fields: {
|
|
120
|
+
title: Field.text('SEO title'),
|
|
121
|
+
description: Field.text('SEO description')
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
const pages = await cms.find({
|
|
128
|
+
type: Page,
|
|
129
|
+
select: {url: Query.url, title: Page.seo.title},
|
|
130
|
+
orderBy: {asc: Page.seo.title}
|
|
131
|
+
})
|
|
132
|
+
// Array<{url: string, title: string}>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Selecting only what a page needs keeps the data you pass to client components small, and TypeScript infers the result either way. To name the type of a result, use `Awaited<ReturnType<typeof yourQueryFunction>>`.
|
|
136
|
+
|
|
137
|
+
## Query options
|
|
138
|
+
|
|
139
|
+
- Which entries: `type`, `id`, `path`, `url`, `parentId`, `workspace`, `root`, `location`, `level`, `locale`, `status` and more, see [Structural queries](query/structural.md).
|
|
140
|
+
- Matching content: `filter` on field values and `search` for full text, see [Filtering](query/filtering.md).
|
|
141
|
+
- Shape and order: `select`, `include`, `orderBy`, `groupBy`, `skip` and `take`, see [Structural queries](query/structural.md).
|
|
142
|
+
- Related entries: parents, children, siblings, translations and linked entries in the same query, see [Related content](query/related.md).
|
|
143
|
+
|
|
144
|
+
Options you pass as `undefined` are ignored, which makes it easy to build a query from optional parameters.
|
|
145
|
+
|
|
146
|
+
## Drafts and previews
|
|
147
|
+
|
|
148
|
+
Queries return published content by default. When Next.js draft mode is on, for example while an editor looks at a [live preview](live-previews.md), Alinea switches to drafts where they exist and applies the unsaved changes of the preview, without any change to your queries. Pass `status` to override this.
|
|
149
|
+
|
|
150
|
+
## Example schema
|
|
151
|
+
|
|
152
|
+
The examples in this chapter use this schema:
|
|
153
|
+
|
|
154
|
+
File: schema.ts
|
|
155
|
+
```tsx
|
|
156
|
+
import {Config, Field} from 'alinea'
|
|
157
|
+
|
|
158
|
+
export const Author = Config.document('Author', {
|
|
159
|
+
fields: {
|
|
160
|
+
avatar: Field.image('Avatar'),
|
|
161
|
+
bio: Field.text('Bio', {multiline: true})
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
export const Category = Config.document('Category', {fields: {}})
|
|
166
|
+
|
|
167
|
+
export const Blog = Config.document('Blog', {
|
|
168
|
+
contains: ['BlogPost'],
|
|
169
|
+
fields: {}
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
export const BlogPost = Config.document('Blog post', {
|
|
173
|
+
fields: {
|
|
174
|
+
publishDate: Field.date('Publish date'),
|
|
175
|
+
intro: Field.text('Intro', {multiline: true, searchable: true}),
|
|
176
|
+
featured: Field.check('Featured'),
|
|
177
|
+
cover: Field.image('Cover image'),
|
|
178
|
+
author: Field.entry('Author', {condition: {_type: 'Author'}}),
|
|
179
|
+
categories: Field.entry.multiple('Categories', {
|
|
180
|
+
condition: {_type: 'Category'}
|
|
181
|
+
}),
|
|
182
|
+
tags: Field.select.multiple('Tags', {
|
|
183
|
+
options: {news: 'News', release: 'Release', tutorial: 'Tutorial'}
|
|
184
|
+
}),
|
|
185
|
+
body: Field.richText('Body', {searchable: true})
|
|
186
|
+
}
|
|
187
|
+
})
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Structural (query/structural.md)
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Quickstart
|
|
2
|
+
|
|
3
|
+
Add Alinea to a Next.js project in a few steps. Prefer to let your coding agent do the work? Paste this prompt into Claude Code, Cursor or Codex and it follows the [AI-assisted setup guide](ai-setup.md).
|
|
4
|
+
|
|
5
|
+
> Read https://v2.alineacms.com/start.md and help me add Alinea to my Next.js project
|
|
6
|
+
|
|
7
|
+
## 1. Set up Next.js
|
|
8
|
+
|
|
9
|
+
Create a new Next.js project in a directory of your choice. To add Alinea to an existing project, skip to step 2. Alinea's Next.js integration uses the App Router and requires Node.js 24 or higher and React 19.
|
|
10
|
+
|
|
11
|
+
```shellscript
|
|
12
|
+
npx create-next-app@latest
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Note (info): Read the full instructions in the [Next.js docs](https://nextjs.org/docs/getting-started/installation)
|
|
16
|
+
|
|
17
|
+
## 2. Install Alinea
|
|
18
|
+
|
|
19
|
+
Navigate to the newly created project directory and install the package with your preferred package manager.
|
|
20
|
+
|
|
21
|
+
Variant: npm
|
|
22
|
+
```shellscript
|
|
23
|
+
npm install alinea@preview
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Variant: yarn
|
|
27
|
+
```shellscript
|
|
28
|
+
yarn add alinea@preview
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Variant: pnpm
|
|
32
|
+
```shellscript
|
|
33
|
+
pnpm add alinea@preview
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Variant: bun
|
|
37
|
+
```shellscript
|
|
38
|
+
bun add alinea@preview
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 3. Initialize the project
|
|
42
|
+
|
|
43
|
+
Alinea requires a [config file](configuration.md) which can be auto-generated by running `alinea init`. If you prefer plain JavaScript over TypeScript, rename the created file from `cms.ts` to `cms.js`.
|
|
44
|
+
|
|
45
|
+
Variant: npm
|
|
46
|
+
```shellscript
|
|
47
|
+
npx alinea@preview init
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Variant: yarn
|
|
51
|
+
```shellscript
|
|
52
|
+
yarn alinea init
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Variant: pnpm
|
|
56
|
+
```shellscript
|
|
57
|
+
pnpm alinea init
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Variant: bun
|
|
61
|
+
```shellscript
|
|
62
|
+
bun alinea init
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
In a Next.js project `alinea init` sets up everything the dashboard needs:
|
|
66
|
+
|
|
67
|
+
- `cms.ts` (in `src/` if your project has a `src` directory) holds your schema, workspaces and settings such as `baseUrl`, `handlerUrl: '/api/cms'` and `adminPath: '/admin'`. The production `baseUrl` is read from `NEXT_PUBLIC_VERCEL_PROJECT_PRODUCTION_URL`, which Vercel sets during the build. Replace it with the URL of your site when you deploy elsewhere.
|
|
68
|
+
- `app/(alinea)/api/cms/route.ts` is the API route the dashboard talks to. It passes your `cms` to `createHandler` from `alinea/next`. It imports `@/cms`, so check that the `@/*` path alias in `tsconfig.json` points to the folder that holds `cms.ts`.
|
|
69
|
+
- `content/pages/welcome.json` is a first entry. `content/media` holds the entries of the media library, the uploaded files themselves are written to `public/media` (the workspace's `mediaDir`).
|
|
70
|
+
- The `dev` and `build` scripts in `package.json` are rewritten to run through Alinea: `next dev` becomes `alinea dev -- next dev` and `next build` becomes `alinea build -- next build`.
|
|
71
|
+
- `/public/admin.html` and `/public/admin/` are added to `.gitignore`: `alinea build` writes the dashboard there.
|
|
72
|
+
|
|
73
|
+
## 4. Adjust Next.js config
|
|
74
|
+
|
|
75
|
+
Wrap your Next.js config with `withAlinea`. It serves the dashboard on your site at `adminPath`, forwards media file requests, and keeps the generated content package out of the server bundle:
|
|
76
|
+
|
|
77
|
+
Variant: next.config.ts
|
|
78
|
+
```tsx
|
|
79
|
+
import {withAlinea} from 'alinea/next'
|
|
80
|
+
import type {NextConfig} from 'next'
|
|
81
|
+
|
|
82
|
+
const nextConfig: NextConfig = {
|
|
83
|
+
// Your Next.js options
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export default withAlinea(nextConfig)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Variant: next.config.js
|
|
90
|
+
```tsx
|
|
91
|
+
const {withAlinea} = require('alinea/next')
|
|
92
|
+
|
|
93
|
+
const nextConfig = {
|
|
94
|
+
// Your Next.js options
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
module.exports = withAlinea(nextConfig)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 5. Start the dev server
|
|
101
|
+
|
|
102
|
+
Congratulations, Alinea is now ready to boot! Start your dev script:
|
|
103
|
+
|
|
104
|
+
Variant: npm
|
|
105
|
+
```shellscript
|
|
106
|
+
npm run dev
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Variant: yarn
|
|
110
|
+
```shellscript
|
|
111
|
+
yarn dev
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Variant: pnpm
|
|
115
|
+
```shellscript
|
|
116
|
+
pnpm dev
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Variant: bun
|
|
120
|
+
```shellscript
|
|
121
|
+
bun run dev
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The script runs `alinea dev -- next dev`: Alinea compiles `cms.ts`, starts its local server and then starts `next dev` with the settings `withAlinea` needs. Open the dashboard at [http://localhost:3000/admin](http://localhost:3000/admin) and have a look around.
|
|
125
|
+
|
|
126
|
+
Note (info): Running `npx alinea dev` on its own only starts the local dashboard on http://localhost:4500, not your site. Keep the `alinea dev -- next dev` form in your dev script so both run together and the dashboard is served from your Next.js app. The same goes for `alinea build -- next build`, which generates your content before the site is built.
|
|
127
|
+
|
|
128
|
+
## 6. Show content on a page
|
|
129
|
+
|
|
130
|
+
The generated `Page` type only has a title. Add an image and a body to it in `cms.ts`, and export it so your pages can query it:
|
|
131
|
+
|
|
132
|
+
File: cms.ts
|
|
133
|
+
```tsx
|
|
134
|
+
import {Config, Field} from 'alinea'
|
|
135
|
+
|
|
136
|
+
// Export the type so your pages can query it
|
|
137
|
+
export const Page = Config.document('Page', {
|
|
138
|
+
fields: {
|
|
139
|
+
cover: Field.image('Cover image'),
|
|
140
|
+
body: Field.richText('Body')
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Open the Welcome page in the dashboard, pick a cover image (upload one in the picker), write some text and publish. Then render it on your homepage by replacing `app/page.tsx`:
|
|
146
|
+
|
|
147
|
+
File: app/page.tsx
|
|
148
|
+
```tsx
|
|
149
|
+
import {cms, Page} from '@/cms'
|
|
150
|
+
import {RichText} from 'alinea/ui'
|
|
151
|
+
import Image from 'next/image'
|
|
152
|
+
import {notFound} from 'next/navigation'
|
|
153
|
+
|
|
154
|
+
export default async function Home() {
|
|
155
|
+
const page = await cms.first({type: Page, path: 'welcome'})
|
|
156
|
+
if (!page) notFound()
|
|
157
|
+
return (
|
|
158
|
+
<main>
|
|
159
|
+
<h1>{page.title}</h1>
|
|
160
|
+
{page.cover && (
|
|
161
|
+
<Image
|
|
162
|
+
src={page.cover.src}
|
|
163
|
+
width={page.cover.width}
|
|
164
|
+
height={page.cover.height}
|
|
165
|
+
alt={page.cover.alt ?? ''}
|
|
166
|
+
/>
|
|
167
|
+
)}
|
|
168
|
+
<RichText doc={page.body} />
|
|
169
|
+
</main>
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
`cms.first` finds the entry stored in `content/pages/welcome.json` by its path, and passing `type: Page` types the result. An image field returns the `src`, dimensions and alt text `next/image` needs, and `withAlinea` allows these urls in your image config. See the [Image field](fields/image.md) for blur placeholders and focal points, and the [Rich text field](fields/rich-text.md) for rendering rich text with your own components.
|
|
175
|
+
|
|
176
|
+
## 7. Enable live previews
|
|
177
|
+
|
|
178
|
+
To see the page you are editing next to the editor, set `preview: true` in `cms.ts` (`alinea init` leaves it commented out) and render the preview component in your root layout:
|
|
179
|
+
|
|
180
|
+
File: app/layout.tsx
|
|
181
|
+
```tsx
|
|
182
|
+
import {cms} from '@/cms'
|
|
183
|
+
|
|
184
|
+
export default function RootLayout({children}: {children: React.ReactNode}) {
|
|
185
|
+
return (
|
|
186
|
+
<html lang="en">
|
|
187
|
+
<body>
|
|
188
|
+
{children}
|
|
189
|
+
<cms.previews widget />
|
|
190
|
+
</body>
|
|
191
|
+
</html>
|
|
192
|
+
)
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The `widget` prop adds a small toolbar to your pages to switch to the dashboard, read more in [Live previews](live-previews.md).
|
|
197
|
+
|
|
198
|
+
## Next steps
|
|
199
|
+
|
|
200
|
+
- Define your content types in the [schema](schema.md) and pick [fields](fields.md).
|
|
201
|
+
- Render content in your pages with [queries](query.md).
|
|
202
|
+
- Follow the [tutorial](tutorial.md) to build a complete site.
|
|
203
|
+
- [Deploy](deploy.md) your site with a backend for publishing.
|