@bettercms-ai/kit 1.0.0 → 2.0.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 +33 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/{adapters → dist/adapters}/icons.js +2 -2
- package/dist/adapters/icons.js.map +1 -0
- package/{adapters → dist/adapters}/lossy.d.ts +90 -31
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
- package/{adapters → dist/adapters}/prod-types.js +71 -3
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +996 -179
- package/dist/adapters/schema.js.map +1 -0
- package/{adapters → dist/adapters}/values.d.ts +26 -5
- package/{adapters → dist/adapters}/values.js +87 -17
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/{context.d.ts → dist/context.d.ts} +92 -2
- package/{context.js → dist/context.js} +5 -2
- package/dist/context.js.map +1 -0
- package/{controls → dist/controls}/button.d.ts +19 -5
- package/{controls → dist/controls}/button.js +125 -54
- package/dist/controls/button.js.map +1 -0
- package/{controls → dist/controls}/c1.js +1 -1
- package/dist/controls/c1.js.map +1 -0
- package/{controls → dist/controls}/c2.js +1 -1
- package/dist/controls/c2.js.map +1 -0
- package/{controls → dist/controls}/choice.d.ts +7 -2
- package/{controls → dist/controls}/choice.js +71 -18
- package/dist/controls/choice.js.map +1 -0
- package/{controls → dist/controls}/code-register.js +1 -1
- package/dist/controls/code-register.js.map +1 -0
- package/{controls → dist/controls}/code.js +10 -9
- package/dist/controls/code.js.map +1 -0
- package/{controls → dist/controls}/color.js +8 -8
- package/dist/controls/color.js.map +1 -0
- package/{controls → dist/controls}/component-services.d.ts +42 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/{controls → dist/controls}/date-register.js +1 -1
- package/dist/controls/date-register.js.map +1 -0
- package/{controls → dist/controls}/date-zone.js +8 -2
- package/dist/controls/date-zone.js.map +1 -0
- package/{controls → dist/controls}/date.js +32 -24
- package/dist/controls/date.js.map +1 -0
- package/{controls → dist/controls}/form-picker-register.js +1 -1
- package/dist/controls/form-picker-register.js.map +1 -0
- package/{controls → dist/controls}/form-picker.js +11 -9
- package/dist/controls/form-picker.js.map +1 -0
- package/{controls → dist/controls}/icon-register.js +1 -1
- package/dist/controls/icon-register.js.map +1 -0
- package/{controls → dist/controls}/icon.d.ts +4 -2
- package/{controls → dist/controls}/icon.js +32 -27
- package/dist/controls/icon.js.map +1 -0
- package/{controls → dist/controls}/index.d.ts +1 -1
- package/{controls → dist/controls}/index.js +4 -3
- package/dist/controls/index.js.map +1 -0
- package/{controls → dist/controls}/json-register.js +1 -1
- package/dist/controls/json-register.js.map +1 -0
- package/{controls → dist/controls}/json.js +13 -3
- package/dist/controls/json.js.map +1 -0
- package/{controls → dist/controls}/link.js +6 -6
- package/dist/controls/link.js.map +1 -0
- package/{controls → dist/controls}/location-register.js +1 -1
- package/dist/controls/location-register.js.map +1 -0
- package/{controls → dist/controls}/location.js +64 -40
- package/dist/controls/location.js.map +1 -0
- package/{controls → dist/controls}/media-register.js +1 -1
- package/dist/controls/media-register.js.map +1 -0
- package/{controls → dist/controls}/media-services.d.ts +6 -0
- package/dist/controls/media-services.js +0 -0
- package/{controls → dist/controls}/media.d.ts +35 -4
- package/{controls → dist/controls}/media.js +491 -171
- package/dist/controls/media.js.map +1 -0
- package/{controls → dist/controls}/number.js +10 -9
- package/dist/controls/number.js.map +1 -0
- package/{controls → dist/controls}/reference-register.js +1 -1
- package/dist/controls/reference-register.js.map +1 -0
- package/{controls → dist/controls}/reference-services.d.ts +4 -0
- package/dist/controls/reference-services.js +0 -0
- package/{controls → dist/controls}/reference.d.ts +1 -1
- package/{controls → dist/controls}/reference.js +93 -77
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/{controls → dist/controls}/rich-text/blocks.js +471 -144
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
- package/{controls → dist/controls}/rich-text/catalog.js +75 -65
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +3 -1
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
- package/{controls → dist/controls}/rich-text/component-card.js +417 -99
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
- package/{controls → dist/controls}/rich-text/control.js +84 -42
- package/dist/controls/rich-text/control.js.map +1 -0
- package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
- package/{controls → dist/controls}/rich-text/dom.js +379 -50
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
- package/{controls → dist/controls}/rich-text/editor.js +148 -48
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
- package/{controls → dist/controls}/rich-text/floating.js +35 -18
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/{controls → dist/controls}/rich-text/index.js +1 -1
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/{controls → dist/controls}/rich-text/markdown.js +4 -2
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/{controls → dist/controls}/rich-text/ops.js +17 -15
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
- package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/{controls → dist/controls}/scale.js +5 -5
- package/dist/controls/scale.js.map +1 -0
- package/{controls → dist/controls}/slot-register.js +1 -1
- package/dist/controls/slot-register.js.map +1 -0
- package/{controls → dist/controls}/slot-services.d.ts +25 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/{controls → dist/controls}/slot.js +42 -24
- package/dist/controls/slot.js.map +1 -0
- package/{controls → dist/controls}/table/index.js +1 -1
- package/dist/controls/table/index.js.map +1 -0
- package/{controls → dist/controls}/table/prod.js +3 -3
- package/dist/controls/table/prod.js.map +1 -0
- package/{controls → dist/controls}/table/refs.js +13 -2
- package/dist/controls/table/refs.js.map +1 -0
- package/{controls → dist/controls}/table/stored.js +1 -1
- package/dist/controls/table/stored.js.map +1 -0
- package/{controls → dist/controls}/table/table-editor.js +51 -48
- package/dist/controls/table/table-editor.js.map +1 -0
- package/{controls → dist/controls}/table/table-link.js +3 -3
- package/dist/controls/table/table-link.js.map +1 -0
- package/{controls → dist/controls}/table/table.js +3 -3
- package/dist/controls/table/table.js.map +1 -0
- package/{controls → dist/controls}/text.d.ts +2 -2
- package/{controls → dist/controls}/text.js +78 -43
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/{engine → dist/engine}/array.js +34 -21
- package/dist/engine/array.js.map +1 -0
- package/{engine → dist/engine}/bits.js +1 -1
- package/dist/engine/bits.js.map +1 -0
- package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
- package/{engine → dist/engine}/breadcrumb.js +12 -36
- package/dist/engine/breadcrumb.js.map +1 -0
- package/{engine → dist/engine}/expand.d.ts +2 -4
- package/{engine → dist/engine}/expand.js +5 -22
- package/dist/engine/expand.js.map +1 -0
- package/{engine → dist/engine}/field-list.js +1 -1
- package/dist/engine/field-list.js.map +1 -0
- package/{engine → dist/engine}/field-shell.js +249 -121
- package/dist/engine/field-shell.js.map +1 -0
- package/{engine → dist/engine}/frame.d.ts +3 -1
- package/{engine → dist/engine}/frame.js +16 -14
- package/dist/engine/frame.js.map +1 -0
- package/{engine → dist/engine}/group-summary.d.ts +2 -1
- package/{engine → dist/engine}/group-summary.js +7 -3
- package/dist/engine/group-summary.js.map +1 -0
- package/{engine → dist/engine}/grouping.d.ts +19 -5
- package/{engine → dist/engine}/grouping.js +193 -21
- package/dist/engine/grouping.js.map +1 -0
- package/{engine → dist/engine}/item-list.d.ts +11 -1
- package/{engine → dist/engine}/item-list.js +35 -13
- package/dist/engine/item-list.js.map +1 -0
- package/{engine → dist/engine}/kit-field.js +45 -10
- package/dist/engine/kit-field.js.map +1 -0
- package/{engine → dist/engine}/schema-form.d.ts +27 -2
- package/{engine → dist/engine}/schema-form.js +182 -40
- package/dist/engine/schema-form.js.map +1 -0
- package/{engine → dist/engine}/slot.js +5 -15
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/{kit.css → dist/kit.css} +19 -0
- package/{lib → dist/lib}/cn.js +7 -4
- package/dist/lib/cn.js.map +1 -0
- package/{lib → dist/lib}/columns.js +4 -1
- package/dist/lib/columns.js.map +1 -0
- package/{lib → dist/lib}/frames.js +2 -2
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/{lib → dist/lib}/icons.js +4 -3
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/{lib → dist/lib}/path.js +4 -2
- package/dist/lib/path.js.map +1 -0
- package/{lib → dist/lib}/schema.d.ts +34 -3
- package/{lib → dist/lib}/schema.js +110 -13
- package/dist/lib/schema.js.map +1 -0
- package/{lib → dist/lib}/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -0
- package/{lib → dist/lib}/validate.d.ts +11 -1
- package/{lib → dist/lib}/validate.js +85 -11
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/{schema → dist/schema}/adapters.js +1 -2
- package/dist/schema/adapters.js.map +1 -0
- package/{schema → dist/schema}/help.d.ts +2 -0
- package/{schema → dist/schema}/help.js +6 -4
- package/dist/schema/help.js.map +1 -0
- package/{schema → dist/schema}/scale.js +1 -1
- package/dist/schema/scale.js.map +1 -0
- package/{schema → dist/schema}/sources.js +1 -1
- package/dist/schema/sources.js.map +1 -0
- package/{schema → dist/schema}/table.js +11 -10
- package/dist/schema/table.js.map +1 -0
- package/{schema → dist/schema}/types.d.ts +29 -1
- package/{schema → dist/schema}/types.js +1 -1
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +22 -0
- package/dist/theme.js +43 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.js +0 -0
- package/{ui → dist/ui}/action-tray.d.ts +1 -1
- package/{ui → dist/ui}/action-tray.js +20 -19
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +6 -7
- package/dist/ui/button.js.map +1 -0
- package/{ui → dist/ui}/choice-switch.js +1 -1
- package/dist/ui/choice-switch.js.map +1 -0
- package/{ui → dist/ui}/controls.js +51 -39
- package/dist/ui/controls.js.map +1 -0
- package/{ui → dist/ui}/display.d.ts +10 -3
- package/{ui → dist/ui}/display.js +57 -46
- package/dist/ui/display.js.map +1 -0
- package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
- package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/{ui → dist/ui}/field-context.js +1 -1
- package/dist/ui/field-context.js.map +1 -0
- package/{ui → dist/ui}/floating-panel.d.ts +1 -1
- package/{ui → dist/ui}/floating-panel.js +28 -12
- package/dist/ui/floating-panel.js.map +1 -0
- package/{ui → dist/ui}/index.d.ts +4 -0
- package/dist/ui/index.js +18 -0
- package/{ui → dist/ui}/input.d.ts +1 -1
- package/{ui → dist/ui}/input.js +9 -9
- package/dist/ui/input.js.map +1 -0
- package/{ui → dist/ui}/mode-bar.js +3 -3
- package/dist/ui/mode-bar.js.map +1 -0
- package/{ui → dist/ui}/overlay.d.ts +77 -5
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/{ui → dist/ui}/path-crumbs.js +37 -3
- package/dist/ui/path-crumbs.js.map +1 -0
- package/{ui → dist/ui}/presence.js +2 -2
- package/dist/ui/presence.js.map +1 -0
- package/{ui → dist/ui}/select.js +89 -87
- package/dist/ui/select.js.map +1 -0
- package/{ui → dist/ui}/shortcut-hint.js +1 -1
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/{ui → dist/ui}/surfaces.js +1 -1
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
- package/{ui → dist/ui}/tooltip-root.js +9 -8
- package/dist/ui/tooltip-root.js.map +1 -0
- package/{ui → dist/ui}/variants.js +1 -1
- package/dist/ui/variants.js.map +1 -0
- package/package.json +77 -23
- package/adapters/icons.js.map +0 -1
- package/adapters/lossy.js +0 -233
- package/adapters/lossy.js.map +0 -1
- package/adapters/prod-types.js.map +0 -1
- package/adapters/schema.js.map +0 -1
- package/adapters/values.js.map +0 -1
- package/brand/logo.js +0 -9
- package/brand/logo.js.map +0 -1
- package/context.js.map +0 -1
- package/controls/button.js.map +0 -1
- package/controls/c1.js.map +0 -1
- package/controls/c2.js.map +0 -1
- package/controls/choice.js.map +0 -1
- package/controls/code-register.js.map +0 -1
- package/controls/code.js.map +0 -1
- package/controls/color.js.map +0 -1
- package/controls/date-register.js.map +0 -1
- package/controls/date-zone.js.map +0 -1
- package/controls/date.js.map +0 -1
- package/controls/form-picker-register.js.map +0 -1
- package/controls/form-picker.js.map +0 -1
- package/controls/icon-register.js.map +0 -1
- package/controls/icon.js.map +0 -1
- package/controls/index.js.map +0 -1
- package/controls/json-register.js.map +0 -1
- package/controls/json.js.map +0 -1
- package/controls/link.js.map +0 -1
- package/controls/location-register.js.map +0 -1
- package/controls/location.js.map +0 -1
- package/controls/media-register.js.map +0 -1
- package/controls/media.js.map +0 -1
- package/controls/number.js.map +0 -1
- package/controls/reference-register.js.map +0 -1
- package/controls/reference.js.map +0 -1
- package/controls/rich-text/blocks.d.ts +0 -28
- package/controls/rich-text/blocks.js.map +0 -1
- package/controls/rich-text/catalog.js.map +0 -1
- package/controls/rich-text/codec.js.map +0 -1
- package/controls/rich-text/component-card.js.map +0 -1
- package/controls/rich-text/control.js.map +0 -1
- package/controls/rich-text/dom.js.map +0 -1
- package/controls/rich-text/editor.js.map +0 -1
- package/controls/rich-text/floating.js.map +0 -1
- package/controls/rich-text/index.js.map +0 -1
- package/controls/rich-text/link-form.js +0 -111
- package/controls/rich-text/link-form.js.map +0 -1
- package/controls/rich-text/markdown.js.map +0 -1
- package/controls/rich-text/ops.js.map +0 -1
- package/controls/rich-text/toolbar.js.map +0 -1
- package/controls/scale.js.map +0 -1
- package/controls/slot-register.js.map +0 -1
- package/controls/slot-services.js +0 -38
- package/controls/slot-services.js.map +0 -1
- package/controls/slot.js.map +0 -1
- package/controls/table/index.js.map +0 -1
- package/controls/table/prod.js.map +0 -1
- package/controls/table/refs.js.map +0 -1
- package/controls/table/stored.js.map +0 -1
- package/controls/table/table-editor.js.map +0 -1
- package/controls/table/table-link.js.map +0 -1
- package/controls/table/table.js.map +0 -1
- package/controls/text.js.map +0 -1
- package/engine/array.js.map +0 -1
- package/engine/bits.js.map +0 -1
- package/engine/breadcrumb.js.map +0 -1
- package/engine/expand.js.map +0 -1
- package/engine/field-list.js.map +0 -1
- package/engine/field-shell.js.map +0 -1
- package/engine/frame.js.map +0 -1
- package/engine/group-summary.js.map +0 -1
- package/engine/grouping.js.map +0 -1
- package/engine/item-list.js.map +0 -1
- package/engine/kit-field.js.map +0 -1
- package/engine/schema-form.js.map +0 -1
- package/engine/slot.js.map +0 -1
- package/index.js +0 -55
- package/index.js.map +0 -1
- package/lib/cn.js.map +0 -1
- package/lib/columns.js.map +0 -1
- package/lib/frames.js.map +0 -1
- package/lib/icons.js.map +0 -1
- package/lib/path.js.map +0 -1
- package/lib/schema.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/lib/validate.js.map +0 -1
- package/schema/adapters.js.map +0 -1
- package/schema/help.js.map +0 -1
- package/schema/scale.js.map +0 -1
- package/schema/sources.js.map +0 -1
- package/schema/table.js.map +0 -1
- package/schema/types.js.map +0 -1
- package/ui/action-tray.js.map +0 -1
- package/ui/button.js.map +0 -1
- package/ui/choice-switch.js.map +0 -1
- package/ui/controls.js.map +0 -1
- package/ui/display.js.map +0 -1
- package/ui/expanded-editor-modal.js.map +0 -1
- package/ui/field-context.js.map +0 -1
- package/ui/floating-panel.js.map +0 -1
- package/ui/index.js +0 -13
- package/ui/input.js.map +0 -1
- package/ui/mode-bar.js.map +0 -1
- package/ui/overlay.js +0 -378
- package/ui/overlay.js.map +0 -1
- package/ui/path-crumbs.js.map +0 -1
- package/ui/presence.js.map +0 -1
- package/ui/select.js.map +0 -1
- package/ui/shortcut-hint.js.map +0 -1
- package/ui/surfaces.js.map +0 -1
- package/ui/tooltip-root.js.map +0 -1
- package/ui/variants.js.map +0 -1
- /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
- /package/{adapters → dist/adapters}/icons.d.ts +0 -0
- /package/{brand → dist/brand}/logo.d.ts +0 -0
- /package/{controls → dist/controls}/c1.d.ts +0 -0
- /package/{controls → dist/controls}/c2.d.ts +0 -0
- /package/{controls → dist/controls}/code-register.d.ts +0 -0
- /package/{controls → dist/controls}/code.d.ts +0 -0
- /package/{controls → dist/controls}/color.d.ts +0 -0
- /package/{controls → dist/controls}/date-register.d.ts +0 -0
- /package/{controls → dist/controls}/date-zone.d.ts +0 -0
- /package/{controls → dist/controls}/date.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker.d.ts +0 -0
- /package/{controls → dist/controls}/icon-register.d.ts +0 -0
- /package/{controls → dist/controls}/json-register.d.ts +0 -0
- /package/{controls → dist/controls}/json.d.ts +0 -0
- /package/{controls → dist/controls}/link.d.ts +0 -0
- /package/{controls → dist/controls}/location-register.d.ts +0 -0
- /package/{controls → dist/controls}/location.d.ts +0 -0
- /package/{controls → dist/controls}/media-register.d.ts +0 -0
- /package/{controls → dist/controls}/number.d.ts +0 -0
- /package/{controls → dist/controls}/reference-register.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
- /package/{controls → dist/controls}/scale.d.ts +0 -0
- /package/{controls → dist/controls}/slot-register.d.ts +0 -0
- /package/{controls → dist/controls}/slot.d.ts +0 -0
- /package/{controls → dist/controls}/table/index.d.ts +0 -0
- /package/{controls → dist/controls}/table/prod.d.ts +0 -0
- /package/{controls → dist/controls}/table/refs.d.ts +0 -0
- /package/{controls → dist/controls}/table/stored.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
- /package/{controls → dist/controls}/table/table.d.ts +0 -0
- /package/{engine → dist/engine}/array.d.ts +0 -0
- /package/{engine → dist/engine}/bits.d.ts +0 -0
- /package/{engine → dist/engine}/field-list.d.ts +0 -0
- /package/{engine → dist/engine}/field-shell.d.ts +0 -0
- /package/{engine → dist/engine}/kit-field.d.ts +0 -0
- /package/{engine → dist/engine}/slot.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/cn.d.ts +0 -0
- /package/{lib → dist/lib}/columns.d.ts +0 -0
- /package/{lib → dist/lib}/frames.d.ts +0 -0
- /package/{lib → dist/lib}/icons.d.ts +0 -0
- /package/{lib → dist/lib}/path.d.ts +0 -0
- /package/{lib → dist/lib}/utils.d.ts +0 -0
- /package/{schema → dist/schema}/adapters.d.ts +0 -0
- /package/{schema → dist/schema}/scale.d.ts +0 -0
- /package/{schema → dist/schema}/sources.d.ts +0 -0
- /package/{schema → dist/schema}/table.d.ts +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
- /package/{ui → dist/ui}/controls.d.ts +0 -0
- /package/{ui → dist/ui}/field-context.d.ts +0 -0
- /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
- /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
- /package/{ui → dist/ui}/presence.d.ts +0 -0
- /package/{ui → dist/ui}/select.d.ts +0 -0
- /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
- /package/{ui → dist/ui}/surfaces.d.ts +0 -0
- /package/{ui → dist/ui}/variants.d.ts +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
2
|
import { HintTooltip } from "./button.js";
|
|
3
|
+
import { Tooltip } from "./overlay.js";
|
|
3
4
|
import "react";
|
|
4
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import {
|
|
6
|
-
|
|
6
|
+
import { IconClock } from "@tabler/icons-react";
|
|
7
|
+
import { Avatar as Avatar$1 } from "@base-ui/react/avatar";
|
|
8
|
+
//#region src/ui/display.tsx
|
|
7
9
|
var badgeTones = {
|
|
8
10
|
neutral: "bg-kit-muted text-kit-fg-2",
|
|
9
11
|
outline: "border border-kit-line bg-kit-control-bg text-kit-fg-2",
|
|
@@ -20,7 +22,7 @@ var badgeSizes = {
|
|
|
20
22
|
lg: "h-6 px-2 text-kit-xs"
|
|
21
23
|
};
|
|
22
24
|
function badgeVariants({ tone, size } = {}) {
|
|
23
|
-
return cn("inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-kit-sm font-medium [&_svg]:size-3", badgeTones[tone ?? "neutral"], badgeSizes[size ?? "md"]);
|
|
25
|
+
return cn("inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-kit-sm font-medium transition-colors duration-150 ease-out [&_svg]:size-3", badgeTones[tone ?? "neutral"], badgeSizes[size ?? "md"]);
|
|
24
26
|
}
|
|
25
27
|
function Badge({ className, tone, size, dot, children, ...props }) {
|
|
26
28
|
return /* @__PURE__ */ jsxs("span", {
|
|
@@ -48,13 +50,15 @@ var statusMap = {
|
|
|
48
50
|
label: "Draft",
|
|
49
51
|
tone: "neutral"
|
|
50
52
|
},
|
|
53
|
+
/** D72: still Published; unpublished changes are a fact about it (StatusMark's amber dot), never a status of their own. */
|
|
51
54
|
changed: {
|
|
52
|
-
label: "
|
|
53
|
-
tone: "
|
|
55
|
+
label: "Published",
|
|
56
|
+
tone: "success"
|
|
54
57
|
},
|
|
58
|
+
/** D53: live, with changes kept as draft (left out of whole-site publishes). */
|
|
55
59
|
held: {
|
|
56
|
-
label: "
|
|
57
|
-
tone: "
|
|
60
|
+
label: "Published",
|
|
61
|
+
tone: "success"
|
|
58
62
|
},
|
|
59
63
|
scheduled: {
|
|
60
64
|
label: "Scheduled",
|
|
@@ -81,26 +85,49 @@ var statusMap = {
|
|
|
81
85
|
tone: "neutral"
|
|
82
86
|
}
|
|
83
87
|
};
|
|
84
|
-
function StatusPill({ status, label, className, size = "md" }) {
|
|
88
|
+
function StatusPill({ status, label, tone, className, size = "md" }) {
|
|
85
89
|
const s = statusMap[status];
|
|
86
90
|
return /* @__PURE__ */ jsxs(Badge, {
|
|
87
|
-
tone: s.tone,
|
|
91
|
+
tone: tone ?? s.tone,
|
|
88
92
|
size,
|
|
89
93
|
className,
|
|
90
94
|
children: [/* @__PURE__ */ jsx("span", {
|
|
91
95
|
"aria-hidden": true,
|
|
92
96
|
"data-pulse": status === "building" || status === "live" ? "" : void 0,
|
|
93
|
-
className: cn("size-1.5 rounded-full bg-current", (status === "building" || status === "live") && "animate-
|
|
97
|
+
className: cn("size-1.5 rounded-full bg-current", (status === "building" || status === "live") && "animate-kit-pulse-dot")
|
|
94
98
|
}), label ?? s.label]
|
|
95
99
|
});
|
|
96
100
|
}
|
|
101
|
+
var shortDate = (iso) => new Date(iso).toLocaleDateString("en-GB", {
|
|
102
|
+
day: "numeric",
|
|
103
|
+
month: "short"
|
|
104
|
+
});
|
|
105
|
+
function StatusMark({ status, at, className }) {
|
|
106
|
+
const label = `${status === "changed" || status === "held" ? "Published, with unpublished changes" : statusMap[status].label}${at ? ` · Edited ${shortDate(at)}` : ""}`;
|
|
107
|
+
const mark = status === "published" ? /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full bg-kit-success" }) : status === "changed" || status === "held" ? /* @__PURE__ */ jsx("span", {
|
|
108
|
+
className: "relative size-2 rounded-full bg-kit-success",
|
|
109
|
+
children: /* @__PURE__ */ jsx("span", { className: "absolute -right-1 -top-1 size-1.5 rounded-full bg-kit-warning ring-2 ring-kit-surface" })
|
|
110
|
+
}) : status === "scheduled" ? /* @__PURE__ */ jsx(IconClock, {
|
|
111
|
+
className: "size-3 text-kit-info-fg",
|
|
112
|
+
stroke: 2
|
|
113
|
+
}) : status === "review" ? /* @__PURE__ */ jsx("span", { className: "size-[7px] rotate-45 rounded-[1px] bg-kit-info" }) : status === "archived" ? /* @__PURE__ */ jsx("span", { className: "size-2 rounded-kit-xs border border-kit-fg-4" }) : /* @__PURE__ */ jsx("span", { className: "size-2 rounded-full border-[1.5px] border-kit-fg-4" });
|
|
114
|
+
return /* @__PURE__ */ jsx(Tooltip, {
|
|
115
|
+
content: label,
|
|
116
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
117
|
+
role: "img",
|
|
118
|
+
"aria-label": label,
|
|
119
|
+
className: cn("flex size-4 shrink-0 items-center justify-center", className),
|
|
120
|
+
children: mark
|
|
121
|
+
})
|
|
122
|
+
});
|
|
123
|
+
}
|
|
97
124
|
function Kbd({ className, ...props }) {
|
|
98
125
|
return /* @__PURE__ */ jsx("kbd", {
|
|
99
126
|
className: cn("inline-flex h-5 min-w-5 items-center justify-center rounded-kit-sm border border-[var(--kit-kbd-line)] bg-[var(--kit-kbd)] px-1 font-kit-sans text-kit-2xs font-medium text-kit-fg-2 shadow-[inset_0_-1px_0_var(--kit-kbd-line)]", className),
|
|
100
127
|
...props
|
|
101
128
|
});
|
|
102
129
|
}
|
|
103
|
-
var
|
|
130
|
+
var avatarPalette = [
|
|
104
131
|
"#c2410c",
|
|
105
132
|
"#be185d",
|
|
106
133
|
"#7e22ce",
|
|
@@ -111,30 +138,12 @@ var AVATAR_LIGHT = [
|
|
|
111
138
|
"#0369a1",
|
|
112
139
|
"#a21caf",
|
|
113
140
|
"#6d28d9"
|
|
114
|
-
];
|
|
115
|
-
var avatarPalette = AVATAR_LIGHT.map((hex, i) => `var(--kit-avatar-${i + 1}, ${hex})`);
|
|
116
|
-
/** One literal class per slot (Tailwind only sees whole class names); kit.css swaps the tone in dark. */
|
|
117
|
-
var AVATAR_BG = [
|
|
118
|
-
"bg-[var(--kit-avatar-1)]",
|
|
119
|
-
"bg-[var(--kit-avatar-2)]",
|
|
120
|
-
"bg-[var(--kit-avatar-3)]",
|
|
121
|
-
"bg-[var(--kit-avatar-4)]",
|
|
122
|
-
"bg-[var(--kit-avatar-5)]",
|
|
123
|
-
"bg-[var(--kit-avatar-6)]",
|
|
124
|
-
"bg-[var(--kit-avatar-7)]",
|
|
125
|
-
"bg-[var(--kit-avatar-8)]",
|
|
126
|
-
"bg-[var(--kit-avatar-9)]",
|
|
127
|
-
"bg-[var(--kit-avatar-10)]"
|
|
128
|
-
];
|
|
129
|
-
var AVATAR_ON = "text-[var(--kit-avatar-on)]";
|
|
130
|
-
function slotFor(seed) {
|
|
131
|
-
let h = 0;
|
|
132
|
-
for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) >>> 0;
|
|
133
|
-
return h % AVATAR_LIGHT.length;
|
|
134
|
-
}
|
|
141
|
+
].map((hex, i) => `var(--kit-avatar-${i + 1}, ${hex})`);
|
|
135
142
|
/** The person's avatar colour as a CSS value (the light hex is the fallback outside a kit scope). */
|
|
136
143
|
function colorFor(seed) {
|
|
137
|
-
|
|
144
|
+
let h = 0;
|
|
145
|
+
for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) >>> 0;
|
|
146
|
+
return avatarPalette[h % avatarPalette.length];
|
|
138
147
|
}
|
|
139
148
|
function initials(name) {
|
|
140
149
|
return name.split(/\s+/).map((p) => p[0]).slice(0, 2).join("").toUpperCase();
|
|
@@ -143,7 +152,7 @@ function initials(name) {
|
|
|
143
152
|
function avatarRingSpread({ ring, ringWidth = 2, ringAccent }) {
|
|
144
153
|
return ring ? ringWidth + (ringAccent ? 1 : 0) : 0;
|
|
145
154
|
}
|
|
146
|
-
function Avatar
|
|
155
|
+
function Avatar({ name, src, size = 24, className, ring, ringWidth = 2, ringAccent, square, status, decorative }) {
|
|
147
156
|
const spread = avatarRingSpread({
|
|
148
157
|
ring,
|
|
149
158
|
ringWidth,
|
|
@@ -152,22 +161,25 @@ function Avatar$1({ name, src, size = 24, className, ring, ringWidth = 2, ringAc
|
|
|
152
161
|
return /* @__PURE__ */ jsxs("span", {
|
|
153
162
|
className: "relative inline-flex shrink-0",
|
|
154
163
|
style: spread ? { padding: spread } : void 0,
|
|
155
|
-
children: [/* @__PURE__ */ jsxs(Avatar.Root, {
|
|
164
|
+
children: [/* @__PURE__ */ jsxs(Avatar$1.Root, {
|
|
156
165
|
style: {
|
|
157
166
|
width: size,
|
|
158
167
|
height: size,
|
|
159
168
|
boxShadow: ring ? `0 0 0 ${ringWidth}px ${ring}${ringAccent ? `, 0 0 0 ${ringWidth + 1}px ${ringAccent}` : ""}` : void 0
|
|
160
169
|
},
|
|
161
170
|
className: cn("inline-flex select-none items-center justify-center overflow-hidden bg-kit-muted", square ? "rounded-kit-md" : "rounded-full", className),
|
|
162
|
-
children: [src ? /* @__PURE__ */ jsx(Avatar.Image, {
|
|
171
|
+
children: [src ? /* @__PURE__ */ jsx(Avatar$1.Image, {
|
|
163
172
|
src,
|
|
164
173
|
alt: decorative ? "" : name,
|
|
165
174
|
className: "size-full object-cover"
|
|
166
|
-
}) : null, /* @__PURE__ */ jsx(Avatar.Fallback, {
|
|
175
|
+
}) : null, /* @__PURE__ */ jsx(Avatar$1.Fallback, {
|
|
167
176
|
delay: src ? 300 : void 0,
|
|
168
177
|
"aria-hidden": decorative || void 0,
|
|
169
|
-
style: {
|
|
170
|
-
|
|
178
|
+
style: {
|
|
179
|
+
background: colorFor(name),
|
|
180
|
+
fontSize: Math.max(9, Math.round(size * .4))
|
|
181
|
+
},
|
|
182
|
+
className: "flex size-full items-center justify-center font-semibold text-kit-avatar-on",
|
|
171
183
|
children: initials(name)
|
|
172
184
|
})]
|
|
173
185
|
}), status ? /* @__PURE__ */ jsx("span", {
|
|
@@ -183,7 +195,7 @@ function Avatar$1({ name, src, size = 24, className, ring, ringWidth = 2, ringAc
|
|
|
183
195
|
* AvatarStack (D34). Same-size faces, 25% overlap, a 2px box-shadow ring in the colour of the surface the stack
|
|
184
196
|
* sits on; first face on top; a +N pill names the rest on hover.
|
|
185
197
|
*/
|
|
186
|
-
function AvatarStack({ people, max = 4, size = 24, ringColor = "var(--kit-avatar-ring
|
|
198
|
+
function AvatarStack({ people, max = 4, size = 24, ringColor = "var(--kit-avatar-ring)", className, label }) {
|
|
187
199
|
const shown = people.slice(0, max);
|
|
188
200
|
const hidden = people.slice(shown.length);
|
|
189
201
|
const step = Math.round(size * .25);
|
|
@@ -208,7 +220,7 @@ function AvatarStack({ people, max = 4, size = 24, ringColor = "var(--kit-avatar
|
|
|
208
220
|
height: box
|
|
209
221
|
},
|
|
210
222
|
className: slot,
|
|
211
|
-
children: /* @__PURE__ */ jsx(Avatar
|
|
223
|
+
children: /* @__PURE__ */ jsx(Avatar, {
|
|
212
224
|
name: p.name,
|
|
213
225
|
src: p.src,
|
|
214
226
|
size,
|
|
@@ -277,12 +289,11 @@ function Separator({ vertical, className }) {
|
|
|
277
289
|
className: cn(vertical ? "h-4 w-px bg-kit-line" : "h-px w-full bg-kit-line", className)
|
|
278
290
|
});
|
|
279
291
|
}
|
|
280
|
-
/** V2 .skeleton: a --skeleton → --skeleton-shine sweep (800px wide, 1.6s linear; keyframe kit-shimmer in kit.css). */
|
|
281
|
-
var SKELETON = "bg-[linear-gradient(90deg,var(--kit-skeleton)_0,var(--kit-skeleton-shine)_40%,var(--kit-skeleton)_80%)] bg-[length:800px_100%] animate-[kit-shimmer_1.6s_linear_infinite] motion-reduce:animate-none";
|
|
292
|
+
/** V2 .skeleton: a --kit-skeleton → --kit-skeleton-shine sweep (800px wide, 1.6s linear; keyframe kit-shimmer in kit.css). */
|
|
282
293
|
function Skeleton({ className }) {
|
|
283
294
|
return /* @__PURE__ */ jsx("div", {
|
|
284
295
|
"aria-hidden": true,
|
|
285
|
-
className: cn(
|
|
296
|
+
className: cn("skeleton rounded-kit-md", className)
|
|
286
297
|
});
|
|
287
298
|
}
|
|
288
299
|
function EmptyState({ icon, title, description, actions, className, compact }) {
|
|
@@ -435,10 +446,10 @@ function Dot({ tone = "success", pulse, className }) {
|
|
|
435
446
|
const c = dotTones[tone];
|
|
436
447
|
return /* @__PURE__ */ jsxs("span", {
|
|
437
448
|
className: cn("relative inline-flex size-2 shrink-0", className),
|
|
438
|
-
children: [pulse ? /* @__PURE__ */ jsx("span", { className: cn("absolute inset-0 animate-ping rounded-full opacity-50
|
|
449
|
+
children: [pulse ? /* @__PURE__ */ jsx("span", { className: cn("absolute inset-0 animate-ping rounded-full opacity-50", c) }) : null, /* @__PURE__ */ jsx("span", { className: cn("relative inline-flex size-2 rounded-full", c) })]
|
|
439
450
|
});
|
|
440
451
|
}
|
|
441
452
|
//#endregion
|
|
442
|
-
export { Avatar
|
|
453
|
+
export { Avatar, AvatarStack, Badge, Card, CardHeader, Dot, EmptyState, Kbd, PageHeader, Separator, SettingsSection, Skeleton, Stat, StatusMark, StatusPill, Table, Td, Th, Tr, avatarRingSpread, badgeVariants, colorFor, initials, statusMap };
|
|
443
454
|
|
|
444
455
|
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","names":[],"sources":["../../src/ui/display.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Avatar as AvatarPrimitive } from \"@base-ui/react/avatar\";\nimport { cn } from \"../lib/cn\";\nimport { IconClock } from \"@tabler/icons-react\";\nimport { HintTooltip } from \"./button\";\nimport { Tooltip } from \"./overlay\";\n\n/* ── Badge ─────────────────────────────────────────────────────────────── */\nconst badgeTones = {\n neutral: \"bg-kit-muted text-kit-fg-2\",\n outline: \"border border-kit-line bg-kit-control-bg text-kit-fg-2\",\n accent: \"bg-kit-accent-soft text-kit-accent-fg\",\n success: \"bg-kit-success-soft text-kit-success-fg\",\n warning: \"bg-kit-warning-soft text-kit-warning-fg\",\n danger: \"bg-kit-danger-soft text-kit-danger-fg\",\n info: \"bg-kit-info-soft text-kit-info-fg\",\n // --chip-ink: calm in dark (#343437, = selected), not a white slab\n ink: \"bg-[var(--kit-chip-ink-bg)] text-[var(--kit-chip-ink-fg)]\",\n};\nconst badgeSizes = { sm: \"h-[18px] px-1.5 text-kit-2xs\", md: \"h-5 px-1.5 text-kit-xs\", lg: \"h-6 px-2 text-kit-xs\" };\nexport type BadgeTone = keyof typeof badgeTones;\nexport type BadgeSize = keyof typeof badgeSizes;\n\nexport function badgeVariants({ tone, size }: { tone?: BadgeTone | null; size?: BadgeSize | null } = {}) {\n return cn(\n \"inline-flex shrink-0 items-center gap-1 whitespace-nowrap rounded-kit-sm font-medium transition-colors duration-150 ease-out [&_svg]:size-3\",\n badgeTones[tone ?? \"neutral\"],\n badgeSizes[size ?? \"md\"],\n );\n}\n\nexport function Badge({\n className,\n tone,\n size,\n dot,\n children,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement> & { tone?: BadgeTone | null; size?: BadgeSize | null; dot?: boolean }) {\n return (\n <span className={cn(badgeVariants({ tone, size }), className)} {...props}>\n {dot ? <span aria-hidden className=\"size-1.5 rounded-full bg-current\" /> : null}\n {children}\n </span>\n );\n}\n\n/* ── Status pill: the single source for publish states ─────────────────── */\nexport type PublishStatus =\n | \"published\"\n | \"draft\"\n | \"changed\"\n | \"held\"\n | \"scheduled\"\n | \"review\"\n | \"archived\"\n | \"error\"\n | \"building\"\n | \"live\"\n | \"offline\";\nexport const statusMap: Record<PublishStatus, { label: string; tone: BadgeTone }> = {\n published: { label: \"Published\", tone: \"success\" },\n live: { label: \"Live\", tone: \"success\" },\n draft: { label: \"Draft\", tone: \"neutral\" },\n /** D72: still Published; unpublished changes are a fact about it (StatusMark's amber dot), never a status of their own. */\n changed: { label: \"Published\", tone: \"success\" },\n /** D53: live, with changes kept as draft (left out of whole-site publishes). */\n held: { label: \"Published\", tone: \"success\" },\n scheduled: { label: \"Scheduled\", tone: \"info\" },\n review: { label: \"In review\", tone: \"info\" },\n archived: { label: \"Archived\", tone: \"outline\" },\n error: { label: \"Failed\", tone: \"danger\" },\n building: { label: \"Building\", tone: \"info\" },\n offline: { label: \"Offline\", tone: \"neutral\" },\n};\nexport function StatusPill({\n status,\n label,\n tone,\n className,\n size = \"md\",\n}: {\n status: PublishStatus;\n label?: string;\n /** Transition prop: live-preview's pre-D72 `pageStatus.ts` keeps its \"Edited\" amber pill. Remove when it adopts D72. */\n tone?: BadgeTone;\n className?: string;\n size?: BadgeSize;\n}) {\n const s = statusMap[status];\n return (\n <Badge tone={tone ?? s.tone} size={size} className={className}>\n <span\n aria-hidden\n data-pulse={status === \"building\" || status === \"live\" ? \"\" : undefined}\n className={cn(\n \"size-1.5 rounded-full bg-current\",\n // V2 pulse-dot: opacity 1 → .45 and scale 1 → .85, 1.8s ease-in-out (keyframe kit-pulse-dot in kit.css)\n (status === \"building\" || status === \"live\") && \"animate-kit-pulse-dot\",\n )}\n />\n {label ?? s.label}\n </Badge>\n );\n}\n\n/* ── Status mark: a row's publish state as a 16px glyph (V2 nav/panes.tsx StatusMark) ── */\nexport type MarkStatus = \"published\" | \"changed\" | \"held\" | \"draft\" | \"scheduled\" | \"review\" | \"archived\";\nconst shortDate = (iso: string) => new Date(iso).toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\nexport function StatusMark({ status, at, className }: { status: MarkStatus; at?: string; className?: string }) {\n const label = `${status === \"changed\" || status === \"held\" ? \"Published, with unpublished changes\" : statusMap[status].label}${at ? ` · Edited ${shortDate(at)}` : \"\"}`;\n const mark =\n status === \"published\" ? (\n <span className=\"size-2 rounded-full bg-kit-success\" />\n ) : status === \"changed\" || status === \"held\" ? (\n // still Published; unpublished changes are a fact about it, shown as a small amber dot, never a status of their own\n <span className=\"relative size-2 rounded-full bg-kit-success\"><span className=\"absolute -right-1 -top-1 size-1.5 rounded-full bg-kit-warning ring-2 ring-kit-surface\" /></span>\n ) : status === \"scheduled\" ? (\n <IconClock className=\"size-3 text-kit-info-fg\" stroke={2} />\n ) : status === \"review\" ? (\n // §E1.9: In review wears the info tone everywhere (V2 code drew the accent)\n <span className=\"size-[7px] rotate-45 rounded-[1px] bg-kit-info\" />\n ) : status === \"archived\" ? (\n <span className=\"size-2 rounded-kit-xs border border-kit-fg-4\" />\n ) : (\n <span className=\"size-2 rounded-full border-[1.5px] border-kit-fg-4\" />\n );\n return (\n <Tooltip content={label}>\n <span role=\"img\" aria-label={label} className={cn(\"flex size-4 shrink-0 items-center justify-center\", className)}>\n {mark}\n </span>\n </Tooltip>\n );\n}\n\n/* ── Kbd ───────────────────────────────────────────────────────────────── */\nexport function Kbd({ className, ...props }: React.HTMLAttributes<HTMLElement>) {\n return (\n <kbd\n className={cn(\n \"inline-flex h-5 min-w-5 items-center justify-center rounded-kit-sm border border-[var(--kit-kbd-line)] bg-[var(--kit-kbd)] px-1 font-kit-sans text-kit-2xs font-medium text-kit-fg-2 shadow-[inset_0_-1px_0_var(--kit-kbd-line)]\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/* ── Avatar (used by TrayMeta) ─────────────────────────────────────────── */\n// --kit-avatar-1…10: deep tones with white initials in light, calm lifted tones with dark initials in dark\n// (--kit-avatar-on, ≥ 5:1 both), declared in index.css. colorFor() keeps the light hex as a fallback for a value used outside a kit scope.\nconst AVATAR_LIGHT = [\"#c2410c\", \"#be185d\", \"#7e22ce\", \"#4338ca\", \"#1d4ed8\", \"#047857\", \"#b45309\", \"#0369a1\", \"#a21caf\", \"#6d28d9\"];\nconst avatarPalette = AVATAR_LIGHT.map((hex, i) => `var(--kit-avatar-${i + 1}, ${hex})`);\n/** The person's avatar colour as a CSS value (the light hex is the fallback outside a kit scope). */\nexport function colorFor(seed: string) {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) >>> 0;\n return avatarPalette[h % avatarPalette.length];\n}\nexport function initials(name: string) {\n return name\n .split(/\\s+/)\n .map((p) => p[0])\n .slice(0, 2)\n .join(\"\")\n .toUpperCase();\n}\n/** How far an Avatar's box-shadow ring reaches past the face (0 without a ring). The Avatar pads itself by this. */\nexport function avatarRingSpread({ ring, ringWidth = 2, ringAccent }: { ring?: string; ringWidth?: number; ringAccent?: string }) {\n return ring ? ringWidth + (ringAccent ? 1 : 0) : 0;\n}\nexport function Avatar({\n name,\n src,\n size = 24,\n className,\n ring,\n ringWidth = 2,\n ringAccent,\n square,\n status,\n decorative,\n}: {\n name: string;\n /** a11y: true when the person's name is already shown as text next to the avatar */\n decorative?: boolean;\n src?: string;\n size?: number;\n className?: string;\n /** separating ring colour, drawn as box-shadow so the image keeps its full size (D34) */\n ring?: string;\n ringWidth?: number;\n /** optional 1px outer ring outside `ring` (e.g. a presence colour) */\n ringAccent?: string;\n square?: boolean;\n status?: \"online\" | \"away\" | \"offline\";\n}) {\n // The ring is a box-shadow, which paints OUTSIDE the element's box. The wrapper reserves that band with padding, so\n // the face and ring sit wholly inside the avatar's layout box and a clipping ancestor never shaves them.\n const spread = avatarRingSpread({ ring, ringWidth, ringAccent });\n return (\n <span className=\"relative inline-flex shrink-0\" style={spread ? { padding: spread } : undefined}>\n <AvatarPrimitive.Root\n style={{\n width: size,\n height: size,\n boxShadow: ring ? `0 0 0 ${ringWidth}px ${ring}${ringAccent ? `, 0 0 0 ${ringWidth + 1}px ${ringAccent}` : \"\"}` : undefined,\n }}\n className={cn(\n \"inline-flex select-none items-center justify-center overflow-hidden bg-kit-muted\",\n square ? \"rounded-kit-md\" : \"rounded-full\",\n className,\n )}\n >\n {src ? <AvatarPrimitive.Image src={src} alt={decorative ? \"\" : name} className=\"size-full object-cover\" /> : null}\n <AvatarPrimitive.Fallback\n delay={src ? 300 : undefined}\n aria-hidden={decorative || undefined}\n style={{ background: colorFor(name), fontSize: Math.max(9, Math.round(size * 0.4)) }}\n className=\"flex size-full items-center justify-center font-semibold text-kit-avatar-on\"\n >\n {initials(name)}\n </AvatarPrimitive.Fallback>\n </AvatarPrimitive.Root>\n {status ? (\n <span\n // inside the box (never -1px outside it), offset past any reserved ring band\n style={spread ? { right: spread, bottom: spread } : undefined}\n className={cn(\n \"absolute bottom-0 right-0 size-2.5 rounded-full border-2 border-kit-surface\",\n status === \"online\" ? \"bg-kit-success\" : status === \"away\" ? \"bg-kit-warning\" : \"bg-kit-fg-4\",\n )}\n />\n ) : null}\n </span>\n );\n}\n\n/**\n * AvatarStack (D34). Same-size faces, 25% overlap, a 2px box-shadow ring in the colour of the surface the stack\n * sits on; first face on top; a +N pill names the rest on hover.\n */\nexport function AvatarStack({\n people,\n max = 4,\n size = 24,\n ringColor = \"var(--kit-avatar-ring)\",\n className,\n label,\n}: {\n people: { name: string; src?: string; color?: string }[];\n max?: number;\n size?: number;\n ringColor?: string;\n className?: string;\n label?: string;\n}) {\n const shown = people.slice(0, max);\n const hidden = people.slice(shown.length);\n const step = Math.round(size * 0.25);\n const band = avatarRingSpread({ ring: ringColor });\n const box = size + band * 2;\n const vars = {\n \"--stack-ov\": `-${step + band * 2}px`,\n \"--stack-ov-open\": `-${Math.max(1, Math.round(step * 0.35)) + band * 2}px`,\n } as React.CSSProperties;\n const slot =\n \"relative inline-flex shrink-0 rounded-full transition-[margin,transform] duration-150 ease-out [&:not(:first-child)]:ml-[var(--stack-ov)] group-hover/stack:[&:not(:first-child)]:ml-[var(--stack-ov-open)] hover:!z-30 hover:-translate-y-0.5 motion-reduce:transition-none\";\n return (\n <div\n role=\"group\"\n aria-label={label ?? `${people.length} ${people.length === 1 ? \"person\" : \"people\"}: ${people.map((p) => p.name).join(\", \")}`}\n style={vars}\n className={cn(\"group/stack isolate flex shrink-0 items-center\", className)}\n >\n {shown.map((p, i) => (\n <HintTooltip key={p.name + i} content={p.name}>\n <span style={{ zIndex: shown.length - i + 1, width: box, height: box }} className={slot}>\n <Avatar name={p.name} src={p.src} size={size} ring={ringColor} decorative />\n </span>\n </HintTooltip>\n ))}\n {hidden.length ? (\n <HintTooltip content={hidden.map((p) => p.name).join(\", \")}>\n <span style={{ zIndex: 1, width: box, height: box, padding: band }} className={slot}>\n <span\n style={{ width: size, height: size, boxShadow: `0 0 0 ${band}px ${ringColor}`, fontSize: Math.max(9, Math.round(size * 0.38)) }}\n className=\"inline-flex items-center justify-center rounded-full bg-kit-muted font-medium leading-none tabular-nums text-kit-fg-2\"\n >\n +{hidden.length}\n </span>\n </span>\n </HintTooltip>\n ) : null}\n </div>\n );\n}\n\n/* ── Card ──────────────────────────────────────────────────────────────── */\nexport function Card({ className, interactive, ...props }: React.HTMLAttributes<HTMLDivElement> & { interactive?: boolean }) {\n return (\n <div\n className={cn(\n \"rounded-kit-xl border border-kit-line bg-kit-surface\",\n interactive && \"cursor-pointer transition-[border-color,box-shadow,transform] duration-150 hover:border-kit-line-strong hover:shadow-kit-md\",\n className,\n )}\n {...props}\n />\n );\n}\nexport function CardHeader({\n title,\n description,\n actions,\n icon,\n className,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n icon?: React.ReactNode;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex items-start justify-between gap-3 px-4 pt-4\", className)}>\n <div className=\"flex min-w-0 items-start gap-2.5\">\n {icon ? <span className=\"mt-0.5 flex text-kit-fg-2 [&_svg]:size-4\">{icon}</span> : null}\n <div className=\"min-w-0\">\n <h2 className=\"text-kit-base font-semibold text-kit-fg\">{title}</h2>\n {description ? <p className=\"mt-0.5 text-kit-sm text-kit-fg-2\">{description}</p> : null}\n </div>\n </div>\n {actions ? <div className=\"flex shrink-0 items-center gap-1.5\">{actions}</div> : null}\n </div>\n );\n}\n\n/* ── Separator ─────────────────────────────────────────────────────────── */\nexport function Separator({ vertical, className }: { vertical?: boolean; className?: string }) {\n return (\n <div\n role=\"separator\"\n aria-orientation={vertical ? \"vertical\" : undefined}\n className={cn(vertical ? \"h-4 w-px bg-kit-line\" : \"h-px w-full bg-kit-line\", className)}\n />\n );\n}\n\n/* ── Skeleton ──────────────────────────────────────────────────────────── */\n/** V2 .skeleton: a --kit-skeleton → --kit-skeleton-shine sweep (800px wide, 1.6s linear; keyframe kit-shimmer in kit.css). */\nexport function Skeleton({ className }: { className?: string }) {\n return <div aria-hidden className={cn(\"skeleton rounded-kit-md\", className)} />;\n}\n\n/* ── Empty state ───────────────────────────────────────────────────────── */\nexport function EmptyState({\n icon,\n title,\n description,\n actions,\n className,\n compact,\n}: {\n icon?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n className?: string;\n compact?: boolean;\n}) {\n return (\n // D15: compact = 16px icon (no tile), two lines, one action.\n <div className={cn(\"flex flex-col items-center justify-center text-center\", compact ? \"gap-2 py-8\" : \"gap-2.5 py-12\", className)}>\n {icon ? <span className=\"flex text-kit-fg-3 [&_svg]:size-4\">{icon}</span> : null}\n <div className=\"max-w-sm\">\n <h2 className=\"text-kit-base font-medium text-kit-fg\">{title}</h2>\n {description ? <p className=\"mt-0.5 text-kit-sm text-kit-fg-2\">{description}</p> : null}\n </div>\n {actions ? <div className=\"mt-1 flex flex-wrap items-center justify-center gap-2\">{actions}</div> : null}\n </div>\n );\n}\n\n/* ── Page header (inside main surface) ─────────────────────────────────── */\nexport function PageHeader({\n title,\n description,\n actions,\n meta,\n className,\n eyebrow,\n as: Heading = \"h1\",\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n meta?: React.ReactNode;\n className?: string;\n eyebrow?: React.ReactNode;\n /** Heading level: h1 in the app; demos nested in documentation pass a lower level. */\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\";\n}) {\n return (\n <div className={cn(\"flex flex-wrap items-end justify-between gap-x-6 gap-y-3\", className)}>\n <div className=\"min-w-0\">\n {eyebrow ? <div className=\"mb-1.5 text-kit-xs font-medium text-kit-fg-3\">{eyebrow}</div> : null}\n <div className=\"flex items-center gap-2.5\">\n <Heading className=\"truncate text-kit-xl font-semibold tracking-[-0.015em] text-kit-fg\">{title}</Heading>\n {meta}\n </div>\n {description ? <p className=\"mt-0.5 text-kit-sm text-kit-fg-2\">{description}</p> : null}\n </div>\n {actions ? <div className=\"flex shrink-0 flex-wrap items-center gap-2\">{actions}</div> : null}\n </div>\n );\n}\n\n/** Section header used inside settings and long pages: title INSIDE the card (founder rule). */\nexport function SettingsSection({\n title,\n description,\n children,\n footer,\n className,\n danger,\n actions,\n}: {\n title: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n danger?: boolean;\n actions?: React.ReactNode;\n}) {\n return (\n <section className={cn(\"overflow-hidden rounded-kit-xl border bg-kit-surface\", danger ? \"border-kit-danger-line\" : \"border-kit-line\", className)}>\n <div className=\"flex items-start justify-between gap-4 px-5 pt-5\">\n <div>\n <h2 className={cn(\"text-kit-base font-semibold\", danger ? \"text-kit-danger-fg\" : \"text-kit-fg\")}>{title}</h2>\n {description ? <p className=\"mt-0.5 max-w-xl text-kit-sm text-kit-fg-2\">{description}</p> : null}\n </div>\n {actions}\n </div>\n {children ? <div className=\"flex flex-col gap-4 px-5 pb-5 pt-4\">{children}</div> : <div className=\"h-5\" />}\n {footer ? (\n // --subtle-2: half a step between surface and subtle\n <div className=\"flex items-center justify-between gap-3 border-t border-kit-line bg-[var(--kit-subtle-2)] px-5 py-3 text-kit-sm text-kit-fg-2\">\n {footer}\n </div>\n ) : null}\n </section>\n );\n}\n\n/* ── Stat ──────────────────────────────────────────────────────────────── */\nexport function Stat({\n label,\n value,\n delta,\n hint,\n className,\n}: {\n label: React.ReactNode;\n value: React.ReactNode;\n delta?: { value: string; positive?: boolean };\n hint?: React.ReactNode;\n className?: string;\n}) {\n return (\n <div className={cn(\"flex flex-col gap-1\", className)}>\n <span className=\"text-kit-sm text-kit-fg-2\">{label}</span>\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-kit-xl font-semibold tabular-nums tracking-[-0.01em] text-kit-fg\">{value}</span>\n {delta ? (\n <span className={cn(\"text-kit-xs font-medium tabular-nums\", delta.positive ? \"text-kit-success-fg\" : \"text-kit-danger-fg\")}>\n {delta.positive ? \"↑\" : \"↓\"} {delta.value}\n </span>\n ) : null}\n </div>\n {hint ? <span className=\"text-kit-xs text-kit-fg-3\">{hint}</span> : null}\n </div>\n );\n}\n\n/* ── Table (simple, styled) ────────────────────────────────────────────── */\nexport function Table({ className, ...props }: React.TableHTMLAttributes<HTMLTableElement>) {\n return <table className={cn(\"w-full border-separate border-spacing-0 text-kit-sm\", className)} {...props} />;\n}\nexport function Th({ className, children, ...props }: React.ThHTMLAttributes<HTMLTableCellElement>) {\n // a11y: an icon/action column header still needs text for screen readers (empty-table-header)\n const empty = children == null || children === false || children === \"\";\n return (\n <th\n className={cn(\n \"sticky top-0 z-[1] h-10 border-b border-kit-line bg-kit-surface px-3 text-left text-kit-sm font-normal text-kit-fg-3 first:pl-4 last:pr-4\",\n className,\n )}\n {...props}\n >\n {empty ? <span className=\"sr-only\">{props[\"aria-label\"] ?? \"Actions\"}</span> : children}\n </th>\n );\n}\nexport function Td({ className, ...props }: React.TdHTMLAttributes<HTMLTableCellElement>) {\n return <td className={cn(\"h-14 border-b border-kit-line-subtle px-3 text-kit-fg first:pl-4 last:pr-4\", className)} {...props} />;\n}\nexport function Tr({ className, selected, ...props }: React.HTMLAttributes<HTMLTableRowElement> & { selected?: boolean }) {\n return (\n <tr\n data-selected={selected ? \"true\" : undefined}\n className={cn(\"group/row transition-colors hover:bg-kit-subtle data-[selected=true]:bg-kit-accent-softer\", className)}\n {...props}\n />\n );\n}\n\n/* ── Dot / live indicator ──────────────────────────────────────────────── */\nconst dotTones = {\n success: \"bg-kit-success\",\n warning: \"bg-kit-warning\",\n danger: \"bg-kit-danger\",\n neutral: \"bg-kit-fg-4\",\n accent: \"bg-kit-accent\",\n info: \"bg-kit-info\",\n};\nexport function Dot({ tone = \"success\", pulse, className }: { tone?: keyof typeof dotTones; pulse?: boolean; className?: string }) {\n const c = dotTones[tone];\n return (\n <span className={cn(\"relative inline-flex size-2 shrink-0\", className)}>\n {pulse ? <span className={cn(\"absolute inset-0 animate-ping rounded-full opacity-50\", c)} /> : null}\n <span className={cn(\"relative inline-flex size-2 rounded-full\", c)} />\n </span>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ExpandedEditorModal (CPO D49): the ONE surface for "expand this editor": rich-text fields (⤢ in the toolbar / label row)
|
|
3
3
|
* and the table editor's Full screen. A focused dialog over a dimmed app: inset 32 to 48px from the viewport, at most 1100px
|
|
4
|
-
* wide, header = breadcrumb (… › Field) + a quiet meta line (
|
|
4
|
+
* wide, header = breadcrumb (… › Field) + a quiet meta line (lines, rows) + Done. Esc closes (menus and popovers
|
|
5
5
|
* inside close first), focus is trapped and returns to whatever opened it. The body edits the SAME value as the field
|
|
6
6
|
* underneath, so both stay in sync. Inline editors stay in place; only expanded editors open here.
|
|
7
7
|
* D54: a component's properties panel opens INSIDE this modal; docked, it takes the right 340px and the reading column
|
|
@@ -13,7 +13,7 @@ export interface ExpandedEditorModalProps {
|
|
|
13
13
|
onOpenChange: (open: boolean) => void;
|
|
14
14
|
/** root → current, e.g. ["Alternating feature rows", "Thin walls…", "Body"]; the last one is the title */
|
|
15
15
|
crumbs: string[];
|
|
16
|
-
/** quiet right-side line in the header ("
|
|
16
|
+
/** quiet right-side line in the header ("12 lines", "6 rows · 4 columns") */
|
|
17
17
|
meta?: React.ReactNode;
|
|
18
18
|
/** "reading" centres a ~720px column (rich text); "wide" uses the full dialog width (tables) */
|
|
19
19
|
layout?: "reading" | "wide";
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
-
import {
|
|
2
|
+
import { KIT_SCOPE } from "./surfaces.js";
|
|
3
3
|
import { MODAL_LAYER } from "./tooltip-root.js";
|
|
4
4
|
import { Button } from "./button.js";
|
|
5
5
|
import { FLOATING_LAYER, Tooltip } from "./overlay.js";
|
|
6
6
|
import * as React from "react";
|
|
7
|
-
import { IconChevronRight } from "@tabler/icons-react";
|
|
8
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { IconChevronRight } from "@tabler/icons-react";
|
|
9
9
|
import { Dialog } from "@base-ui/react/dialog";
|
|
10
|
-
//#region src/
|
|
10
|
+
//#region src/ui/expanded-editor-modal.tsx
|
|
11
11
|
/**
|
|
12
12
|
* ExpandedEditorModal (CPO D49): the ONE surface for "expand this editor": rich-text fields (⤢ in the toolbar / label row)
|
|
13
13
|
* and the table editor's Full screen. A focused dialog over a dimmed app: inset 32 to 48px from the viewport, at most 1100px
|
|
14
|
-
* wide, header = breadcrumb (… › Field) + a quiet meta line (
|
|
14
|
+
* wide, header = breadcrumb (… › Field) + a quiet meta line (lines, rows) + Done. Esc closes (menus and popovers
|
|
15
15
|
* inside close first), focus is trapped and returns to whatever opened it. The body edits the SAME value as the field
|
|
16
16
|
* underneath, so both stay in sync. Inline editors stay in place; only expanded editors open here.
|
|
17
17
|
* D54: a component's properties panel opens INSIDE this modal; docked, it takes the right 340px and the reading column
|
|
@@ -61,7 +61,7 @@ function ExpandedEditorModal({ open, onOpenChange, crumbs, meta, layout = "readi
|
|
|
61
61
|
onOpenChange: change,
|
|
62
62
|
children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [/* @__PURE__ */ jsx(Dialog.Backdrop, {
|
|
63
63
|
...KIT_SCOPE,
|
|
64
|
-
className: "fixed inset-0 z-[70] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in"
|
|
64
|
+
className: "fixed inset-0 z-[var(--kit-z-expanded,70)] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in"
|
|
65
65
|
}), /* @__PURE__ */ jsxs(Dialog.Popup, {
|
|
66
66
|
...KIT_SCOPE,
|
|
67
67
|
[MODAL_LAYER]: "",
|
|
@@ -82,7 +82,7 @@ function ExpandedEditorModal({ open, onOpenChange, crumbs, meta, layout = "readi
|
|
|
82
82
|
if (e.key !== "Escape" && e.key !== "F6") e.stopPropagation();
|
|
83
83
|
},
|
|
84
84
|
"data-expanded-editor": "",
|
|
85
|
-
className: cn("fixed inset-4 z-[
|
|
85
|
+
className: cn("fixed inset-4 z-[calc(var(--kit-z-expanded,70)_+_1)] mx-auto flex max-w-[1100px] flex-col overflow-hidden rounded-kit-xl border border-kit-floating-line bg-kit-surface-raised text-kit-fg shadow-kit-xl outline-none sm:inset-8 lg:inset-x-12 lg:inset-y-10", "data-[floating-dock=right]:[&>[data-expanded-body]]:pr-[340px]", "data-[open]:animate-kit-pop-in"),
|
|
86
86
|
children: [/* @__PURE__ */ jsxs("header", {
|
|
87
87
|
className: "flex h-12 shrink-0 items-center gap-2 border-b border-kit-line pl-4 pr-3",
|
|
88
88
|
children: [
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expanded-editor-modal.js","names":[],"sources":["../../src/ui/expanded-editor-modal.tsx"],"sourcesContent":["/**\n * ExpandedEditorModal (CPO D49): the ONE surface for \"expand this editor\": rich-text fields (⤢ in the toolbar / label row)\n * and the table editor's Full screen. A focused dialog over a dimmed app: inset 32 to 48px from the viewport, at most 1100px\n * wide, header = breadcrumb (… › Field) + a quiet meta line (lines, rows) + Done. Esc closes (menus and popovers\n * inside close first), focus is trapped and returns to whatever opened it. The body edits the SAME value as the field\n * underneath, so both stay in sync. Inline editors stay in place; only expanded editors open here.\n * D54: a component's properties panel opens INSIDE this modal; docked, it takes the right 340px and the reading column\n * shifts left (`data-floating-dock`). Esc closes that panel before the modal.\n */\nimport * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\";\nimport { IconChevronRight } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"./button\";\nimport { FLOATING_LAYER, Tooltip } from \"./overlay\";\nimport { KIT_SCOPE } from \"./surfaces\";\nimport { MODAL_LAYER } from \"./tooltip-root\";\n\nexport interface ExpandedEditorModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** root → current, e.g. [\"Alternating feature rows\", \"Thin walls…\", \"Body\"]; the last one is the title */\n crumbs: string[];\n /** quiet right-side line in the header (\"12 lines\", \"6 rows · 4 columns\") */\n meta?: React.ReactNode;\n /** \"reading\" centres a ~720px column (rich text); \"wide\" uses the full dialog width (tables) */\n layout?: \"reading\" | \"wide\";\n /** where focus lands on open (defaults to the first editable surface) */\n initialFocus?: () => HTMLElement | null | undefined;\n /** where focus goes on close when the opener is gone or hidden (e.g. the field's own editor) */\n returnFocus?: () => HTMLElement | null | undefined;\n children: React.ReactNode;\n}\n\n/** Elements inside the editor that own Escape while open (a cell with a draft, a floating layer). Menus and listboxes\n * count only while they are OPEN popups: a list the editor always renders (tags, a static picker) never blocks Escape. */\nconst OWNS_ESCAPE = `[data-cell-editing],${FLOATING_LAYER}`;\nconst LIST = \"[role=menu],[role=listbox]\";\n\n/** An open popup: Base UI marks it data-open, Radix data-state=open; otherwise its controller says aria-expanded. */\nfunction isOpenList(el: Element) {\n if (el.matches(\"[data-open],[data-state=open]\")) return true;\n return !!el.id && !!document.querySelector(`[aria-controls~=\"${CSS.escape(el.id)}\"][aria-expanded=true]`);\n}\nconst openListIn = (root: ParentNode | null | undefined) => !!root && Array.from(root.querySelectorAll(LIST)).some(isOpenList);\n\nexport function ExpandedEditorModal({ open, onOpenChange, crumbs, meta, layout = \"reading\", initialFocus, returnFocus, children }: ExpandedEditorModalProps) {\n const title = crumbs[crumbs.length - 1] ?? \"Editor\";\n const parents = crumbs.slice(0, -1);\n const body = React.useRef<HTMLDivElement>(null);\n const opener = React.useRef<HTMLElement | null>(null);\n React.useLayoutEffect(() => {\n if (open) opener.current = document.activeElement as HTMLElement | null;\n }, [open]);\n\n const change = (next: boolean, details: DialogPrimitive.Root.ChangeEventDetails) => {\n if (!next && details.reason === \"outside-press\") {\n // the editor's own floating layers (selection toolbar, slash menu) are portalled to <body>, outside this dialog:\n // clicks there belong to the editor, so they never close the modal\n const t = details.event.target;\n if (t instanceof Element && t.closest(FLOATING_LAYER)) return details.cancel();\n }\n if (!next && details.reason === \"escape-key\") {\n const e = details.event;\n const t = e.target instanceof Element ? e.target : null;\n // an open slash menu / block picker inside the editor, or a floating menu over it, closes first\n const list = t?.closest(LIST);\n const inner = openListIn(body.current) || Array.from(document.querySelectorAll(FLOATING_LAYER)).some(openListIn);\n if (e.defaultPrevented || t?.closest(OWNS_ESCAPE) || (list && isOpenList(list)) || inner) return details.cancel();\n // then a component's properties panel open in here (D54): it closes, the modal stays\n const panel = body.current?.parentElement?.querySelector(\"[data-floating-panel]\");\n if (panel) {\n details.cancel();\n (e as KeyboardEvent & { bcmsPanelHandled?: boolean }).bcmsPanelHandled = true;\n panel.dispatchEvent(new CustomEvent(\"floatingpanel:escape\"));\n return;\n }\n }\n onOpenChange(next);\n };\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={change}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop\n {...KIT_SCOPE}\n className=\"fixed inset-0 z-[var(--kit-z-expanded,70)] bg-kit-overlay backdrop-blur-[2px] data-[open]:animate-kit-fade-in\"\n />\n <DialogPrimitive.Popup\n {...KIT_SCOPE}\n {...{ [MODAL_LAYER]: \"\" }}\n aria-describedby={undefined}\n initialFocus={() => {\n // focus lands INSIDE at once (so the trap has a home), then moves to the editor once it has mounted.\n // Base UI focuses the returned element in a frame of its own, so the editor waits one frame longer.\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const el = initialFocus?.() ?? body.current?.querySelector<HTMLElement>(\"[contenteditable=true], [data-cell], input, textarea\");\n el?.focus({ preventScroll: true });\n }),\n );\n return body.current;\n }}\n finalFocus={() => {\n // back to whatever opened it, or, when that is gone or hidden, to the host's fallback (the field itself)\n const o = opener.current;\n const target = o && o.isConnected && o !== document.body && o.getClientRects().length ? o : (returnFocus?.() ?? o);\n requestAnimationFrame(() => target?.focus({ preventScroll: true }));\n return false;\n }}\n // keys typed in the editor never reach the app behind it (canvas shortcuts, form Esc); F6 still moves to a panel\n onKeyDown={(e) => {\n if (e.key !== \"Escape\" && e.key !== \"F6\") e.stopPropagation();\n }}\n data-expanded-editor=\"\"\n className={cn(\n \"fixed inset-4 z-[calc(var(--kit-z-expanded,70)_+_1)] mx-auto flex max-w-[1100px] flex-col overflow-hidden rounded-kit-xl border border-kit-floating-line bg-kit-surface-raised text-kit-fg shadow-kit-xl outline-none sm:inset-8 lg:inset-x-12 lg:inset-y-10\",\n \"data-[floating-dock=right]:[&>[data-expanded-body]]:pr-[340px]\",\n \"data-[open]:animate-kit-pop-in\",\n )}\n >\n <header className=\"flex h-12 shrink-0 items-center gap-2 border-b border-kit-line pl-4 pr-3\">\n <nav aria-label=\"Field path\" className=\"flex min-w-0 flex-1 items-center gap-1 text-kit-sm\">\n {parents.map((c, i) => (\n <React.Fragment key={`${c}-${i}`}>\n <Tooltip content={c} side=\"bottom\">\n <span className=\"max-w-[220px] truncate text-kit-fg-3\">{c}</span>\n </Tooltip>\n <IconChevronRight className=\"size-3 shrink-0 text-kit-fg-4\" stroke={1.5} aria-hidden />\n </React.Fragment>\n ))}\n {/* the field title names the dialog (\"Body\"), not the nav's \"Field path\" */}\n <DialogPrimitive.Title render={<span aria-current=\"location\" />} className=\"min-w-0 truncate font-medium text-kit-fg\">\n {title}\n </DialogPrimitive.Title>\n </nav>\n {meta ? <span className=\"hidden shrink-0 text-kit-xs tabular-nums text-kit-fg-3 sm:inline\">{meta}</span> : null}\n <DialogPrimitive.Close render={<Button size=\"sm\" variant=\"primary\" />}>Done</DialogPrimitive.Close>\n </header>\n <div ref={body} tabIndex={-1} data-expanded-body=\"\" className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain outline-none\">\n {layout === \"reading\" ? (\n <div className=\"mx-auto w-full max-w-[720px] px-6 py-8 sm:px-10\">{children}</div>\n ) : (\n <div className=\"flex h-full min-h-0 flex-col p-4\">{children}</div>\n )}\n </div>\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-context.js","names":[],"sources":["../../src/ui/field-context.ts"],"sourcesContent":["import * as React from \"react\";\n\n/* The Field wrapper (input.tsx) publishes its label wiring here, so controls in other files (Switch, Select) can read it\n without importing input.tsx. V2 keeps these contexts inside ui/input.tsx; input.tsx should import them from this file. */\n\nexport const FieldIdContext = React.createContext<string | undefined>(undefined);\nexport function useFieldId() {\n return React.useContext(FieldIdContext);\n}\n\nexport const FieldLabelledByContext = React.createContext<string | undefined>(undefined);\nexport function useFieldLabelledBy() {\n return React.useContext(FieldLabelledByContext);\n}\n\nexport const FieldDescribedByContext = React.createContext<string | undefined>(undefined);\nexport function useFieldDescribedBy() {\n return React.useContext(FieldDescribedByContext);\n}\n\n/* `<label for>` without a <label> element. V2 draws no label on an inline-list row, so the row publishes its sr-only\n name here and the kit control whose id is `htmlFor` (Input, Textarea, Select, Switch, Checkbox) points its\n aria-labelledby at `labelId`, unless the control carries its own aria-label / aria-labelledby. */\nexport const FieldLabelForContext = React.createContext<{ htmlFor: string; labelId: string } | undefined>(undefined);\nexport function useLabelFor(id: string | undefined) {\n const ctx = React.useContext(FieldLabelForContext);\n return ctx && id && ctx.htmlFor === id ? ctx.labelId : undefined;\n}\n"],"mappings":";;AAKA,IAAa,iBAAiB,MAAM,cAAkC,KAAA,CAAS;AAC/E,SAAgB,aAAa;CAC3B,OAAO,MAAM,WAAW,cAAc;AACxC;AAEA,IAAa,yBAAyB,MAAM,cAAkC,KAAA,CAAS;AACvF,SAAgB,qBAAqB;CACnC,OAAO,MAAM,WAAW,sBAAsB;AAChD;AAEA,IAAa,0BAA0B,MAAM,cAAkC,KAAA,CAAS;AACxF,SAAgB,sBAAsB;CACpC,OAAO,MAAM,WAAW,uBAAuB;AACjD;AAKA,IAAa,uBAAuB,MAAM,cAAgE,KAAA,CAAS;AACnH,SAAgB,YAAY,IAAwB;CAClD,MAAM,MAAM,MAAM,WAAW,oBAAoB;CACjD,OAAO,OAAO,MAAM,IAAI,YAAY,KAAK,IAAI,UAAU,KAAA;AACzD"}
|
|
@@ -24,7 +24,7 @@ import { type MotionValue } from "framer-motion";
|
|
|
24
24
|
export declare const NAV = 56;
|
|
25
25
|
export declare const SNAP = 16;
|
|
26
26
|
export declare const EDGE = 16;
|
|
27
|
-
export declare const Z_FLOAT = "z-[52]";
|
|
27
|
+
export declare const Z_FLOAT = "z-[var(--kit-z-float,52)]";
|
|
28
28
|
export declare const EASE: readonly [0.32, 0.72, 0, 1];
|
|
29
29
|
export type Rect = {
|
|
30
30
|
x: number;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
-
import {
|
|
2
|
+
import { KIT_SCOPE } from "./surfaces.js";
|
|
3
|
+
import { eventKey } from "../lib/key-event.js";
|
|
3
4
|
import * as React from "react";
|
|
4
5
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
6
|
import { motion, useMotionValue, useReducedMotion } from "framer-motion";
|
|
6
7
|
import { createPortal } from "react-dom";
|
|
7
|
-
//#region src/
|
|
8
|
+
//#region src/ui/floating-panel.tsx
|
|
8
9
|
/**
|
|
9
10
|
* FloatingPanel (CPO D54): ONE primitive for every non-modal window over the work surface. It owns drag, magnetic snap,
|
|
10
11
|
* resize and "remember where I put it"; the ⌘J assistant (D30) and the component properties panel both use it.
|
|
@@ -26,9 +27,10 @@ import { createPortal } from "react-dom";
|
|
|
26
27
|
* pickers and field drafts first), F6 moves focus between the panel and `focusBack()`. Marked `data-floating-layer`.
|
|
27
28
|
* Layering: canvas toolbars < panel 52 (= the D30 window) < sheets 55 < dialogs 60 < menus 80 < tooltips 90.
|
|
28
29
|
*/
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var
|
|
30
|
+
var NAV = 56;
|
|
31
|
+
var SNAP = 16;
|
|
32
|
+
var EDGE = 16;
|
|
33
|
+
var Z_FLOAT = "z-[var(--kit-z-float,52)]";
|
|
32
34
|
var EASE = [
|
|
33
35
|
.32,
|
|
34
36
|
.72,
|
|
@@ -42,6 +44,16 @@ var NO_GUIDES = {
|
|
|
42
44
|
var vw = () => window.innerWidth;
|
|
43
45
|
var vh = () => window.innerHeight;
|
|
44
46
|
var clampN = (n, lo, hi) => Math.max(lo, Math.min(hi, n));
|
|
47
|
+
function fitRect(g, b) {
|
|
48
|
+
const w = clampN(g.w, b.minW, Math.max(b.minW, b.maxW()));
|
|
49
|
+
const h = clampN(g.h, b.minH, Math.max(b.minH, b.maxH()));
|
|
50
|
+
return {
|
|
51
|
+
w,
|
|
52
|
+
h,
|
|
53
|
+
x: clampN(g.x, b.pad, Math.max(b.pad, vw() - w - b.pad)),
|
|
54
|
+
y: clampN(g.y, b.top, Math.max(b.top, vh() - h - b.pad))
|
|
55
|
+
};
|
|
56
|
+
}
|
|
45
57
|
/** Clamp to the viewport, then pull any edge within SNAP px of a line onto it (the nearest wins). */
|
|
46
58
|
function snapRect(x, y, w, h, lines, b) {
|
|
47
59
|
let nx = clampN(x, b.pad, Math.max(b.pad, vw() - w - b.pad));
|
|
@@ -332,9 +344,12 @@ var SIDE_PANELS = "[data-doc-settings], [data-side-panel]";
|
|
|
332
344
|
/** A menu, picker, popover or another dialog is open: it takes Esc first. */
|
|
333
345
|
/** An open Base UI popup (popover, menu, select, combobox): it carries data-open and data-side. Kit tooltips don't count. */
|
|
334
346
|
var POPUP_OPEN = "[data-open][data-side]:not([data-kit-tooltip])";
|
|
347
|
+
/** A tooltip (the kit's, or the host's `data-slot="tooltip-content"`), its positioner or arrow: a hint left open never takes Esc. */
|
|
348
|
+
var TOOLTIP = "[data-kit-tooltip], [data-slot=tooltip-content]";
|
|
349
|
+
var isTooltip = (n) => !!n.closest(TOOLTIP) || !!n.querySelector(TOOLTIP);
|
|
335
350
|
var OWNS_ESCAPE = `[role=menu],[role=listbox],[data-cell-editing],${POPUP_OPEN}`;
|
|
336
351
|
function layerOpen(self) {
|
|
337
|
-
if (document.querySelector(
|
|
352
|
+
if (document.querySelector("[data-cell-editing]") || Array.from(document.querySelectorAll(POPUP_OPEN)).some((n) => !isTooltip(n))) return true;
|
|
338
353
|
const floating = (n) => n.getAttribute("role") === "menu" || !!n.closest("[data-floating-layer]:not([data-floating-panel])");
|
|
339
354
|
if (Array.from(document.querySelectorAll("[role=menu], [role=listbox]")).some((n) => n.getClientRects().length && floating(n))) return true;
|
|
340
355
|
return Array.from(document.querySelectorAll("[role=dialog]:is([data-open],[data-state=open])")).some((d) => d !== self && !d.hasAttribute("data-expanded-editor") && !d.hasAttribute("data-floating-panel") && d.id !== "assistant-panel" && !d.hasAttribute("data-doc-panel"));
|
|
@@ -357,6 +372,7 @@ var FENCE = {
|
|
|
357
372
|
onKeyUp: stop,
|
|
358
373
|
onContextMenu: stop
|
|
359
374
|
};
|
|
375
|
+
var PANEL_W = 340;
|
|
360
376
|
var PANEL_MAX_AUTO_H = 560;
|
|
361
377
|
var TOP_LIMIT = 72;
|
|
362
378
|
var BOTTOM_GAP = 16;
|
|
@@ -670,7 +686,7 @@ var FloatingPanel = React.forwardRef(function FloatingPanel({ id, labelledBy, an
|
|
|
670
686
|
return () => el.removeEventListener("keydown", on);
|
|
671
687
|
}, [mode]);
|
|
672
688
|
const onKeyDown = (e) => {
|
|
673
|
-
if (!(e.metaKey || e.ctrlKey) || e
|
|
689
|
+
if (!(e.metaKey || e.ctrlKey) || eventKey(e) === "z") e.stopPropagation();
|
|
674
690
|
};
|
|
675
691
|
const onHeaderDown = (e) => {
|
|
676
692
|
if (mode !== "float" || e.button !== 0 || e.target.closest("button, a, input, textarea, [role=menuitem], [contenteditable]")) return;
|
|
@@ -751,7 +767,7 @@ var FloatingPanel = React.forwardRef(function FloatingPanel({ id, labelledBy, an
|
|
|
751
767
|
ease: EASE
|
|
752
768
|
},
|
|
753
769
|
style: { height: `${sheetH}dvh` },
|
|
754
|
-
className:
|
|
770
|
+
className: "fixed inset-x-0 bottom-0 z-[var(--kit-z-sheet,55)] flex flex-col overflow-hidden rounded-t-kit-xl border-t border-kit-line bg-kit-surface-raised pb-[env(safe-area-inset-bottom)] shadow-kit-sheet-b outline-none",
|
|
755
771
|
children: [
|
|
756
772
|
/* @__PURE__ */ jsx(SheetGrabber, {
|
|
757
773
|
height: sheetH,
|
|
@@ -779,7 +795,7 @@ var FloatingPanel = React.forwardRef(function FloatingPanel({ id, labelledBy, an
|
|
|
779
795
|
width: 340,
|
|
780
796
|
top: 56
|
|
781
797
|
},
|
|
782
|
-
className:
|
|
798
|
+
className: "fixed bottom-0 right-0 z-[var(--kit-z-sheet,55)] flex flex-col border-l border-kit-line bg-kit-surface-raised shadow-kit-sheet-r outline-none",
|
|
783
799
|
children: [
|
|
784
800
|
headerEl,
|
|
785
801
|
body,
|
|
@@ -807,7 +823,7 @@ var FloatingPanel = React.forwardRef(function FloatingPanel({ id, labelledBy, an
|
|
|
807
823
|
bottom: 0,
|
|
808
824
|
height: "55%"
|
|
809
825
|
},
|
|
810
|
-
className: cn("absolute z-[20] flex flex-col overflow-hidden
|
|
826
|
+
className: cn("absolute z-[20] flex flex-col overflow-hidden bg-kit-surface-raised outline-none", modalFit === "dock" ? "border-l border-kit-line" : modalFit === "overlay" ? "rounded-kit-xl border border-kit-floating-line shadow-kit-lg" : "rounded-t-kit-xl border-t border-kit-line shadow-kit-sheet-b"),
|
|
811
827
|
children: [
|
|
812
828
|
headerEl,
|
|
813
829
|
body,
|
|
@@ -834,7 +850,7 @@ var FloatingPanel = React.forwardRef(function FloatingPanel({ id, labelledBy, an
|
|
|
834
850
|
scale: 1
|
|
835
851
|
},
|
|
836
852
|
transition: fade,
|
|
837
|
-
className: cn("fixed flex flex-col overflow-hidden rounded-kit-xl border
|
|
853
|
+
className: cn("fixed flex flex-col overflow-hidden rounded-kit-xl border bg-kit-surface-raised shadow-kit-xl outline-none", kbd ? "border-dashed border-[var(--kit-emphasis-line)]" : "border-kit-floating-line", Z_FLOAT),
|
|
838
854
|
children: [
|
|
839
855
|
/* @__PURE__ */ jsx(ResizeEdges, {
|
|
840
856
|
geom,
|
|
@@ -907,6 +923,6 @@ function SheetGrabber({ height, onHeight, onClose }) {
|
|
|
907
923
|
});
|
|
908
924
|
}
|
|
909
925
|
//#endregion
|
|
910
|
-
export { FloatingPanel };
|
|
926
|
+
export { EASE, EDGE, FloatingPanel, NAV, NO_GUIDES, PANEL_W, ResizeEdges, ResizeGrip, SNAP, SnapGuides, Z_FLOAT, clampN, fitRect, snapRect, track, useFloatingPanelPrefs, usePanelMode, vh, vw };
|
|
911
927
|
|
|
912
928
|
//# sourceMappingURL=floating-panel.js.map
|