@cosmicdrift/kumiko-renderer 0.373.0 → 0.377.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/app/action-form-support.d.ts +58 -0
- package/dist/app/action-form-support.js +96 -0
- package/dist/app/client-actions.d.ts +46 -0
- package/dist/app/client-actions.js +60 -0
- package/dist/app/column-renderers.js +1 -1
- package/dist/app/config-edit-shim.js +1 -1
- package/dist/app/content-preview.js +1 -6
- package/dist/app/custom-screens.js +1 -1
- package/dist/app/dashboard-body.d.ts +1 -1
- package/dist/app/entity-list-expanded-row.d.ts +1 -1
- package/dist/app/entity-list-expanded-row.js +4 -0
- package/dist/app/form-schema.d.ts +1 -1
- package/dist/app/form-schema.js +2 -2
- package/dist/app/header-actions-bar.d.ts +19 -0
- package/dist/app/header-actions-bar.js +30 -0
- package/dist/app/kumiko-screen.d.ts +1 -1
- package/dist/app/kumiko-screen.js +134 -66
- package/dist/app/list-empty-content.d.ts +2 -2
- package/dist/app/list-empty-content.js +3 -2
- package/dist/app/list-facets.d.ts +1 -1
- package/dist/app/nav.js +2 -2
- package/dist/app/query-state-banners.d.ts +1 -1
- package/dist/app/reference-link.d.ts +1 -1
- package/dist/app/row-actions.d.ts +10 -2
- package/dist/app/row-actions.js +85 -6
- package/dist/app/secret-mint-body.d.ts +1 -1
- package/dist/app/secrets-edit-body.d.ts +1 -1
- package/dist/app/use-record-actions.d.ts +12 -0
- package/dist/app/use-record-actions.js +30 -0
- package/dist/app/write-failed-error.d.ts +1 -1
- package/dist/components/availability-options-select.d.ts +1 -1
- package/dist/components/embedded-list-field.d.ts +1 -1
- package/dist/components/embedded-list-field.js +1 -1
- package/dist/components/file-list-field.d.ts +1 -1
- package/dist/components/grid-cell-for-field.d.ts +4 -2
- package/dist/components/grid-cell-for-field.js +2 -2
- package/dist/components/multi-select-checkboxes.d.ts +1 -1
- package/dist/components/multi-select-checkboxes.js +1 -1
- package/dist/components/query-options-select.d.ts +1 -1
- package/dist/components/related-list-section.d.ts +1 -1
- package/dist/components/related-list-section.js +16 -3
- package/dist/components/render-edit-logic.d.ts +1 -1
- package/dist/components/render-edit-types.d.ts +2 -2
- package/dist/components/render-edit.d.ts +1 -1
- package/dist/components/render-edit.js +5 -3
- package/dist/components/render-field.d.ts +5 -2
- package/dist/components/render-field.js +103 -9
- package/dist/components/render-list.d.ts +1 -1
- package/dist/components/render-list.js +20 -4
- package/dist/components/write-form-section.d.ts +1 -1
- package/dist/components/write-form-section.js +1 -1
- package/dist/context/dispatcher-context.d.ts +1 -1
- package/dist/format-when.js +1 -1
- package/dist/headless/apex/css.d.ts +3 -0
- package/dist/headless/apex/css.js +298 -0
- package/dist/headless/apex/index.d.ts +236 -0
- package/dist/headless/apex/index.js +377 -0
- package/dist/headless/apex/lightbox.d.ts +4 -0
- package/dist/headless/apex/lightbox.js +81 -0
- package/dist/headless/contracts/asset.d.ts +15 -0
- package/dist/headless/contracts/asset.js +17 -0
- package/dist/headless/contracts/index.d.ts +3 -0
- package/dist/headless/contracts/index.js +1 -0
- package/dist/headless/contracts/locale.d.ts +7 -0
- package/dist/headless/contracts/locale.js +11 -0
- package/dist/headless/contracts/primitives.d.ts +93 -0
- package/dist/headless/contracts/primitives.js +21 -0
- package/dist/headless/dispatcher/index.d.ts +2 -0
- package/dist/headless/dispatcher/index.js +1 -0
- package/dist/headless/dispatcher/types.d.ts +86 -0
- package/dist/headless/dispatcher/types.js +34 -0
- package/dist/headless/form/form-controller.d.ts +2 -0
- package/dist/headless/form/form-controller.js +409 -0
- package/dist/headless/form/index.d.ts +3 -0
- package/dist/headless/form/index.js +2 -0
- package/dist/headless/form/types.d.ts +76 -0
- package/dist/headless/form/types.js +1 -0
- package/dist/headless/form/zod-bridge.d.ts +10 -0
- package/dist/headless/form/zod-bridge.js +103 -0
- package/dist/headless/format/document-values.d.ts +12 -0
- package/dist/headless/format/document-values.js +70 -0
- package/dist/headless/format/escape.d.ts +5 -0
- package/dist/headless/format/escape.js +75 -0
- package/dist/headless/format/html-template.d.ts +9 -0
- package/dist/headless/format/html-template.js +39 -0
- package/dist/headless/format/index.d.ts +12 -0
- package/dist/headless/format/index.js +237 -0
- package/dist/headless/format/money.d.ts +3 -0
- package/dist/headless/format/money.js +39 -0
- package/dist/headless/index.d.ts +14 -0
- package/dist/headless/index.js +9 -0
- package/dist/headless/locale-routing/index.d.ts +41 -0
- package/dist/headless/locale-routing/index.js +145 -0
- package/dist/headless/nav/index.d.ts +2 -0
- package/dist/headless/nav/index.js +1 -0
- package/dist/headless/nav/resolve.d.ts +2 -0
- package/dist/headless/nav/resolve.js +71 -0
- package/dist/headless/nav/types.d.ts +26 -0
- package/dist/headless/nav/types.js +1 -0
- package/dist/headless/store/create-store.d.ts +2 -0
- package/dist/headless/store/create-store.js +43 -0
- package/dist/headless/store/equality.d.ts +1 -0
- package/dist/headless/store/equality.js +34 -0
- package/dist/headless/store/index.d.ts +3 -0
- package/dist/headless/store/index.js +2 -0
- package/dist/headless/store/types.d.ts +7 -0
- package/dist/headless/store/types.js +10 -0
- package/dist/headless/view-model/edit.d.ts +18 -0
- package/dist/headless/view-model/edit.js +501 -0
- package/dist/headless/view-model/embedded-list.d.ts +27 -0
- package/dist/headless/view-model/embedded-list.js +63 -0
- package/dist/headless/view-model/index.d.ts +7 -0
- package/dist/headless/view-model/index.js +3 -0
- package/dist/headless/view-model/list-file-display.d.ts +3 -0
- package/dist/headless/view-model/list-file-display.js +27 -0
- package/dist/headless/view-model/list.d.ts +16 -0
- package/dist/headless/view-model/list.js +229 -0
- package/dist/headless/view-model/types.d.ts +382 -0
- package/dist/headless/view-model/types.js +1 -0
- package/dist/hooks/use-ai-text.d.ts +1 -1
- package/dist/hooks/use-form.d.ts +1 -1
- package/dist/hooks/use-form.js +1 -1
- package/dist/hooks/use-mutation.d.ts +1 -1
- package/dist/hooks/use-query.d.ts +1 -1
- package/dist/hooks/use-store.d.ts +1 -1
- package/dist/hooks/use-store.js +7 -7
- package/dist/hooks/use-stream-handler.d.ts +1 -1
- package/dist/i18n-defaults.js +7 -0
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +7 -4
- package/dist/live/csrf.d.ts +2 -0
- package/dist/live/csrf.js +60 -0
- package/dist/live/dispatcher-live.d.ts +7 -0
- package/dist/live/dispatcher-live.js +286 -0
- package/dist/live/envelopes.d.ts +101 -0
- package/dist/live/envelopes.js +35 -0
- package/dist/live/error-mapping.d.ts +16 -0
- package/dist/live/error-mapping.js +82 -0
- package/dist/live/index.d.ts +7 -0
- package/dist/live/index.js +5 -0
- package/dist/live/locale.d.ts +2 -0
- package/dist/live/locale.js +25 -0
- package/dist/live/sse-stream.d.ts +14 -0
- package/dist/live/sse-stream.js +128 -0
- package/dist/primitives.d.ts +53 -36
- package/dist/primitives.js +1 -1
- package/dist/session/session-ended.d.ts +1 -1
- package/dist/tokens.d.ts +3 -4
- package/dist/tokens.js +4 -5
- package/dist/web/app/app-schema-boot.d.ts +19 -0
- package/dist/web/app/app-schema-boot.js +124 -0
- package/dist/web/app/browser-locale.d.ts +22 -0
- package/dist/web/app/browser-locale.js +78 -0
- package/dist/web/app/client-plugin.d.ts +106 -0
- package/dist/web/app/client-plugin.js +12 -0
- package/dist/web/app/create-app.d.ts +104 -0
- package/dist/web/app/create-app.js +498 -0
- package/dist/web/app/create-public-surface.d.ts +36 -0
- package/dist/web/app/create-public-surface.js +40 -0
- package/dist/web/app/dashboard-body.d.ts +3 -0
- package/dist/web/app/dashboard-body.js +865 -0
- package/dist/web/app/dashboard-refresh.d.ts +6 -0
- package/dist/web/app/dashboard-refresh.js +15 -0
- package/dist/web/app/document-lang-sync.d.ts +4 -0
- package/dist/web/app/document-lang-sync.js +27 -0
- package/dist/web/app/draft-storage.d.ts +11 -0
- package/dist/web/app/draft-storage.js +53 -0
- package/dist/web/app/nav-providers-context.d.ts +13 -0
- package/dist/web/app/nav-providers-context.js +18 -0
- package/dist/web/app/nav.d.ts +40 -0
- package/dist/web/app/nav.js +231 -0
- package/dist/web/app/plain-content-editor.d.ts +3 -0
- package/dist/web/app/plain-content-editor.js +30 -0
- package/dist/web/app/relative-time.d.ts +10 -0
- package/dist/web/app/relative-time.js +56 -0
- package/dist/web/app/resolvers-context.d.ts +12 -0
- package/dist/web/app/resolvers-context.js +10 -0
- package/dist/web/app/rich-content-editor.d.ts +3 -0
- package/dist/web/app/rich-content-editor.js +15 -0
- package/dist/web/app/root-error-fallback.d.ts +2 -0
- package/dist/web/app/root-error-fallback.js +21 -0
- package/dist/web/app/screen-error-fallback.d.ts +6 -0
- package/dist/web/app/screen-error-fallback.js +17 -0
- package/dist/web/app/tiptap-editor.d.ts +3 -0
- package/dist/web/app/tiptap-editor.js +120 -0
- package/dist/web/app/toast-action-notifier.d.ts +5 -0
- package/dist/web/app/toast-action-notifier.js +17 -0
- package/dist/web/components/config-cascade.d.ts +13 -0
- package/dist/web/components/config-cascade.js +155 -0
- package/dist/web/components/config-source-badge.d.ts +6 -0
- package/dist/web/components/config-source-badge.js +55 -0
- package/dist/web/default-color-scheme.d.ts +2 -0
- package/dist/web/default-color-scheme.js +3 -0
- package/dist/web/icons.d.ts +94 -0
- package/dist/web/icons.js +100 -0
- package/dist/web/index.d.ts +78 -0
- package/dist/web/index.js +53 -0
- package/dist/web/layout/app-layout.d.ts +21 -0
- package/dist/web/layout/app-layout.js +8 -0
- package/dist/web/layout/avatar.d.ts +12 -0
- package/dist/web/layout/avatar.js +63 -0
- package/dist/web/layout/default-app-shell.d.ts +41 -0
- package/dist/web/layout/default-app-shell.js +16 -0
- package/dist/web/layout/editor-panel.d.ts +10 -0
- package/dist/web/layout/editor-panel.js +29 -0
- package/dist/web/layout/fill-classes.d.ts +9 -0
- package/dist/web/layout/fill-classes.js +15 -0
- package/dist/web/layout/filter-app-schema-navs.d.ts +7 -0
- package/dist/web/layout/filter-app-schema-navs.js +68 -0
- package/dist/web/layout/header-action-group.d.ts +6 -0
- package/dist/web/layout/header-action-group.js +8 -0
- package/dist/web/layout/header-overflow-menu.d.ts +4 -0
- package/dist/web/layout/header-overflow-menu.js +8 -0
- package/dist/web/layout/language-menu-items.d.ts +8 -0
- package/dist/web/layout/language-menu-items.js +16 -0
- package/dist/web/layout/language-switcher.d.ts +25 -0
- package/dist/web/layout/language-switcher.js +46 -0
- package/dist/web/layout/nav-tree.d.ts +19 -0
- package/dist/web/layout/nav-tree.js +536 -0
- package/dist/web/layout/page-header-slot.d.ts +25 -0
- package/dist/web/layout/page-header-slot.js +50 -0
- package/dist/web/layout/profile-menu.d.ts +13 -0
- package/dist/web/layout/profile-menu.js +6 -0
- package/dist/web/layout/shell-breadcrumb.d.ts +11 -0
- package/dist/web/layout/shell-breadcrumb.js +34 -0
- package/dist/web/layout/shell-header.d.ts +12 -0
- package/dist/web/layout/shell-header.js +159 -0
- package/dist/web/layout/sidebar-brand.d.ts +15 -0
- package/dist/web/layout/sidebar-brand.js +9 -0
- package/dist/web/layout/sidebar-panel.d.ts +41 -0
- package/dist/web/layout/sidebar-panel.js +107 -0
- package/dist/web/layout/sidebar-user.d.ts +8 -0
- package/dist/web/layout/sidebar-user.js +17 -0
- package/dist/web/layout/sidebar.d.ts +17 -0
- package/dist/web/layout/sidebar.js +11 -0
- package/dist/web/layout/target-resolver-stub.d.ts +13 -0
- package/dist/web/layout/target-resolver-stub.js +61 -0
- package/dist/web/layout/target-url.d.ts +12 -0
- package/dist/web/layout/target-url.js +77 -0
- package/dist/web/layout/theme-label.d.ts +15 -0
- package/dist/web/layout/theme-label.js +35 -0
- package/dist/web/layout/theme-menu-item.d.ts +12 -0
- package/dist/web/layout/theme-menu-item.js +16 -0
- package/dist/web/layout/theme-toggle.d.ts +17 -0
- package/dist/web/layout/theme-toggle.js +22 -0
- package/dist/web/layout/topbar.d.ts +8 -0
- package/dist/web/layout/topbar.js +4 -0
- package/dist/web/layout/workspace-shell.d.ts +63 -0
- package/dist/web/layout/workspace-shell.js +220 -0
- package/dist/web/layout/workspace-switcher.d.ts +15 -0
- package/dist/web/layout/workspace-switcher.js +36 -0
- package/dist/web/lib/accept-attr.d.ts +1 -0
- package/dist/web/lib/accept-attr.js +6 -0
- package/dist/web/lib/clamp.d.ts +1 -0
- package/dist/web/lib/clamp.js +3 -0
- package/dist/web/lib/cn.d.ts +6 -0
- package/dist/web/lib/cn.js +9 -0
- package/dist/web/lib/download.d.ts +2 -0
- package/dist/web/lib/download.js +24 -0
- package/dist/web/lib/file-ref-download.d.ts +15 -0
- package/dist/web/lib/file-ref-download.js +62 -0
- package/dist/web/lib/file-upload-form-data.d.ts +7 -0
- package/dist/web/lib/file-upload-form-data.js +11 -0
- package/dist/web/lib/resize-image.d.ts +1 -0
- package/dist/web/lib/resize-image.js +66 -0
- package/dist/web/lib/upload-file-ref.d.ts +9 -0
- package/dist/web/lib/upload-file-ref.js +29 -0
- package/dist/web/primitives/action-menu.d.ts +34 -0
- package/dist/web/primitives/action-menu.js +30 -0
- package/dist/web/primitives/calendar-popover.d.ts +13 -0
- package/dist/web/primitives/calendar-popover.js +76 -0
- package/dist/web/primitives/combobox.d.ts +56 -0
- package/dist/web/primitives/combobox.js +127 -0
- package/dist/web/primitives/date-field.d.ts +18 -0
- package/dist/web/primitives/date-field.js +74 -0
- package/dist/web/primitives/date-input.d.ts +1 -0
- package/dist/web/primitives/date-input.js +5 -0
- package/dist/web/primitives/date-parse.d.ts +11 -0
- package/dist/web/primitives/date-parse.js +159 -0
- package/dist/web/primitives/dialog.d.ts +3 -0
- package/dist/web/primitives/dialog.js +42 -0
- package/dist/web/primitives/drawer.d.ts +3 -0
- package/dist/web/primitives/drawer.js +17 -0
- package/dist/web/primitives/dropdown-menu.d.ts +15 -0
- package/dist/web/primitives/dropdown-menu.js +56 -0
- package/dist/web/primitives/embedded-list-input.d.ts +9 -0
- package/dist/web/primitives/embedded-list-input.js +382 -0
- package/dist/web/primitives/file-thumbnail.d.ts +25 -0
- package/dist/web/primitives/file-thumbnail.js +90 -0
- package/dist/web/primitives/file-upload.d.ts +21 -0
- package/dist/web/primitives/file-upload.js +56 -0
- package/dist/web/primitives/index.d.ts +34 -0
- package/dist/web/primitives/index.js +2021 -0
- package/dist/web/primitives/json-view.d.ts +7 -0
- package/dist/web/primitives/json-view.js +84 -0
- package/dist/web/primitives/layout.d.ts +27 -0
- package/dist/web/primitives/layout.js +30 -0
- package/dist/web/primitives/lightbox.d.ts +3 -0
- package/dist/web/primitives/lightbox.js +36 -0
- package/dist/web/primitives/locale-number.d.ts +2 -0
- package/dist/web/primitives/locale-number.js +54 -0
- package/dist/web/primitives/located-timestamp-input.d.ts +22 -0
- package/dist/web/primitives/located-timestamp-input.js +22 -0
- package/dist/web/primitives/metric.d.ts +5 -0
- package/dist/web/primitives/metric.js +18 -0
- package/dist/web/primitives/modal-shell.d.ts +17 -0
- package/dist/web/primitives/modal-shell.js +9 -0
- package/dist/web/primitives/modal.d.ts +3 -0
- package/dist/web/primitives/modal.js +13 -0
- package/dist/web/primitives/money-input.d.ts +18 -0
- package/dist/web/primitives/money-input.js +122 -0
- package/dist/web/primitives/narrow-pinned-footer.d.ts +12 -0
- package/dist/web/primitives/narrow-pinned-footer.js +153 -0
- package/dist/web/primitives/number-input.d.ts +18 -0
- package/dist/web/primitives/number-input.js +53 -0
- package/dist/web/primitives/option-groups.d.ts +11 -0
- package/dist/web/primitives/option-groups.js +27 -0
- package/dist/web/primitives/page-header.d.ts +3 -0
- package/dist/web/primitives/page-header.js +52 -0
- package/dist/web/primitives/promo-panel.d.ts +3 -0
- package/dist/web/primitives/promo-panel.js +11 -0
- package/dist/web/primitives/segmented-select.d.ts +21 -0
- package/dist/web/primitives/segmented-select.js +62 -0
- package/dist/web/primitives/share-actions.d.ts +4 -0
- package/dist/web/primitives/share-actions.js +56 -0
- package/dist/web/primitives/status-badge.d.ts +3 -0
- package/dist/web/primitives/status-badge.js +5 -0
- package/dist/web/primitives/sticky-action-bar.d.ts +5 -0
- package/dist/web/primitives/sticky-action-bar.js +15 -0
- package/dist/web/primitives/tabs.d.ts +3 -0
- package/dist/web/primitives/tabs.js +107 -0
- package/dist/web/primitives/timestamp-input.d.ts +27 -0
- package/dist/web/primitives/timestamp-input.js +87 -0
- package/dist/web/primitives/toast.d.ts +19 -0
- package/dist/web/primitives/toast.js +63 -0
- package/dist/web/primitives/tz-input.d.ts +11 -0
- package/dist/web/primitives/tz-input.js +8 -0
- package/dist/web/primitives/tz-options.d.ts +4 -0
- package/dist/web/primitives/tz-options.js +17 -0
- package/dist/web/primitives/use-keyboard-inset.d.ts +1 -0
- package/dist/web/primitives/use-keyboard-inset.js +28 -0
- package/dist/web/primitives/use-narrow-viewport.d.ts +4 -0
- package/dist/web/primitives/use-narrow-viewport.js +46 -0
- package/dist/web/react-css-custom-properties.d.ts +6 -0
- package/dist/web/react-css-custom-properties.js +1 -0
- package/dist/web/sse/live-events.d.ts +15 -0
- package/dist/web/sse/live-events.js +148 -0
- package/dist/web/theme-plugin.d.ts +41 -0
- package/dist/web/theme-plugin.js +123 -0
- package/dist/web/tokens.d.ts +24 -0
- package/dist/web/tokens.js +203 -0
- package/dist/web/ui/avatar.d.ts +11 -0
- package/dist/web/ui/avatar.js +25 -0
- package/dist/web/ui/badge.d.ts +9 -0
- package/dist/web/ui/badge.js +26 -0
- package/dist/web/ui/breadcrumb.d.ts +11 -0
- package/dist/web/ui/breadcrumb.js +29 -0
- package/dist/web/ui/button.d.ts +10 -0
- package/dist/web/ui/button.js +37 -0
- package/dist/web/ui/checkbox.d.ts +4 -0
- package/dist/web/ui/checkbox.js +11 -0
- package/dist/web/ui/input.d.ts +3 -0
- package/dist/web/ui/input.js +8 -0
- package/dist/web/ui/label.d.ts +4 -0
- package/dist/web/ui/label.js +10 -0
- package/dist/web/ui/resizable.d.ts +7 -0
- package/dist/web/ui/resizable.js +16 -0
- package/dist/web/ui/separator.d.ts +4 -0
- package/dist/web/ui/separator.js +10 -0
- package/dist/web/ui/sheet.d.ts +14 -0
- package/dist/web/ui/sheet.js +42 -0
- package/dist/web/ui/sidebar.d.ts +73 -0
- package/dist/web/ui/sidebar.js +211 -0
- package/dist/web/ui/skeleton.d.ts +2 -0
- package/dist/web/ui/skeleton.js +7 -0
- package/dist/web/ui/switch.d.ts +6 -0
- package/dist/web/ui/switch.js +10 -0
- package/dist/web/ui/table.d.ts +10 -0
- package/dist/web/ui/table.js +30 -0
- package/dist/web/ui/tabs.d.ts +11 -0
- package/dist/web/ui/tabs.js +31 -0
- package/dist/web/ui/textarea.d.ts +3 -0
- package/dist/web/ui/textarea.js +8 -0
- package/dist/web/ui/tooltip.d.ts +7 -0
- package/dist/web/ui/tooltip.js +19 -0
- package/dist/web/ui/use-mobile.d.ts +1 -0
- package/dist/web/ui/use-mobile.js +16 -0
- package/dist/web/version/update-checker.d.ts +9 -0
- package/dist/web/version/update-checker.js +88 -0
- package/dist/web/widgets/ai-text-field.d.ts +36 -0
- package/dist/web/widgets/ai-text-field.js +137 -0
- package/dist/web/widgets/chart-window.d.ts +58 -0
- package/dist/web/widgets/chart-window.js +190 -0
- package/dist/web/widgets/charts.d.ts +208 -0
- package/dist/web/widgets/charts.js +685 -0
- package/dist/web/widgets/collapsible-section.d.ts +10 -0
- package/dist/web/widgets/collapsible-section.js +17 -0
- package/dist/web/widgets/dashboard-list.d.ts +21 -0
- package/dist/web/widgets/dashboard-list.js +45 -0
- package/dist/web/widgets/detail-list.d.ts +15 -0
- package/dist/web/widgets/detail-list.js +8 -0
- package/dist/web/widgets/drawer.d.ts +65 -0
- package/dist/web/widgets/drawer.js +142 -0
- package/dist/web/widgets/feed-list.d.ts +13 -0
- package/dist/web/widgets/feed-list.js +9 -0
- package/dist/web/widgets/floating-panel.d.ts +30 -0
- package/dist/web/widgets/floating-panel.js +242 -0
- package/dist/web/widgets/form-fields.d.ts +93 -0
- package/dist/web/widgets/form-fields.js +50 -0
- package/dist/web/widgets/index.d.ts +27 -0
- package/dist/web/widgets/index.js +30 -0
- package/dist/web/widgets/infinity-list.d.ts +46 -0
- package/dist/web/widgets/infinity-list.js +211 -0
- package/dist/web/widgets/mode-switch.d.ts +21 -0
- package/dist/web/widgets/mode-switch.js +25 -0
- package/dist/web/widgets/photo-slots.d.ts +29 -0
- package/dist/web/widgets/photo-slots.js +52 -0
- package/dist/web/widgets/plan-card.d.ts +36 -0
- package/dist/web/widgets/plan-card.js +13 -0
- package/dist/web/widgets/progress-bar.d.ts +19 -0
- package/dist/web/widgets/progress-bar.js +24 -0
- package/dist/web/widgets/progress-list.d.ts +19 -0
- package/dist/web/widgets/progress-list.js +11 -0
- package/dist/web/widgets/public-shell.d.ts +22 -0
- package/dist/web/widgets/public-shell.js +15 -0
- package/dist/web/widgets/query-table.d.ts +29 -0
- package/dist/web/widgets/query-table.js +30 -0
- package/dist/web/widgets/result-panel.d.ts +69 -0
- package/dist/web/widgets/result-panel.js +30 -0
- package/dist/web/widgets/section-card.d.ts +12 -0
- package/dist/web/widgets/section-card.js +9 -0
- package/dist/web/widgets/sheet-parts.d.ts +9 -0
- package/dist/web/widgets/sheet-parts.js +11 -0
- package/dist/web/widgets/side-by-side-table.d.ts +31 -0
- package/dist/web/widgets/side-by-side-table.js +11 -0
- package/dist/web/widgets/stat.d.ts +54 -0
- package/dist/web/widgets/stat.js +65 -0
- package/dist/web/widgets/states.d.ts +23 -0
- package/dist/web/widgets/states.js +20 -0
- package/dist/web/widgets/status-badge.d.ts +15 -0
- package/dist/web/widgets/status-badge.js +24 -0
- package/dist/web/widgets/step-bar.d.ts +35 -0
- package/dist/web/widgets/step-bar.js +60 -0
- package/dist/web/widgets/upload-zone.d.ts +24 -0
- package/dist/web/widgets/upload-zone.js +108 -0
- package/dist/web/widgets/use-draft.d.ts +20 -0
- package/dist/web/widgets/use-draft.js +21 -0
- package/dist/web/widgets/use-pointer-drag.d.ts +21 -0
- package/dist/web/widgets/use-pointer-drag.js +53 -0
- package/package.json +105 -7
- package/src/changes.json +77 -0
- package/src/web/fonts/OFL.txt +93 -0
- package/src/web/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
- package/src/web/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
- package/src/web/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
- package/src/web/fonts/ibm-plex-mono-latin-ext-500.woff2 +0 -0
- package/src/web/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
- package/src/web/fonts/ibm-plex-sans-latin-500.woff2 +0 -0
- package/src/web/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
- package/src/web/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
- package/src/web/fonts/ibm-plex-sans-latin-ext-500.woff2 +0 -0
- package/src/web/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
- package/src/web/styles.css +401 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { toAppSchema, usePrimitives, useSessionEndedSignal, useTranslation } from "../../index.js";
|
|
4
|
+
// Mirrors framework's api-constants Routes.schema, same pattern as
|
|
5
|
+
// dispatcher-live's PATH_* constants — the one place that spells out the
|
|
6
|
+
// wire path both sides agree on.
|
|
7
|
+
export const APP_SCHEMA_API_PATH = "/api/schema";
|
|
8
|
+
function isFeatureSchemaPayload(value) {
|
|
9
|
+
if (typeof value !== "object" || value === null)
|
|
10
|
+
return false;
|
|
11
|
+
if (!("featureName" in value) || typeof value.featureName !== "string")
|
|
12
|
+
return false;
|
|
13
|
+
return "screens" in value && Array.isArray(value.screens);
|
|
14
|
+
}
|
|
15
|
+
export function isAppSchemaPayload(value) {
|
|
16
|
+
if (typeof value !== "object" || value === null)
|
|
17
|
+
return false;
|
|
18
|
+
if (!("features" in value) || !Array.isArray(value.features))
|
|
19
|
+
return false;
|
|
20
|
+
return value.features.every((feature) => isFeatureSchemaPayload(feature));
|
|
21
|
+
}
|
|
22
|
+
function isAbortError(err) {
|
|
23
|
+
return err instanceof DOMException && err.name === "AbortError";
|
|
24
|
+
}
|
|
25
|
+
// Mirrors createLiveDispatcher: a cross-origin API (absolute baseUrl) needs
|
|
26
|
+
// credentials "include" for the session cookie to travel; same-origin stays
|
|
27
|
+
// "same-origin" so a relative path never widens.
|
|
28
|
+
function schemaFetchCredentials(schemaUrl) {
|
|
29
|
+
try {
|
|
30
|
+
return new URL(schemaUrl, window.location.href).origin === window.location.origin
|
|
31
|
+
? "same-origin"
|
|
32
|
+
: "include";
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return "same-origin";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Rejects only on abort (caller-cancelled) — every other failure mode
|
|
39
|
+
// (network error, non-2xx, unparseable/invalid body) resolves to
|
|
40
|
+
// `{ kind: "failed" }` so callers get one uniform result shape to branch
|
|
41
|
+
// on instead of a mix of thrown errors and resolved results.
|
|
42
|
+
export async function fetchAppSchema(signal, schemaUrl = APP_SCHEMA_API_PATH) {
|
|
43
|
+
let res;
|
|
44
|
+
try {
|
|
45
|
+
res = await fetch(schemaUrl, {
|
|
46
|
+
credentials: schemaFetchCredentials(schemaUrl),
|
|
47
|
+
headers: { Accept: "application/json" },
|
|
48
|
+
signal,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (isAbortError(err))
|
|
53
|
+
throw err;
|
|
54
|
+
return { kind: "failed" };
|
|
55
|
+
}
|
|
56
|
+
if (res.status === 401)
|
|
57
|
+
return { kind: "session-ended" };
|
|
58
|
+
if (res.status === 403)
|
|
59
|
+
return { kind: "unauthorized" };
|
|
60
|
+
if (!res.ok)
|
|
61
|
+
return { kind: "failed" };
|
|
62
|
+
let payload;
|
|
63
|
+
try {
|
|
64
|
+
payload = await res.json();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return { kind: "failed" };
|
|
68
|
+
}
|
|
69
|
+
if (!isAppSchemaPayload(payload))
|
|
70
|
+
return { kind: "failed" };
|
|
71
|
+
return { kind: "loaded", app: toAppSchema(payload) };
|
|
72
|
+
}
|
|
73
|
+
// Boots the app once the caller (AppSchemaBoundary, itself inside the
|
|
74
|
+
// clientFeature gates) decides to mount it — a login gate renders its own
|
|
75
|
+
// placeholder instead of children, so this component (and its fetch) never
|
|
76
|
+
// mounts until the user is authenticated.
|
|
77
|
+
export function AppSchemaFetchBoot({ onLoaded, schemaUrl, }) {
|
|
78
|
+
const t = useTranslation();
|
|
79
|
+
const { Banner, Button } = usePrimitives();
|
|
80
|
+
const [status, setStatus] = useState("loading");
|
|
81
|
+
const sessionEndedSignal = useSessionEndedSignal();
|
|
82
|
+
const [attempt, setAttempt] = useState(0);
|
|
83
|
+
// Ref instead of an effect dependency: onLoaded is a fresh closure on
|
|
84
|
+
// every KumikoAppRoot render (it captures setApp) — depending on it
|
|
85
|
+
// directly would refetch on every unrelated re-render.
|
|
86
|
+
const onLoadedRef = useRef(onLoaded);
|
|
87
|
+
onLoadedRef.current = onLoaded;
|
|
88
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: attempt is the retry trigger, never read in the body — bumping it is how the Retry button re-fires this effect.
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
const controller = new AbortController();
|
|
91
|
+
setStatus("loading");
|
|
92
|
+
fetchAppSchema(controller.signal, schemaUrl)
|
|
93
|
+
.then((result) => {
|
|
94
|
+
if (controller.signal.aborted)
|
|
95
|
+
return;
|
|
96
|
+
if (result.kind === "loaded") {
|
|
97
|
+
onLoadedRef.current(result.app);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
setStatus(result.kind);
|
|
101
|
+
})
|
|
102
|
+
.catch((err) => {
|
|
103
|
+
if (!isAbortError(err))
|
|
104
|
+
setStatus("failed");
|
|
105
|
+
});
|
|
106
|
+
return () => controller.abort();
|
|
107
|
+
}, [attempt, schemaUrl]);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (status === "session-ended")
|
|
110
|
+
sessionEndedSignal?.notify();
|
|
111
|
+
}, [status, sessionEndedSignal]);
|
|
112
|
+
if (status === "loading") {
|
|
113
|
+
return (_jsx("div", { role: "status", "aria-busy": "true", children: t("kumiko.app-boot.loading") }));
|
|
114
|
+
}
|
|
115
|
+
if (status === "unauthorized" || status === "session-ended") {
|
|
116
|
+
// No auto-retry/reload here on purpose — a signed-out user retrying
|
|
117
|
+
// the same request just gets the same 401 again; the login gate that
|
|
118
|
+
// wraps this component is the actual way out. For session-ended the
|
|
119
|
+
// notify above normally swaps this banner for the login screen; the
|
|
120
|
+
// banner stays as fallback when no session provider is mounted.
|
|
121
|
+
return (_jsx(Banner, { variant: "error", padded: true, children: t("kumiko.app-boot.unauthorized") }));
|
|
122
|
+
}
|
|
123
|
+
return (_jsx(Banner, { variant: "error", padded: true, actions: _jsx(Button, { variant: "secondary", onClick: () => setAttempt((n) => n + 1), children: t("kumiko.actions.reload") }), children: t("kumiko.app-boot.failed") }));
|
|
124
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type LocaleResolver } from "../../headless/index.ts";
|
|
2
|
+
export type CreateBrowserLocaleResolverOptions = {
|
|
3
|
+
/** localStorage-Key unter dem die aktive Locale persistiert wird.
|
|
4
|
+
* Default: `"kumiko:locale"`. Apps die mehrere Kumiko-Instanzen auf
|
|
5
|
+
* derselben Origin mounten (selten), setzen verschiedene Keys. */
|
|
6
|
+
readonly storageKey?: string;
|
|
7
|
+
/** Fallback wenn weder localStorage noch navigator.language liefern.
|
|
8
|
+
* Default: `"en"`. */
|
|
9
|
+
readonly defaultLocale?: string;
|
|
10
|
+
/** Maps a stored or browser-reported tag onto one of the app's locales;
|
|
11
|
+
* `undefined` rejects it (a stored tag then falls through to
|
|
12
|
+
* navigator.language, the browser tag to `defaultLocale`). Only applied to
|
|
13
|
+
* the initial detection, not to `setLocale`. */
|
|
14
|
+
readonly normalizeLocale?: (tag: string) => string | undefined;
|
|
15
|
+
};
|
|
16
|
+
export declare const BROWSER_LOCALE_STORAGE_KEY = "kumiko:locale";
|
|
17
|
+
/** Default-Resolver wenn createKumikoApp ohne `locale`-Option gebootet
|
|
18
|
+
* wird. Stateful: setLocale() persistiert in localStorage und ruft
|
|
19
|
+
* subscribed listeners. Apps die eine vollwertige i18n-Schicht haben
|
|
20
|
+
* (i18next, FormatJS, eigener Store), reichen stattdessen ihre eigene
|
|
21
|
+
* Resolver-Impl via `createKumikoApp({ locale })`. */
|
|
22
|
+
export declare function createBrowserLocaleResolver(options?: CreateBrowserLocaleResolverOptions): LocaleResolver;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Browser-spezifischer LocaleResolver-Default für createKumikoApp.
|
|
2
|
+
//
|
|
3
|
+
// Stateful: hält die aktuelle Locale in localStorage, bricht subscribe-
|
|
4
|
+
// listener bei setLocale(). Initial-wert kommt aus localStorage wenn
|
|
5
|
+
// gespeichert, sonst aus navigator.language, sonst aus defaultLocale.
|
|
6
|
+
//
|
|
7
|
+
// App-Code setzt die Locale programmatisch via resolver.setLocale() —
|
|
8
|
+
// der LanguageSwitcher-Component macht genau das. Persistenz über
|
|
9
|
+
// localStorage heißt: nach Page-Reload gleiche Sprache, ohne Server-
|
|
10
|
+
// Roundtrip. Für device-übergreifende Persistenz würde ein
|
|
11
|
+
// user:write:update auf user.locale zusätzlich gesetzt (separater
|
|
12
|
+
// App-Code, nicht im Resolver).
|
|
13
|
+
import { createStore } from "../../headless/index.js";
|
|
14
|
+
export const BROWSER_LOCALE_STORAGE_KEY = "kumiko:locale";
|
|
15
|
+
function detectInitialLocale(storageKey, fallback, normalizeLocale) {
|
|
16
|
+
if (typeof localStorage !== "undefined") {
|
|
17
|
+
try {
|
|
18
|
+
const stored = localStorage.getItem(storageKey);
|
|
19
|
+
if (stored !== null && stored.length > 0) {
|
|
20
|
+
const normalized = normalizeLocale(stored);
|
|
21
|
+
if (normalized !== undefined)
|
|
22
|
+
return normalized;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// localStorage kann throwen (safari private mode, disabled) —
|
|
27
|
+
// leise auf navigator zurückfallen.
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (typeof navigator !== "undefined" && navigator.language) {
|
|
31
|
+
return normalizeLocale(navigator.language) ?? fallback;
|
|
32
|
+
}
|
|
33
|
+
return fallback;
|
|
34
|
+
}
|
|
35
|
+
function detectTimeZone() {
|
|
36
|
+
if (typeof Intl === "undefined")
|
|
37
|
+
return "UTC";
|
|
38
|
+
try {
|
|
39
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC";
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return "UTC";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Default-Resolver wenn createKumikoApp ohne `locale`-Option gebootet
|
|
46
|
+
* wird. Stateful: setLocale() persistiert in localStorage und ruft
|
|
47
|
+
* subscribed listeners. Apps die eine vollwertige i18n-Schicht haben
|
|
48
|
+
* (i18next, FormatJS, eigener Store), reichen stattdessen ihre eigene
|
|
49
|
+
* Resolver-Impl via `createKumikoApp({ locale })`. */
|
|
50
|
+
export function createBrowserLocaleResolver(options = {}) {
|
|
51
|
+
const storageKey = options.storageKey ?? BROWSER_LOCALE_STORAGE_KEY;
|
|
52
|
+
const fallback = options.defaultLocale ?? "en";
|
|
53
|
+
const store = createStore(detectInitialLocale(storageKey, fallback, options.normalizeLocale ?? ((tag) => tag)));
|
|
54
|
+
const timeZone = detectTimeZone();
|
|
55
|
+
return {
|
|
56
|
+
translate: (key) => key,
|
|
57
|
+
locale: () => store.getSnapshot(), // @wrapper-known semantic-alias
|
|
58
|
+
timeZone: () => timeZone,
|
|
59
|
+
subscribe: store.subscribe,
|
|
60
|
+
setLocale: (next) => {
|
|
61
|
+
// skip: locale unchanged, avoid redundant localStorage write
|
|
62
|
+
// own Object.is-Gate would already block listener notification,
|
|
63
|
+
// but the persistence side-effect lives outside the store.
|
|
64
|
+
if (next === store.getSnapshot())
|
|
65
|
+
return;
|
|
66
|
+
store.setState(next);
|
|
67
|
+
if (typeof localStorage !== "undefined") {
|
|
68
|
+
try {
|
|
69
|
+
localStorage.setItem(storageKey, next);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Persistenz fehlgeschlagen ist nicht fatal — die Session-Locale
|
|
73
|
+
// bleibt trotzdem gesetzt, nur der nächste Reload verliert sie.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { TargetRef, TreeChildrenSubscribe } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import type { ContentEditorFormat } from "@cosmicdrift/kumiko-types/nav";
|
|
3
|
+
import type { ComponentType, ReactNode } from "react";
|
|
4
|
+
import type { ClientActionHandler, ColumnRendererComponent, ContentEditorComponent, ExtensionSectionComponent, QualifiedContentCollection, TranslationsByLocale } from "../../index.ts";
|
|
5
|
+
/** What a `navProvidersFromCollections` factory returns: the providers plus
|
|
6
|
+
* the entities whose live events should re-fire them. Without `entities` a
|
|
7
|
+
* derived tree would sit stale until re-mount — the hand-wired path has the
|
|
8
|
+
* SSE refresh and the derived one must not lose it. */
|
|
9
|
+
export type CollectionNavProviders = {
|
|
10
|
+
readonly providers: Readonly<Record<string, TreeChildrenSubscribe>>;
|
|
11
|
+
readonly entities?: Readonly<Record<string, readonly string[]>>;
|
|
12
|
+
};
|
|
13
|
+
export type ClientFeatureDefinition = {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
/** Context-Provider die um den kompletten Renderer-Tree gewrapped
|
|
16
|
+
* werden. Reihenfolge: erstes Element = äußerster Provider. Alle
|
|
17
|
+
* Provider stehen VOR allen Gates im Baum, damit jeder Gate und
|
|
18
|
+
* jedes Screen-Child darauf Zugriff hat. */
|
|
19
|
+
readonly providers?: readonly ComponentType<{
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
}>[];
|
|
22
|
+
/** Screen-Decorators die zwischen dem Provider-Stack und dem Shell/
|
|
23
|
+
* Screen-Render sitzen. Typisches Muster: AuthGate rendert den
|
|
24
|
+
* LoginScreen statt children solange der User nicht eingeloggt ist.
|
|
25
|
+
* Reihenfolge: erstes Element = äußerster Gate. */
|
|
26
|
+
readonly gates?: readonly ComponentType<{
|
|
27
|
+
children: ReactNode;
|
|
28
|
+
}>[];
|
|
29
|
+
/** Default-Translations die das Feature für seine UI-Strings
|
|
30
|
+
* mitbringt. Werden in den LocaleProvider als Fallback-Bundle
|
|
31
|
+
* eingehängt — der App-Resolver (z.B. i18next) hat Vorrang und kann
|
|
32
|
+
* einzelne Keys überschreiben, ohne dass die Feature-Bundles
|
|
33
|
+
* komplett ausgetauscht werden müssen. */
|
|
34
|
+
readonly translations?: TranslationsByLocale;
|
|
35
|
+
/** Custom-Screen-Components — Map screenId → React-Component. Wenn
|
|
36
|
+
* ein Schema-Screen `type: "custom"` hat, schaut KumikoScreen in
|
|
37
|
+
* diese Map (gemerged aus allen ClientFeatures) und rendert die
|
|
38
|
+
* passende Component. So muss kein Sample mehr im AppShell-Wrapper
|
|
39
|
+
* selbst routen. Convention: screenId entspricht dem `id` aus
|
|
40
|
+
* `r.screen({ id, type: "custom", ... })` im server-side Feature. */
|
|
41
|
+
readonly components?: Readonly<Record<string, ComponentType>>;
|
|
42
|
+
/** Column-Renderer-Components — Map renderer-name → React-Component.
|
|
43
|
+
* Schema deklariert eine Column mit
|
|
44
|
+
* `renderer: { react: { __component: "ColorSwatch" } }`; client-side
|
|
45
|
+
* zieht der DataTable-Cell-Renderer den Component hier raus.
|
|
46
|
+
* Schemas bleiben so serializable (nur ein String-Key auf der Wire),
|
|
47
|
+
* echte JSX-Renderer leben im Client-Bundle. Last-Wins bei Key-
|
|
48
|
+
* Kollision über mehrere Features. */
|
|
49
|
+
readonly columnRenderers?: Readonly<Record<string, ColumnRendererComponent>>;
|
|
50
|
+
/** Extension-Section-Components — Map `__component`-name → React-
|
|
51
|
+
* Component. Schema deklariert eine entityEdit-Section mit
|
|
52
|
+
* `kind: "extension"` + `component: { react: { __component: "X" } }`;
|
|
53
|
+
* RenderEdit zieht den Component hier raus und mountet ihn mit
|
|
54
|
+
* `{ entityName, entityId }`. Pattern wie columnRenderers — Last-Wins
|
|
55
|
+
* bei Key-Kollision über mehrere Features. */
|
|
56
|
+
readonly extensionSectionComponents?: Readonly<Record<string, ExtensionSectionComponent>>;
|
|
57
|
+
/** Handlers for RowAction `kind: "clientAction"`, keyed by the action name
|
|
58
|
+
* `<feature>:<kebab>`. Last-wins with a warning on key collisions, like
|
|
59
|
+
* columnRenderers. */
|
|
60
|
+
readonly clientActions?: Readonly<Record<string, ClientActionHandler>>;
|
|
61
|
+
/** Nav-Provider für die EINE Nav (Visual-Tree-Merge): hängt dynamische
|
|
62
|
+
* Children an einen statischen `r.nav({ provider: true })`-Knoten. Keyed
|
|
63
|
+
* auf die LOKALE nav-id (create-app qualifiziert zu `<feature>:nav:<id>`;
|
|
64
|
+
* bereits qualifizierte QNs gehen durch). Anders als `treeProvider` (ein
|
|
65
|
+
* Top-Level-Branch pro Feature) attacht ein navProvider an einen konkreten
|
|
66
|
+
* Nav-Knoten — der idiomatic Weg seit dem Tree→Nav-Merge. */
|
|
67
|
+
readonly navProviders?: Readonly<Record<string, TreeChildrenSubscribe>>;
|
|
68
|
+
/** SSE-Entity-Listen pro nav-id für den Live-Refresh der navProviders
|
|
69
|
+
* (analog `treeEntities`). Live-Event für eine Entity → Provider des
|
|
70
|
+
* Knotens wird neu aufgerufen → neue Kinder erscheinen live. */
|
|
71
|
+
readonly navEntities?: Readonly<Record<string, readonly string[]>>;
|
|
72
|
+
/** Nav providers derived from the app schema — called with every
|
|
73
|
+
* `r.contentCollection()` the app declares. A feature that serves any
|
|
74
|
+
* number of collections (template-resolver) builds one provider per
|
|
75
|
+
* collection this way, without the app writing navId + kind a second time
|
|
76
|
+
* and without the renderer having to know bundled-features. Merged with
|
|
77
|
+
* `navProviders`; the static map wins on key collision (explicit beats
|
|
78
|
+
* derived). */
|
|
79
|
+
readonly navProvidersFromCollections?: (collections: readonly QualifiedContentCollection[]) => CollectionNavProviders;
|
|
80
|
+
/** Content editor components — map `contentFormat` ("plain" | "rich" | "markdown" | "document") →
|
|
81
|
+
* React component. `r.contentCollection()` declares which format an
|
|
82
|
+
* editor edits; the collection's editor UI (template-resolver's
|
|
83
|
+
* TextBlockEditor et al.) looks the component up here and falls back to
|
|
84
|
+
* a plain textarea when no clientFeature registered one for that
|
|
85
|
+
* format. Same last-wins semantics as columnRenderers. Public component
|
|
86
|
+
* contract: `{ value, onChange, variables, readOnly }`. */
|
|
87
|
+
readonly contentEditors?: Partial<Record<ContentEditorFormat, ContentEditorComponent>>;
|
|
88
|
+
/** Editor-Resolver-Komponenten pro featureId:action-Key. Wenn ein
|
|
89
|
+
* TreeNode mit target angeklickt wird, schlägt der EditorPanel das
|
|
90
|
+
* Component hier nach und rendert es. Komponenten erhalten target
|
|
91
|
+
* (mit args) und eine onClose-Callback. Ohne registrierten Resolver
|
|
92
|
+
* zeigt der EditorPanel einen Info-Fallback.
|
|
93
|
+
* Siehe visual-tree.md V.1.2. */
|
|
94
|
+
readonly resolvers?: Readonly<Record<string, ComponentType<{
|
|
95
|
+
readonly target: TargetRef;
|
|
96
|
+
readonly onClose: () => void;
|
|
97
|
+
}>>>;
|
|
98
|
+
};
|
|
99
|
+
/** Wickelt einen ReactNode durch eine Liste von Providern/Gates von
|
|
100
|
+
* innen nach außen — erstes Array-Element ist äußerste Hülle.
|
|
101
|
+
* Der Key nutzt den Component-Display-Namen (falls gesetzt) plus
|
|
102
|
+
* Index, damit Mounts stabil bleiben solange die Wrapper-Liste
|
|
103
|
+
* ihre Reihenfolge nicht ändert. */
|
|
104
|
+
export declare function stackWrappers(wrappers: readonly ComponentType<{
|
|
105
|
+
children: ReactNode;
|
|
106
|
+
}>[], inner: ReactNode): ReactNode;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/** Wickelt einen ReactNode durch eine Liste von Providern/Gates von
|
|
3
|
+
* innen nach außen — erstes Array-Element ist äußerste Hülle.
|
|
4
|
+
* Der Key nutzt den Component-Display-Namen (falls gesetzt) plus
|
|
5
|
+
* Index, damit Mounts stabil bleiben solange die Wrapper-Liste
|
|
6
|
+
* ihre Reihenfolge nicht ändert. */
|
|
7
|
+
export function stackWrappers(wrappers, inner) {
|
|
8
|
+
return wrappers.reduceRight((acc, Wrapper, i) => {
|
|
9
|
+
const key = `${Wrapper.displayName ?? Wrapper.name ?? "wrapper"}-${i}`;
|
|
10
|
+
return _jsx(Wrapper, { children: acc }, key);
|
|
11
|
+
}, inner);
|
|
12
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { TreeChildrenSubscribe } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import { type ErrorInfo, type ReactNode } from "react";
|
|
3
|
+
import { type Root } from "react-dom/client";
|
|
4
|
+
import type { Dispatcher, ListRowViewModel, LocaleResolver, Translate } from "../../headless/index.ts";
|
|
5
|
+
import { type AppSchema, type ContentEditorComponent, type DraftStorage, type FeatureSchema, type FormWidth, type NavApi, type PrimitivesRegistry, type QualifiedContentCollection } from "../../index.ts";
|
|
6
|
+
import { type ClientFeatureDefinition } from "./client-plugin.tsx";
|
|
7
|
+
export declare function qualifyNavProviderKey(feature: string, id: string): string;
|
|
8
|
+
export declare function buildNavProviderMaps(clientFeatures: readonly ClientFeatureDefinition[], collections: readonly QualifiedContentCollection[]): {
|
|
9
|
+
readonly navProviders: ReadonlyMap<string, TreeChildrenSubscribe>;
|
|
10
|
+
readonly navEntities: ReadonlyMap<string, readonly string[]>;
|
|
11
|
+
};
|
|
12
|
+
export type BoundaryErrorHandler = (error: Error, info: ErrorInfo) => void;
|
|
13
|
+
export type CreateKumikoAppOptions = {
|
|
14
|
+
/** Called when the screen or root error boundary catches an error, after it
|
|
15
|
+
* was logged with console.error — attach telemetry here. */
|
|
16
|
+
readonly onError?: BoundaryErrorHandler;
|
|
17
|
+
/** App schema. Accepts AppSchema (multi-feature) or the legacy
|
|
18
|
+
* FeatureSchema (single-feature) — toAppSchema() normalizes internally.
|
|
19
|
+
*
|
|
20
|
+
* Optional. Resolution order: this option, then
|
|
21
|
+
* `window.__KUMIKO_SCHEMA__` (only for explicit/custom builds, e.g. e2e
|
|
22
|
+
* fixtures that bake it into the page themselves — the dev-server no
|
|
23
|
+
* longer injects it), then a client-side fetch to the authenticated
|
|
24
|
+
* `GET /api/schema` once the clientFeature gates (e.g. an auth gate)
|
|
25
|
+
* have let rendering through. Without an explicit
|
|
26
|
+
* schema, mounting shows a loading/unauthorized/error state until the
|
|
27
|
+
* fetch resolves instead of throwing at boot. */
|
|
28
|
+
readonly schema?: AppSchema | FeatureSchema;
|
|
29
|
+
readonly rootId?: string;
|
|
30
|
+
readonly dispatcher?: Dispatcher;
|
|
31
|
+
/** URL of the authenticated schema endpoint, fetched when no `schema` is
|
|
32
|
+
* given. Default `/api/schema` (same origin). Set an absolute URL when the
|
|
33
|
+
* API lives on another origin than the SPA (e.g. a `baseUrl` on
|
|
34
|
+
* `createLiveDispatcher`); a cross-origin URL is fetched with
|
|
35
|
+
* `credentials: "include"`. */
|
|
36
|
+
readonly schemaUrl?: string;
|
|
37
|
+
/** RenderEdit's create-mode draftId storage (issue #1913) — where a
|
|
38
|
+
* same-tab reload finds which of several parallel create-sessions on a
|
|
39
|
+
* screen to resume. Default: `createBrowserDraftStorage()`
|
|
40
|
+
* (sessionStorage-backed). Apps that don't want any client-side draftId
|
|
41
|
+
* persistence can pass a no-op impl; RenderEdit still resolves via its
|
|
42
|
+
* `form-draft:query:list` mount-time fallback either way. */
|
|
43
|
+
readonly draftStorage?: DraftStorage;
|
|
44
|
+
readonly screenQn?: string;
|
|
45
|
+
readonly translate?: Translate;
|
|
46
|
+
/** Row-click fallback for entities with no declared `detailFor` screen
|
|
47
|
+
* (fw#2164) — a `detailFor` screen always wins over this option. */
|
|
48
|
+
readonly onRowClick?: (row: ListRowViewModel, entityName: string) => void;
|
|
49
|
+
/** App-Shell. Bekommt das resolved `schema` als Prop — so können
|
|
50
|
+
* AppShell-Komponenten an WorkspaceShell/DefaultAppShell durchreichen
|
|
51
|
+
* ohne selbst das Schema zu importieren oder auf window-Globals zu
|
|
52
|
+
* greifen. */
|
|
53
|
+
readonly shell?: (props: {
|
|
54
|
+
readonly children: ReactNode;
|
|
55
|
+
readonly schema: AppSchema;
|
|
56
|
+
}) => ReactNode;
|
|
57
|
+
readonly primitives?: Partial<PrimitivesRegistry>;
|
|
58
|
+
/** Feature-gelieferte Client-Extensions. Jedes Element bringt
|
|
59
|
+
* Provider + Gates mit — siehe ClientFeatureDefinition. Beispiel:
|
|
60
|
+
* `clientFeatures: [emailPasswordClient()]` für Session+Login. */
|
|
61
|
+
readonly clientFeatures?: readonly ClientFeatureDefinition[];
|
|
62
|
+
/** App-level LocaleResolver. Typischerweise ein Adapter um i18next
|
|
63
|
+
* oder eine eigene Store-Impl. Wenn nicht gesetzt → Static-Default
|
|
64
|
+
* (`locale: "en"`, `translate: key → key`); Plugin-Translations
|
|
65
|
+
* springen dann als Fallback ein. */
|
|
66
|
+
readonly locale?: LocaleResolver;
|
|
67
|
+
/** Nav-Adapter — ein React-Hook der eine NavApi-Instanz liefert
|
|
68
|
+
* (route + navigate + hrefFor). Default: `useBrowserNavApi`, das
|
|
69
|
+
* window.history als Source-of-Truth benutzt. Wer einen anderen
|
|
70
|
+
* Router anbinden will (TanStack Router, Expo Linking auf Mobile,
|
|
71
|
+
* Memory-Router in Tests) übergibt hier seinen eigenen Hook.
|
|
72
|
+
*
|
|
73
|
+
* Der Hook wird EINMAL im Component-Tree aufgerufen (siehe
|
|
74
|
+
* `BrowserNavBoot`), muss also den React-Rules-of-Hooks folgen —
|
|
75
|
+
* `useSyncExternalStore` auf der zugrundeliegenden Router-State
|
|
76
|
+
* ist das gängige Pattern.
|
|
77
|
+
*
|
|
78
|
+
* Wenn das Schema Workspaces deklariert, wird der Adapter mit
|
|
79
|
+
* `{ hasWorkspaces: true }` aufgerufen — der Default-Hook nutzt das
|
|
80
|
+
* um das URL-Pattern auf `/<workspace>/<screen>[/<entityId>]`
|
|
81
|
+
* umzustellen. Eigene Adapter dürfen die Option ignorieren wenn ihr
|
|
82
|
+
* Router das anders löst. `features` ist `app.features` — der
|
|
83
|
+
* Default-Hook braucht sie für resolveTarget() (ObjectTarget →
|
|
84
|
+
* ScreenTarget); eigene Adapter die nie ein ObjectTarget bekommen,
|
|
85
|
+
* dürfen sie ignorieren. */
|
|
86
|
+
readonly navAdapter?: (options?: {
|
|
87
|
+
readonly hasWorkspaces?: boolean;
|
|
88
|
+
readonly features?: readonly FeatureSchema[];
|
|
89
|
+
}) => NavApi;
|
|
90
|
+
/** App-wide default width for form/detail screens that don't set their
|
|
91
|
+
* own `layout.width` (fw#2656). Default "4xl" (unchanged behavior) — a
|
|
92
|
+
* consumer app that wants e.g. bundled-feature screens to match its own
|
|
93
|
+
* full-width lists passes `screenWidth: "full"` once here instead of
|
|
94
|
+
* forking every screen it doesn't own. Per-screen `layout.width` always
|
|
95
|
+
* wins over this default. */
|
|
96
|
+
readonly screenWidth?: FormWidth;
|
|
97
|
+
};
|
|
98
|
+
export declare function firstOpenScreenQn(features: readonly FeatureSchema[]): string | undefined;
|
|
99
|
+
export declare function firstLandingScreenQnForProjectedSchema(features: readonly FeatureSchema[]): string | undefined;
|
|
100
|
+
export declare function resolveRootScreenQn(features: readonly FeatureSchema[], explicitScreenQn: string | undefined, schemaIsRoleProjected: boolean): string | undefined;
|
|
101
|
+
export declare function mergeContentEditors(clientFeatures: readonly ClientFeatureDefinition[]): Record<string, ContentEditorComponent>;
|
|
102
|
+
export declare function createKumikoApp(options?: CreateKumikoAppOptions): {
|
|
103
|
+
readonly root: Root;
|
|
104
|
+
};
|