@cosmicdrift/kumiko-renderer 0.374.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 +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 +7 -6
- 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/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 +2 -2
- package/dist/components/render-edit.d.ts +1 -1
- package/dist/components/render-edit.js +4 -2
- package/dist/components/render-field.d.ts +1 -1
- package/dist/components/render-field.js +4 -1
- 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.d.ts +1 -1
- package/dist/i18n.js +1 -1
- package/dist/index.js +4 -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 +35 -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 +53 -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,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
|
+
}
|