@cosmicdrift/kumiko-renderer 0.374.0 → 0.378.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 +9 -2
- package/dist/app/action-form-support.js +24 -2
- package/dist/app/client-actions.d.ts +2 -2
- 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/form-schema.d.ts +1 -1
- package/dist/app/form-schema.js +2 -2
- package/dist/app/kumiko-screen.d.ts +1 -1
- package/dist/app/kumiko-screen.js +10 -7
- package/dist/app/list-empty-content.d.ts +1 -1
- 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 +1 -1
- 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 +1 -1
- 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/form-derivation-patch.d.ts +8 -0
- package/dist/components/form-derivation-patch.js +24 -0
- package/dist/components/form-screen-layout.d.ts +13 -0
- package/dist/components/form-screen-layout.js +13 -0
- package/dist/components/grid-cell-for-field.d.ts +1 -1
- 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/render-edit-logic.d.ts +1 -1
- package/dist/components/render-edit-types.d.ts +6 -3
- package/dist/components/render-edit.d.ts +1 -1
- package/dist/components/render-edit.js +18 -3
- package/dist/components/render-field.d.ts +1 -1
- package/dist/components/render-field.js +12 -2
- 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/file-ids-of.d.ts +1 -0
- package/dist/file-ids-of.js +7 -0
- package/dist/flow-diagram/icons.d.ts +3 -0
- package/dist/flow-diagram/icons.js +14 -0
- package/dist/flow-diagram/index.d.ts +2 -0
- package/dist/flow-diagram/index.js +1 -0
- package/dist/flow-diagram/render.d.ts +3 -0
- package/dist/flow-diagram/render.js +234 -0
- package/dist/flow-diagram/types.d.ts +18 -0
- package/dist/flow-diagram/types.js +1 -0
- 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 +21 -0
- package/dist/headless/view-model/edit.js +512 -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 +6 -0
- package/dist/i18n.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +5 -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 +45 -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 +31 -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/file-value-list.d.ts +3 -0
- package/dist/web/primitives/file-value-list.js +22 -0
- package/dist/web/primitives/index.d.ts +34 -0
- package/dist/web/primitives/index.js +2023 -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/bounded-load-cache.d.ts +1 -0
- package/dist/web/widgets/bounded-load-cache.js +25 -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 +177 -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 +28 -0
- package/dist/web/widgets/index.js +31 -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/pdf-preview.d.ts +10 -0
- package/dist/web/widgets/pdf-preview.js +140 -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 +114 -7
- package/src/changes.json +92 -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 +405 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// @runtime client
|
|
3
|
+
//
|
|
4
|
+
// tiptap-backed implementation behind RichContentEditor's lazy() boundary —
|
|
5
|
+
// never import this file directly, tiptap must only load when a "rich"
|
|
6
|
+
// collection is actually rendered. StarterKit covers bold/italic/lists/
|
|
7
|
+
// headings, and its bundled Link extension autolinks on type/paste — no
|
|
8
|
+
// link button, so no URL-prompt UI to build or test.
|
|
9
|
+
import { EditorContent, useEditor, useEditorState } from "@tiptap/react";
|
|
10
|
+
import StarterKit from "@tiptap/starter-kit";
|
|
11
|
+
import { Bold as BoldIcon, Heading1, Heading2, Italic as ItalicIcon, List, ListOrdered, } from "lucide-react";
|
|
12
|
+
import { useEffect } from "react";
|
|
13
|
+
import { TextareaContentEditor, usePrimitives, useTranslation, VariableChips, } from "../../index.js";
|
|
14
|
+
import { cn } from "../lib/cn.js";
|
|
15
|
+
function Toolbar({ actions, disabled, }) {
|
|
16
|
+
const { Button } = usePrimitives();
|
|
17
|
+
return (_jsx("div", { className: "flex flex-wrap gap-1 border-b border-input p-1", children: actions.map((action) => (_jsx(Button, { type: "button", variant: action.isActive ? "primary" : "secondary", size: "icon", disabled: disabled, onClick: action.onClick, ariaLabel: action.label, children: _jsx(action.icon, { size: 16 }) }, action.label))) }));
|
|
18
|
+
}
|
|
19
|
+
export default function TiptapEditor({ id, value, onChange, variables, readOnly, }) {
|
|
20
|
+
const t = useTranslation();
|
|
21
|
+
// ponytail: rich = StarterKit's schema (bold/italic/lists/headings/links).
|
|
22
|
+
// Anything the schema doesn't model — <table>, <div>/<span>, style attrs,
|
|
23
|
+
// <img>, classes — is dropped on first parse (setContent below, and the
|
|
24
|
+
// initial `content: value` here). Upgrade if that ceiling is hit: add the
|
|
25
|
+
// matching tiptap extensions, or a raw-HTML mode for markup StarterKit
|
|
26
|
+
// can't represent.
|
|
27
|
+
const editor = useEditor({
|
|
28
|
+
extensions: [StarterKit],
|
|
29
|
+
content: value,
|
|
30
|
+
editable: !readOnly,
|
|
31
|
+
// Suspense (RichContentEditor's lazy boundary) speculatively mounts
|
|
32
|
+
// this component before committing it; immediate render would create
|
|
33
|
+
// an editor instance during that throwaway pass.
|
|
34
|
+
immediatelyRender: false,
|
|
35
|
+
// Caller-supplied id — the Field wrapping the editor (TextBlockEditor)
|
|
36
|
+
// associates its label via this id, see ContentEditorProps.id in
|
|
37
|
+
// content-editors.tsx.
|
|
38
|
+
editorProps: { attributes: { id } },
|
|
39
|
+
onUpdate: ({ editor: e }) => onChange(e.getHTML()),
|
|
40
|
+
});
|
|
41
|
+
// `useEditor` alone leaves `editor.isActive(...)` reads in the render body
|
|
42
|
+
// frozen on the last prop-driven render — @tiptap/react v3 defaults
|
|
43
|
+
// `shouldRerenderOnTransaction` to false, so a selection-only change (e.g.
|
|
44
|
+
// moving the cursor into bold text without typing) never triggers a
|
|
45
|
+
// re-render on its own. `useEditorState` subscribes to transactions itself
|
|
46
|
+
// and only re-renders when the selected slice of state actually changes.
|
|
47
|
+
const activeState = useEditorState({
|
|
48
|
+
editor,
|
|
49
|
+
selector: ({ editor: e }) => e === null
|
|
50
|
+
? null
|
|
51
|
+
: {
|
|
52
|
+
bold: e.isActive("bold"),
|
|
53
|
+
italic: e.isActive("italic"),
|
|
54
|
+
heading1: e.isActive("heading", { level: 1 }),
|
|
55
|
+
heading2: e.isActive("heading", { level: 2 }),
|
|
56
|
+
bulletList: e.isActive("bulletList"),
|
|
57
|
+
orderedList: e.isActive("orderedList"),
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
// TextBlockEditor loads the entry's content asynchronously (by-slug query
|
|
61
|
+
// resolves after mount), so `value` arrives after useEditor already read
|
|
62
|
+
// its initial (empty) content once. Sync it in — guarded against
|
|
63
|
+
// clobbering in-flight typing by comparing against the editor's own HTML.
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (editor && value !== editor.getHTML()) {
|
|
66
|
+
editor.commands.setContent(value, { emitUpdate: false });
|
|
67
|
+
}
|
|
68
|
+
}, [value, editor]);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
editor?.setEditable(!readOnly);
|
|
71
|
+
}, [readOnly, editor]);
|
|
72
|
+
if (!editor)
|
|
73
|
+
return (_jsx(TextareaContentEditor, { id: id, value: value, onChange: onChange, variables: variables, readOnly: readOnly }));
|
|
74
|
+
const actions = [
|
|
75
|
+
{
|
|
76
|
+
label: t("kumiko.contentEditor.bold"),
|
|
77
|
+
icon: BoldIcon,
|
|
78
|
+
isActive: activeState?.bold ?? false,
|
|
79
|
+
onClick: () => editor.chain().focus().toggleBold().run(),
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
label: t("kumiko.contentEditor.italic"),
|
|
83
|
+
icon: ItalicIcon,
|
|
84
|
+
isActive: activeState?.italic ?? false,
|
|
85
|
+
onClick: () => editor.chain().focus().toggleItalic().run(),
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
label: t("kumiko.contentEditor.heading1"),
|
|
89
|
+
icon: Heading1,
|
|
90
|
+
isActive: activeState?.heading1 ?? false,
|
|
91
|
+
onClick: () => editor.chain().focus().toggleHeading({ level: 1 }).run(),
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
label: t("kumiko.contentEditor.heading2"),
|
|
95
|
+
icon: Heading2,
|
|
96
|
+
isActive: activeState?.heading2 ?? false,
|
|
97
|
+
onClick: () => editor.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
label: t("kumiko.contentEditor.bulletList"),
|
|
101
|
+
icon: List,
|
|
102
|
+
isActive: activeState?.bulletList ?? false,
|
|
103
|
+
onClick: () => editor.chain().focus().toggleBulletList().run(),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
label: t("kumiko.contentEditor.orderedList"),
|
|
107
|
+
icon: ListOrdered,
|
|
108
|
+
isActive: activeState?.orderedList ?? false,
|
|
109
|
+
onClick: () => editor.chain().focus().toggleOrderedList().run(),
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
const insertVariable = (name) => {
|
|
113
|
+
editor
|
|
114
|
+
.chain()
|
|
115
|
+
.focus()
|
|
116
|
+
.insertContent({ type: "text", text: `{{${name}}}` })
|
|
117
|
+
.run();
|
|
118
|
+
};
|
|
119
|
+
return (_jsxs("div", { className: "rounded-md border border-input bg-transparent", children: [_jsx(Toolbar, { actions: actions, disabled: readOnly }), _jsx(EditorContent, { editor: editor, className: cn("min-h-40 px-3 py-2 text-base outline-none md:text-sm", "[&_.ProseMirror]:min-h-40 [&_.ProseMirror]:outline-none", "[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-6 [&_ol]:pl-6", "[&_h1]:text-xl [&_h1]:font-bold [&_h2]:text-lg [&_h2]:font-bold", "[&_a]:underline [&_a]:text-primary", "[&_strong]:font-bold [&_em]:italic") }), variables.length > 0 && (_jsx("div", { className: "border-t border-input p-1", children: _jsx(VariableChips, { variables: variables, onInsert: insertVariable, disabled: readOnly }) }))] }));
|
|
120
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { ActionNoticeProvider, useTranslation } from "../../index.js";
|
|
4
|
+
import { useToast } from "../primitives/toast.js";
|
|
5
|
+
/** Shows client-action outcomes as toasts; mount inside the ToastProvider. */
|
|
6
|
+
export function ToastActionNotifier({ children }) {
|
|
7
|
+
const { toast } = useToast();
|
|
8
|
+
const t = useTranslation();
|
|
9
|
+
const notify = useCallback((notice) => {
|
|
10
|
+
if (notice.tone === "success") {
|
|
11
|
+
toast({ title: notice.text, variant: "ok" });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
toast({ title: t("kumiko.rowAction.failed"), description: notice.text, variant: "bad" });
|
|
15
|
+
}, [toast, t]);
|
|
16
|
+
return _jsx(ActionNoticeProvider, { notify: notify, children: children });
|
|
17
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ConfigCascade, ConfigScope } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
type CascadeValueRenderer = (value: string | number | boolean) => ReactNode;
|
|
4
|
+
type ConfigCascadeViewProps = {
|
|
5
|
+
readonly cascade: ConfigCascade;
|
|
6
|
+
readonly screenScope: ConfigScope;
|
|
7
|
+
readonly onReset?: (key: string, scope: ConfigScope) => void;
|
|
8
|
+
readonly qualifiedKey?: string;
|
|
9
|
+
readonly required?: boolean;
|
|
10
|
+
readonly renderValue?: CascadeValueRenderer;
|
|
11
|
+
};
|
|
12
|
+
export declare function ConfigCascadeView({ cascade, screenScope, onReset, qualifiedKey, required, renderValue, }: ConfigCascadeViewProps): ReactNode;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useState } from "react";
|
|
3
|
+
import { usePrimitives, useTranslation } from "../../index.js";
|
|
4
|
+
import { Icon } from "../icons.js";
|
|
5
|
+
import { cn } from "../lib/cn.js";
|
|
6
|
+
const SOURCE_I18N_KEY = {
|
|
7
|
+
"user-row": "kumiko.config.source.user",
|
|
8
|
+
"tenant-row": "kumiko.config.source.tenant",
|
|
9
|
+
"system-row": "kumiko.config.source.system",
|
|
10
|
+
"app-override": "kumiko.config.source.appOverride",
|
|
11
|
+
computed: "kumiko.config.source.computed",
|
|
12
|
+
default: "kumiko.config.source.default",
|
|
13
|
+
missing: "kumiko.config.source.missing",
|
|
14
|
+
};
|
|
15
|
+
// Fallback-Reihenfolge der Cascade, spezifischste Quelle zuerst.
|
|
16
|
+
// Index-Vergleich gegen die Screen-Scope-Quelle entscheidet, welche
|
|
17
|
+
// Ebenen ein Nicht-Operator sehen darf.
|
|
18
|
+
const SOURCE_ORDER = [
|
|
19
|
+
"user-row",
|
|
20
|
+
"tenant-row",
|
|
21
|
+
"system-row",
|
|
22
|
+
"app-override",
|
|
23
|
+
"computed",
|
|
24
|
+
"default",
|
|
25
|
+
"missing",
|
|
26
|
+
];
|
|
27
|
+
function formatValue(value, hasValue, t, renderValue) {
|
|
28
|
+
if (!hasValue || value === undefined)
|
|
29
|
+
return t("kumiko.config.cascade.noValue");
|
|
30
|
+
if (renderValue !== undefined)
|
|
31
|
+
return renderValue(value);
|
|
32
|
+
if (typeof value === "boolean")
|
|
33
|
+
return t(value ? "kumiko.config.cascade.on" : "kumiko.config.cascade.off");
|
|
34
|
+
return String(value);
|
|
35
|
+
}
|
|
36
|
+
// The origin sentence interpolates the fallback value, which can be a node (a
|
|
37
|
+
// select's option label resolved by a query), so the translated template is
|
|
38
|
+
// split at a marker instead of interpolating a string.
|
|
39
|
+
const VALUE_MARKER = "\u0000";
|
|
40
|
+
function interpolateValue(template, value) {
|
|
41
|
+
const markerIndex = template.indexOf(VALUE_MARKER);
|
|
42
|
+
if (markerIndex === -1)
|
|
43
|
+
return template;
|
|
44
|
+
return (_jsxs(_Fragment, { children: [template.slice(0, markerIndex), value, template.slice(markerIndex + VALUE_MARKER.length)] }));
|
|
45
|
+
}
|
|
46
|
+
function scopeToSource(scope) {
|
|
47
|
+
if (scope === "user")
|
|
48
|
+
return "user-row";
|
|
49
|
+
if (scope === "tenant")
|
|
50
|
+
return "tenant-row";
|
|
51
|
+
return "system-row";
|
|
52
|
+
}
|
|
53
|
+
function toDisplayLevels(levels, screenScopeSource) {
|
|
54
|
+
// System-Screens sind Operator-Sicht — volle Cascade inkl.
|
|
55
|
+
// app-override/computed/default bleibt sichtbar.
|
|
56
|
+
if (screenScopeSource === "system-row") {
|
|
57
|
+
return levels.map((level) => ({ level, badgeSource: level.source }));
|
|
58
|
+
}
|
|
59
|
+
const scopeIdx = SOURCE_ORDER.indexOf(screenScopeSource);
|
|
60
|
+
const own = levels.filter((l) => SOURCE_ORDER.indexOf(l.source) <= scopeIdx);
|
|
61
|
+
const higher = levels.filter((l) => SOURCE_ORDER.indexOf(l.source) > scopeIdx);
|
|
62
|
+
// Genau eine Fallback-Zeile: die aktive höhere Ebene (deren Wert der
|
|
63
|
+
// User effektiv bekommt), sonst der deklarierte Default/Missing.
|
|
64
|
+
const fallback = higher.find((l) => l.isActive) ??
|
|
65
|
+
higher.find((l) => l.source === "default" || l.source === "missing");
|
|
66
|
+
const ownRows = own.map((level) => ({ level, badgeSource: level.source }));
|
|
67
|
+
if (fallback === undefined)
|
|
68
|
+
return ownRows;
|
|
69
|
+
return [
|
|
70
|
+
...ownRows,
|
|
71
|
+
{
|
|
72
|
+
level: fallback,
|
|
73
|
+
badgeSource: "default",
|
|
74
|
+
// Ein durchgängiger Begriff "Standard" (DE) / "Default" (EN) — derselbe
|
|
75
|
+
// Key wie das Feld-Label-Badge (kumiko.config.source.default), damit
|
|
76
|
+
// Badge + Cascade-Disclosure NICHT zwei verschiedene Wörter zeigen
|
|
77
|
+
// (Bug-Bash 3 #11). Der Screen-Scope kann die Operator-Ebenen
|
|
78
|
+
// (System/Override/Computed) weder setzen noch zurücksetzen, deshalb
|
|
79
|
+
// erscheinen sie hier neutral als "Standard".
|
|
80
|
+
badgeLabelKey: "kumiko.config.source.default",
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
const OWN_LEVEL_ORIGIN_KEY = {
|
|
85
|
+
tenant: "kumiko.config.cascade.origin.tenant",
|
|
86
|
+
user: "kumiko.config.cascade.origin.user",
|
|
87
|
+
system: "kumiko.config.cascade.origin.system",
|
|
88
|
+
};
|
|
89
|
+
// A missing or empty default reads as "Default is ." — drop the clause instead.
|
|
90
|
+
const OWN_LEVEL_ORIGIN_NO_DEFAULT_KEY = {
|
|
91
|
+
tenant: "kumiko.config.cascade.originNoDefault.tenant",
|
|
92
|
+
user: "kumiko.config.cascade.originNoDefault.user",
|
|
93
|
+
system: "kumiko.config.cascade.originNoDefault.system",
|
|
94
|
+
};
|
|
95
|
+
export function ConfigCascadeView({ cascade, screenScope, onReset, qualifiedKey, required = false, renderValue, }) {
|
|
96
|
+
const t = useTranslation();
|
|
97
|
+
const { Button } = usePrimitives();
|
|
98
|
+
const [expanded, setExpanded] = useState(false);
|
|
99
|
+
const panelId = useId();
|
|
100
|
+
// Safety net: callers should already filter malformed cascades, but
|
|
101
|
+
// a missing levels-array (e.g. from a partial mock) shouldn't crash
|
|
102
|
+
// the screen.
|
|
103
|
+
if (!Array.isArray(cascade?.levels))
|
|
104
|
+
return null;
|
|
105
|
+
const screenScopeSource = scopeToSource(screenScope);
|
|
106
|
+
const displayLevels = toDisplayLevels(cascade.levels, screenScopeSource);
|
|
107
|
+
const activeDisplay = displayLevels.find((d) => d.level.isActive);
|
|
108
|
+
const hasOverride = activeDisplay?.level.source === screenScopeSource;
|
|
109
|
+
// Aufklappbar nur wenn das Panel echten Mehrwert bringt: ein eigener
|
|
110
|
+
// Override (→ Reset) oder mehr als eine Ebene MIT Wert. Leere Ebenen
|
|
111
|
+
// (z.B. die ungesetzte tenant-row eines reinen Default-Felds) zählen
|
|
112
|
+
// nicht — sonst wäre ein Feld, das nur seinen Standard zeigt, fälschlich
|
|
113
|
+
// aufklappbar und das Panel nur eine Wiederholung des Triggers.
|
|
114
|
+
const valuedLevels = displayLevels.filter((d) => d.level.hasValue);
|
|
115
|
+
const expandable = hasOverride || valuedLevels.length > 1;
|
|
116
|
+
const isUnset = activeDisplay === undefined || !activeDisplay.level.hasValue;
|
|
117
|
+
// The value the field falls back to if this level is reset: the next level
|
|
118
|
+
// below the active one that holds a value.
|
|
119
|
+
const activeIndex = activeDisplay === undefined ? -1 : displayLevels.indexOf(activeDisplay);
|
|
120
|
+
const fallbackLevel = displayLevels.slice(activeIndex + 1).find((d) => d.level.hasValue)?.level;
|
|
121
|
+
const fallbackValue = fallbackLevel === undefined || fallbackLevel.value === ""
|
|
122
|
+
? undefined
|
|
123
|
+
: formatValue(fallbackLevel.value, true, t, renderValue);
|
|
124
|
+
const origin = hasOverride
|
|
125
|
+
? {
|
|
126
|
+
text: fallbackValue === undefined
|
|
127
|
+
? t(OWN_LEVEL_ORIGIN_NO_DEFAULT_KEY[screenScope])
|
|
128
|
+
: interpolateValue(t(OWN_LEVEL_ORIGIN_KEY[screenScope], { value: VALUE_MARKER }), fallbackValue),
|
|
129
|
+
className: "text-status-active",
|
|
130
|
+
}
|
|
131
|
+
: isUnset
|
|
132
|
+
? required
|
|
133
|
+
? {
|
|
134
|
+
text: t("kumiko.config.cascade.notSetRequired"),
|
|
135
|
+
className: "text-status-bad",
|
|
136
|
+
}
|
|
137
|
+
: {
|
|
138
|
+
text: t("kumiko.config.cascade.noValue"),
|
|
139
|
+
className: "text-muted-foreground",
|
|
140
|
+
}
|
|
141
|
+
: {
|
|
142
|
+
text: screenScope === "system"
|
|
143
|
+
? t(SOURCE_I18N_KEY[activeDisplay.badgeSource])
|
|
144
|
+
: t("kumiko.config.cascade.origin.default"),
|
|
145
|
+
className: "text-muted-foreground",
|
|
146
|
+
};
|
|
147
|
+
return (_jsxs("div", { className: "flex flex-col gap-1 text-xs", "data-testid": "config-cascade", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-1 gap-y-1", children: [_jsx("span", { className: cn("inline-flex items-center gap-1.5", origin.className), children: origin.text }), hasOverride && onReset !== undefined && qualifiedKey !== undefined ? (_jsx(Button, { variant: "ghost", size: "sm", onClick: () => onReset(qualifiedKey, screenScope), testId: "config-cascade-reset", className: "h-auto px-1.5 py-0.5 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground", children: t(screenScope === "system"
|
|
148
|
+
? "kumiko.config.cascade.resetToApp"
|
|
149
|
+
: "kumiko.config.cascade.resetTo") })) : null] }), expandable && (cascade.levels.length > 2 || screenScope === "system") ? (_jsxs("button", { type: "button", onClick: () => setExpanded((v) => !v), "aria-expanded": expanded, ...(expanded && { "aria-controls": panelId }), className: "inline-flex cursor-pointer items-center gap-1 self-start rounded-sm text-muted-foreground outline-none hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: [_jsx(Icon, { name: "chevron-right", className: cn("size-3.5 transition-transform motion-reduce:transition-none", expanded && "rotate-90") }), t(expanded ? "kumiko.config.cascade.hideLevels" : "kumiko.config.cascade.showLevels")] })) : null, expanded && expandable && (cascade.levels.length > 2 || screenScope === "system") ? (_jsx("ul", { id: panelId, className: "flex flex-col gap-0.5 border-l border-border pl-3", children: displayLevels.map((display) => (_jsx(CascadeLevelRow, { display: display, ...(renderValue !== undefined && { renderValue }) }, display.level.source))) })) : null] }));
|
|
150
|
+
}
|
|
151
|
+
function CascadeLevelRow({ display, renderValue, }) {
|
|
152
|
+
const t = useTranslation();
|
|
153
|
+
const { level } = display;
|
|
154
|
+
return (_jsxs("li", { className: cn("flex items-baseline gap-3", level.isActive ? "text-foreground" : "text-muted-foreground"), children: [_jsx("span", { className: "w-28 shrink-0", children: t(display.badgeLabelKey ?? SOURCE_I18N_KEY[display.badgeSource]) }), _jsx("span", { className: cn(level.isActive && "font-medium"), children: formatValue(level.value, level.hasValue, t, renderValue) }), level.isActive ? (_jsx("span", { className: "text-primary", children: t("kumiko.config.cascade.activeMarker") })) : null] }));
|
|
155
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ConfigScope, ConfigValueSource } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
export declare function ConfigSourceBadge({ source, screenScope, }: {
|
|
4
|
+
readonly source: ConfigValueSource;
|
|
5
|
+
readonly screenScope?: ConfigScope;
|
|
6
|
+
}): ReactNode;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useTranslation } from "../../index.js";
|
|
3
|
+
import { cn } from "../lib/cn.js";
|
|
4
|
+
const SOURCE_LABEL_KEY = {
|
|
5
|
+
"user-row": "kumiko.config.source.user",
|
|
6
|
+
"tenant-row": "kumiko.config.source.tenant",
|
|
7
|
+
"system-row": "kumiko.config.source.system",
|
|
8
|
+
"app-override": "kumiko.config.source.appOverride",
|
|
9
|
+
computed: "kumiko.config.source.computed",
|
|
10
|
+
default: "kumiko.config.source.default",
|
|
11
|
+
missing: "kumiko.config.source.missing",
|
|
12
|
+
};
|
|
13
|
+
// Two states only: set on a scope row (accent) vs. inherited/default (neutral);
|
|
14
|
+
// a missing value is the one status colour.
|
|
15
|
+
const ROW_SOURCES = new Set([
|
|
16
|
+
"user-row",
|
|
17
|
+
"tenant-row",
|
|
18
|
+
"system-row",
|
|
19
|
+
]);
|
|
20
|
+
function badgeToneClass(source) {
|
|
21
|
+
if (source === "missing")
|
|
22
|
+
return "bg-status-bad-surface text-status-bad";
|
|
23
|
+
return ROW_SOURCES.has(source) ? "bg-primary/10 text-primary" : "bg-muted text-muted-foreground";
|
|
24
|
+
}
|
|
25
|
+
const SOURCE_ORDER = [
|
|
26
|
+
"user-row",
|
|
27
|
+
"tenant-row",
|
|
28
|
+
"system-row",
|
|
29
|
+
"app-override",
|
|
30
|
+
"computed",
|
|
31
|
+
"default",
|
|
32
|
+
"missing",
|
|
33
|
+
];
|
|
34
|
+
function scopeToSource(scope) {
|
|
35
|
+
if (scope === "user")
|
|
36
|
+
return "user-row";
|
|
37
|
+
if (scope === "tenant")
|
|
38
|
+
return "tenant-row";
|
|
39
|
+
return "system-row";
|
|
40
|
+
}
|
|
41
|
+
export function ConfigSourceBadge({ source, screenScope, }) {
|
|
42
|
+
const t = useTranslation();
|
|
43
|
+
// Gleiche Kollaps-Regel wie toDisplayLevels (config-cascade.tsx):
|
|
44
|
+
// Operator-Quellen oberhalb des Screen-Scopes erscheinen für Nicht-
|
|
45
|
+
// Operator-Screens als neutrales "Vorgabe"-Badge — sonst leakte das
|
|
46
|
+
// Badge die System-Quelle, die die Cascade-View bewusst versteckt.
|
|
47
|
+
let effective = source;
|
|
48
|
+
if (screenScope !== undefined && screenScope !== "system") {
|
|
49
|
+
const scopeIdx = SOURCE_ORDER.indexOf(scopeToSource(screenScope));
|
|
50
|
+
if (SOURCE_ORDER.indexOf(source) > scopeIdx && source !== "missing") {
|
|
51
|
+
effective = "default";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return (_jsx("span", { "data-testid": "config-source-badge", className: cn("ml-1.5 inline-flex items-center whitespace-nowrap rounded px-1.5 text-[11px] font-medium leading-[18px]", badgeToneClass(effective)), children: t(SOURCE_LABEL_KEY[effective]) }));
|
|
55
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { NavIconKey } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
export type { NavIconKey } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
4
|
+
export declare const NAV_ICONS: {
|
|
5
|
+
readonly dashboard: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
6
|
+
readonly "layout-grid": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
7
|
+
readonly "book-open": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
8
|
+
readonly "clipboard-list": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
9
|
+
readonly package: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
10
|
+
readonly gauge: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
11
|
+
readonly list: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
12
|
+
readonly table: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
13
|
+
readonly layers: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
14
|
+
readonly building: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
15
|
+
readonly calculator: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
16
|
+
readonly wallet: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
17
|
+
readonly coins: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
18
|
+
readonly "credit-card": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
19
|
+
readonly "piggy-bank": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
20
|
+
readonly receipt: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
21
|
+
readonly chart: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
22
|
+
readonly "bar-chart": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
23
|
+
readonly trending: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
24
|
+
readonly sparkles: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
25
|
+
readonly wand: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
26
|
+
readonly calendar: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
27
|
+
readonly file: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
28
|
+
readonly folder: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
29
|
+
readonly "folder-open": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
30
|
+
readonly home: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
31
|
+
readonly bell: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
32
|
+
readonly shield: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
33
|
+
readonly "shield-check": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
34
|
+
readonly send: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
35
|
+
readonly settings: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
36
|
+
readonly users: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
37
|
+
readonly user: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
38
|
+
readonly search: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
39
|
+
readonly tag: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
40
|
+
readonly key: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
41
|
+
readonly link: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
42
|
+
readonly palette: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
43
|
+
readonly share: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
44
|
+
readonly server: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
45
|
+
readonly mail: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
46
|
+
readonly lock: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
47
|
+
readonly hash: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
48
|
+
readonly download: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
49
|
+
readonly upload: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
50
|
+
readonly rocket: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
51
|
+
readonly plus: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
52
|
+
readonly languages: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
53
|
+
readonly trash: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
54
|
+
readonly x: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
55
|
+
readonly check: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
56
|
+
readonly "arrow-left": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
57
|
+
readonly "arrow-right": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
58
|
+
readonly copy: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
59
|
+
readonly pencil: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
60
|
+
readonly eye: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
61
|
+
readonly "eye-off": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
62
|
+
readonly filter: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
63
|
+
readonly refresh: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
64
|
+
readonly "more-horizontal": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
65
|
+
readonly "more-vertical": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
66
|
+
readonly "external-link": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
67
|
+
readonly "chevron-down": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
68
|
+
readonly "chevron-left": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
69
|
+
readonly "chevron-right": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
70
|
+
readonly "chevron-up": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
71
|
+
readonly save: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
72
|
+
readonly undo: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
73
|
+
readonly archive: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
74
|
+
readonly star: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
75
|
+
readonly flag: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
76
|
+
readonly clock: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
77
|
+
readonly "map-pin": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
78
|
+
readonly phone: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
79
|
+
readonly printer: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
80
|
+
readonly "alert-triangle": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
81
|
+
readonly info: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
82
|
+
readonly "check-circle": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
83
|
+
readonly "x-circle": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
84
|
+
readonly loader: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
85
|
+
readonly mic: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
86
|
+
readonly "circle-stop": import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
87
|
+
readonly image: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
88
|
+
readonly camera: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
89
|
+
readonly headphones: import("react").ForwardRefExoticComponent<Omit<import("lucide-react").LucideProps, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
|
|
90
|
+
};
|
|
91
|
+
export declare function Icon({ name, className, }: {
|
|
92
|
+
readonly name: NavIconKey;
|
|
93
|
+
readonly className?: string;
|
|
94
|
+
}): ReactNode;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { AlertTriangle, Archive, ArrowLeft, ArrowRight, BarChart3, Bell, BookOpen, Building, Calculator, CalendarDays, Camera, Check, CheckCircle2, ChevronDown, ChevronLeft, ChevronRight, ChevronUp, CircleStop, ClipboardList, Clock, Coins, Copy, CreditCard, Download, ExternalLink, Eye, EyeOff, FileText, Filter, Flag, Folder, FolderOpen, Gauge, Hash, Headphones, Home, ImageIcon, Info, KeyRound, Languages, Layers, LayoutDashboard, LayoutGrid, LineChart, Link, List, Loader2, Lock, Mail, MapPin, Mic, MoreHorizontal, MoreVertical, Package, Palette, Pencil, Phone, PiggyBank, Plus, Printer, Receipt, RefreshCw, Rocket, Save, Search, Send, Server, Settings, Share2, Shield, ShieldCheck, Sparkles, Star, Table, Tag, Trash2, TrendingUp, Undo2, Upload, User, Users, Wallet, Wand2, X, XCircle, } from "lucide-react";
|
|
3
|
+
import { cn } from "./lib/cn.js";
|
|
4
|
+
export const NAV_ICONS = {
|
|
5
|
+
dashboard: LayoutDashboard,
|
|
6
|
+
"layout-grid": LayoutGrid,
|
|
7
|
+
"book-open": BookOpen,
|
|
8
|
+
"clipboard-list": ClipboardList,
|
|
9
|
+
package: Package,
|
|
10
|
+
gauge: Gauge,
|
|
11
|
+
list: List,
|
|
12
|
+
table: Table,
|
|
13
|
+
layers: Layers,
|
|
14
|
+
building: Building,
|
|
15
|
+
calculator: Calculator,
|
|
16
|
+
wallet: Wallet,
|
|
17
|
+
coins: Coins,
|
|
18
|
+
"credit-card": CreditCard,
|
|
19
|
+
"piggy-bank": PiggyBank,
|
|
20
|
+
receipt: Receipt,
|
|
21
|
+
chart: LineChart,
|
|
22
|
+
"bar-chart": BarChart3,
|
|
23
|
+
trending: TrendingUp,
|
|
24
|
+
sparkles: Sparkles,
|
|
25
|
+
wand: Wand2,
|
|
26
|
+
calendar: CalendarDays,
|
|
27
|
+
file: FileText,
|
|
28
|
+
folder: Folder,
|
|
29
|
+
"folder-open": FolderOpen,
|
|
30
|
+
home: Home,
|
|
31
|
+
bell: Bell,
|
|
32
|
+
shield: Shield,
|
|
33
|
+
"shield-check": ShieldCheck,
|
|
34
|
+
send: Send,
|
|
35
|
+
settings: Settings,
|
|
36
|
+
users: Users,
|
|
37
|
+
user: User,
|
|
38
|
+
search: Search,
|
|
39
|
+
tag: Tag,
|
|
40
|
+
key: KeyRound,
|
|
41
|
+
link: Link,
|
|
42
|
+
palette: Palette,
|
|
43
|
+
share: Share2,
|
|
44
|
+
server: Server,
|
|
45
|
+
mail: Mail,
|
|
46
|
+
lock: Lock,
|
|
47
|
+
hash: Hash,
|
|
48
|
+
download: Download,
|
|
49
|
+
upload: Upload,
|
|
50
|
+
rocket: Rocket,
|
|
51
|
+
plus: Plus,
|
|
52
|
+
languages: Languages,
|
|
53
|
+
trash: Trash2,
|
|
54
|
+
x: X,
|
|
55
|
+
check: Check,
|
|
56
|
+
"arrow-left": ArrowLeft,
|
|
57
|
+
"arrow-right": ArrowRight,
|
|
58
|
+
copy: Copy,
|
|
59
|
+
pencil: Pencil,
|
|
60
|
+
eye: Eye,
|
|
61
|
+
"eye-off": EyeOff,
|
|
62
|
+
filter: Filter,
|
|
63
|
+
refresh: RefreshCw,
|
|
64
|
+
"more-horizontal": MoreHorizontal,
|
|
65
|
+
"more-vertical": MoreVertical,
|
|
66
|
+
"external-link": ExternalLink,
|
|
67
|
+
"chevron-down": ChevronDown,
|
|
68
|
+
"chevron-left": ChevronLeft,
|
|
69
|
+
"chevron-right": ChevronRight,
|
|
70
|
+
"chevron-up": ChevronUp,
|
|
71
|
+
save: Save,
|
|
72
|
+
undo: Undo2,
|
|
73
|
+
archive: Archive,
|
|
74
|
+
star: Star,
|
|
75
|
+
flag: Flag,
|
|
76
|
+
clock: Clock,
|
|
77
|
+
"map-pin": MapPin,
|
|
78
|
+
phone: Phone,
|
|
79
|
+
printer: Printer,
|
|
80
|
+
"alert-triangle": AlertTriangle,
|
|
81
|
+
info: Info,
|
|
82
|
+
"check-circle": CheckCircle2,
|
|
83
|
+
"x-circle": XCircle,
|
|
84
|
+
loader: Loader2,
|
|
85
|
+
mic: Mic,
|
|
86
|
+
"circle-stop": CircleStop,
|
|
87
|
+
image: ImageIcon,
|
|
88
|
+
camera: Camera,
|
|
89
|
+
headphones: Headphones,
|
|
90
|
+
};
|
|
91
|
+
// Widened alias for runtime lookups against the plain `string` icon keys
|
|
92
|
+
// resolved-tree nodes carry — not the closed NavIconKey union NAV_ICONS
|
|
93
|
+
// itself is typed against.
|
|
94
|
+
const ICON_LOOKUP = NAV_ICONS;
|
|
95
|
+
export function Icon({ name, className, }) {
|
|
96
|
+
const LucideIcon = Object.hasOwn(NAV_ICONS, name) ? ICON_LOOKUP[name] : undefined;
|
|
97
|
+
if (LucideIcon !== undefined)
|
|
98
|
+
return _jsx(LucideIcon, { "aria-hidden": "true", className: className });
|
|
99
|
+
return (_jsx("span", { "aria-hidden": "true", className: cn("text-xs", className), children: name }));
|
|
100
|
+
}
|