@bettercms-ai/kit 1.0.0 → 2.0.0-next.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/dist/controls/form-picker-register.d.ts +7 -0
- package/{controls → dist/controls}/form-picker-register.js +2 -6
- 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/dist/controls/slot-register.d.ts +6 -0
- package/{controls → dist/controls}/slot-register.js +2 -5
- 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 +58 -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 +81 -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.d.ts +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.d.ts +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.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.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
package/engine/grouping.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.js","names":[],"sources":["../../src/kit/engine/grouping.tsx"],"sourcesContent":["/**\n * GROUPING (CPO D45; V2 HEAD 9829bf1 kit/engine/grouping.tsx + the layout half of kit/engine/field-list.tsx) — the four\n * ways the Block Kit puts fields together, and the rules for nesting them.\n *\n * Group tabs Content · Media · Design · Settings top of a frame only (FieldList)\n * <FieldSection> ────────────────────────────────── a titled set of siblings: hairline above, 36px header,\n * Spacing Top 56 · Bottom 88 › no box, no left rule; collapsed = one-line summary\n * <FieldInset> Rating line a small object (≤3 simple fields): its label, then the\n * │ Stars [ 4.9 / 5 ] children behind ONE 1px --line inset line (D63). No tint,\n * │ Text [ 4.9 from 2,400+ reviews ] no box, no radius: never a box inside a line.\n * <FieldUnit> ┌ Shop cookware Primary › ┐ ONE compound control (button = label + link, image + alt)\n * └ /products ┘\n * Drill row [▣] Desktop › anything bigger, or anything one level deeper\n *\n * Nesting: section (level 1, spacing only) → inset (level 2, the inset line) → level 3+ always drills. Never two\n * containers in one level. Rhythm: field gap 16 · group gap 24, the same gap inside an inset; dense (form width ≤ 360px)\n * 12 · 20; document 20 · 32.\n * Columns (D63, `columnSpans`): side by side only for genuinely short fields (number, switch, select, date, colour, icon,\n * rating, text with max ≤ 24) AND only when the form is at least 420px wide (a container query). Everything else is full\n * width, so a text value never wraps in a cramped column.\n * `<BreakpointGroup>`: per-screen-size objects (desktop / tablet / phone) as ONE group with a segmented switcher.\n *\n * Port notes (kit vs V2): V2 token utilities carry the kit- prefix (text-fg-3 → text-kit-fg-3, bg-well →\n * bg-kit-well, border-field → border-kit-field-border); `motion/react` is `framer-motion`; V2's `scrollbar-none` and\n * `tabular` utilities are written out. V2's FieldList imports KitField directly; here it takes `renderField` so the\n * engine has no grouping ↔ kit-field import cycle.\n */\nimport * as React from \"react\";\nimport { IconChevronDown, IconChevronRight, IconDeviceDesktop, IconDeviceLaptop, IconDeviceMobile, IconDeviceTablet, IconMessage } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport { Segmented } from \"../ui/controls\";\nimport { Menu, MenuContent, MenuItem, MenuTrigger, Tooltip } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldGroup, FieldPath, FieldSchema, Fieldset } from \"../schema/types\";\nimport { useForm, useKitEnv, type KitPeer } from \"../context\";\nimport { isObj, keyStartsWith, pathKey } from \"../lib/path\";\nimport { isEmptyValue, isHidden } from \"../lib/schema\";\nimport { IssueDot } from \"./bits\";\nimport { PeerStack } from \"./field-shell\";\nimport { groupSummary } from \"./group-summary\";\nimport { KitIcon } from \"../lib/icons\";\nimport { columnSpans } from \"../lib/columns\";\nexport { columnSpans, isColumnField, SHORT_TEXT_MAX } from \"../lib/columns\";\n\nexport { groupSummary };\n\n\n/* ── Rhythm ─────────────────────────────────────────────────────────── */\n/** Gaps per host. `stack` = between sibling fields; `group` = before a section / after one; `gridY` = rows of a column grid.\n * An inset uses the same field gap as everything else (D63: one rhythm). */\nexport const RHYTHM = {\n panel: { tabs: \"pb-4 @max-[360px]:pb-3\", stack: \"gap-4 @max-[360px]:gap-3\", field: \"pt-4 @max-[360px]:pt-3\", group: \"pt-6 @max-[360px]:pt-5\", gridY: \"gap-y-4 @max-[360px]:gap-y-3\" },\n document: { tabs: \"pb-5\", stack: \"gap-5\", field: \"pt-5\", group: \"pt-8\", gridY: \"gap-y-5\" },\n} as const;\nexport const useRhythm = () => RHYTHM[useKitEnv().variant];\n\n/* ── Depth: how many visual containers the current field sits in ────── */\nconst InsetDepth = React.createContext(0);\n/** 0 at a frame's top level and inside sections; 1 inside an inset (or an expanded array row). */\nexport const useInsetDepth = () => React.useContext(InsetDepth);\n/** Mark children as sitting inside one container (array inline rows use this so objects inside them drill). */\nexport function InsetScope({ children }: { children: React.ReactNode }) {\n const d = React.useContext(InsetDepth);\n return <InsetDepth.Provider value={d + 1}>{children}</InsetDepth.Provider>;\n}\n\n/* ── Status of everything under a set of paths (errors, warnings, peers, comments) ── */\nexport function useGroupStatus(paths: FieldPath[]) {\n const form = useForm();\n const env = useKitEnv();\n let errors = 0;\n let warnings = 0;\n const peers: KitPeer[] = [];\n let comments = 0;\n const keys = paths.map(pathKey);\n for (const p of paths) {\n const r = form?.rollup(p) ?? { errors: 0, warnings: 0 };\n errors += r.errors;\n warnings += r.warnings;\n }\n for (const [k, list] of Object.entries(env.presence)) if (keys.some((g) => keyStartsWith(k, g))) for (const p of list) if (!peers.some((x) => x.name === p.name)) peers.push(p);\n for (const [k, n] of Object.entries(env.comments)) if (keys.some((g) => keyStartsWith(k, g))) comments += n;\n return { errors, warnings, peers, comments };\n}\nexport type GroupStatus = ReturnType<typeof useGroupStatus>;\n\n/** A field that animates its height in and out when a condition shows or hides it (D45). `space` = its top spacing. */\nexport const Appear = React.forwardRef<HTMLDivElement, { children: React.ReactNode; space?: string; className?: string }>(({ children, space, className }, ref) => {\n const reduce = useReducedMotion();\n const t = { duration: reduce ? 0 : 0.2, ease: [0.22, 1, 0.36, 1] as const };\n const el = React.useRef<HTMLDivElement | null>(null);\n /* clip only while the height moves: at rest focus rings, popovers and the section edge must not be cut off */\n const clip = (on: boolean) => {\n if (el.current) el.current.style.overflow = on ? \"hidden\" : \"\";\n };\n return (\n <motion.div\n ref={(n) => {\n el.current = n;\n if (typeof ref === \"function\") ref(n);\n else if (ref) ref.current = n;\n }}\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={t}\n onAnimationStart={() => clip(true)}\n onAnimationComplete={() => clip(false)}\n className={cn(\"min-w-0\", className)}\n >\n <div className={space}>{children}</div>\n </motion.div>\n );\n});\nAppear.displayName = \"Appear\";\n\n/** Sibling fields that appear / disappear smoothly. `gapless`: the parent draws the gaps (grid, inset). */\nexport function AnimatedFields({ fields, render, gapless, space }: { fields: FieldSchema[]; render: (f: FieldSchema) => React.ReactNode; gapless?: boolean; space?: string }) {\n const rhythm = useRhythm();\n return (\n <AnimatePresence initial={false}>\n {fields.map((f, i) => (\n <Appear key={f.name} space={gapless || i === 0 ? undefined : space ?? rhythm.field}>\n {render(f)}\n </Appear>\n ))}\n </AnimatePresence>\n );\n}\n\n/* ── Header status: issue count, peers, comments (shown while collapsed) ── */\nfunction GroupBadges({ status }: { status: GroupStatus }) {\n const { errors, warnings, peers, comments } = status;\n return (\n <>\n {errors ? (\n <Tooltip content={`${errors} ${errors === 1 ? \"issue\" : \"issues\"} to fix inside`}>\n <span role=\"img\" aria-label={`${errors} ${errors === 1 ? \"issue\" : \"issues\"} to fix`} className=\"inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full bg-kit-danger-soft px-1 text-kit-2xs font-medium tabular-nums text-kit-danger-fg\">\n {errors}\n </span>\n </Tooltip>\n ) : warnings ? (\n <IssueDot errors={0} warnings={warnings} />\n ) : null}\n {comments ? (\n <Tooltip content={`${comments} open ${comments === 1 ? \"comment\" : \"comments\"} inside`}>\n <span role=\"img\" aria-label={`${comments} open ${comments === 1 ? \"comment\" : \"comments\"}`} className=\"inline-flex h-4 shrink-0 items-center gap-0.5 rounded-kit-md px-0.5 text-kit-2xs tabular-nums text-kit-fg-3\">\n <IconMessage className=\"size-3\" stroke={1.75} aria-hidden />\n {comments}\n </span>\n </Tooltip>\n ) : null}\n {peers.length ? <PeerStack peers={peers} size={16} /> : null}\n </>\n );\n}\n\n/* ── Columns (D63): one rule for every host ───────────────────────────── */\n/**\n * Sibling fields, laid out by the D63 rule: a plain animated stack, or (when `columns` and at least one pair of short\n * neighbours) a grid that turns two-up only when the form is ≥ 420px wide. Used by sections, insets and array rows.\n */\nexport function FieldRun({ fields, render, columns = true }: { fields: FieldSchema[]; render: (f: FieldSchema) => React.ReactNode; columns?: boolean }) {\n const rhythm = useRhythm();\n const spans = columns ? columnSpans(fields) : fields.map(() => false);\n if (!spans.some(Boolean))\n return (\n <div className=\"flex min-w-0 flex-col\">\n <AnimatedFields fields={fields} render={render} />\n </div>\n );\n return (\n <div data-slot=\"field-columns\" className={cn(\"grid min-w-0 grid-cols-1 gap-x-3 @[420px]:grid-cols-2\", rhythm.gridY)}>\n {fields.map((f, i) => (\n <div key={f.name} className={cn(\"min-w-0\", !spans[i] && \"@[420px]:col-span-2\")}>{render(f)}</div>\n ))}\n </div>\n );\n}\n\n/* ── <FieldSection>: a titled set of sibling fields ─────────────────── */\nexport interface FieldSectionProps {\n title: string;\n description?: string;\n /** collapsible header (default true). false = a static heading. */\n collapsible?: boolean;\n defaultOpen?: boolean;\n /** controlled */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** one-line summary shown while collapsed (\"Top 56 · Bottom 88\") */\n summary?: string;\n /** roll-up shown on the header while collapsed */\n status?: Partial<GroupStatus>;\n /** hairline above (off for the first item of a frame) */\n divider?: boolean;\n /** open the section when this turns true (e.g. a publish attempt found errors inside) */\n revealWhen?: boolean;\n disabled?: boolean;\n /** extra header control, outside the toggle (rare) */\n actions?: React.ReactNode;\n /** content above the fields, inside the body (e.g. a breakpoint switcher) */\n lead?: React.ReactNode;\n columns?: 1 | 2;\n /** leading glyph before the title (dense panels: the Design tab's section icons) */\n icon?: React.ReactNode;\n /** small mark right after the title, inside the toggle (e.g. a \"changed\" dot) */\n adornment?: React.ReactNode;\n className?: string;\n /** override the body's gap (dense rows) */\n bodyClassName?: string;\n children: React.ReactNode;\n}\n\nexport function FieldSection({\n title, description, collapsible = true, defaultOpen = true, open: openProp, onOpenChange, summary, status, divider = true, revealWhen,\n disabled, actions, lead, columns, icon, adornment, className, bodyClassName, children,\n}: FieldSectionProps) {\n const rhythm = useRhythm();\n const { variant } = useKitEnv();\n const id = React.useId();\n const [inner, setInner] = React.useState(defaultOpen);\n const open = !collapsible || (openProp ?? inner);\n const setOpen = (o: boolean) => {\n if (openProp === undefined) setInner(o);\n onOpenChange?.(o);\n };\n React.useEffect(() => {\n if (revealWhen && !open) setOpen(true);\n }, [revealWhen]); // eslint-disable-line react-hooks/exhaustive-deps\n const st: GroupStatus = { errors: 0, warnings: 0, peers: [], comments: 0, ...status };\n const titleCls = cn(\"shrink-0 font-semibold text-kit-fg\", variant === \"document\" ? \"text-kit-base\" : \"text-kit-sm\", disabled && \"text-kit-fg-4\");\n const body = (\n <div id={`${id}-body`} className={cn(\"flex flex-col pb-2 pt-1\", rhythm.stack, bodyClassName)}>\n {description ? <p className=\"-mt-1 text-kit-xs leading-4 text-kit-fg-3\">{description}</p> : null}\n {lead}\n {columns === 2 ? <div className={cn(\"grid grid-cols-1 gap-x-3 @[420px]:grid-cols-2\", rhythm.gridY)}>{children}</div> : children}\n </div>\n );\n return (\n <section\n role=\"group\"\n aria-labelledby={`${id}-title`}\n data-group=\"section\"\n data-state={open ? \"open\" : \"closed\"}\n className={cn(\n \"group/section relative\",\n divider && \"border-t border-kit-line pt-1\",\n /* \"which group am I in\": a quiet edge in the gutter while focus is inside an open section (no rule at rest). D52: the\n same 1px line token as every other inset line (row groups, nested lists), never a darker 2px bar. */\n \"before:pointer-events-none before:absolute before:-left-2.5 before:bottom-2 before:top-11 before:w-px before:bg-transparent before:transition-colors before:duration-200 data-[state=open]:focus-within:before:bg-kit-line\",\n /* D63: inside an inset the inset's own line already says where you are; never two parallel lines */\n \"[&:has([data-group=inset]:focus-within)]:before:!bg-transparent\",\n className,\n )}\n >\n <div className=\"flex min-h-9 items-center gap-2\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => !disabled && setOpen(!open)}\n aria-expanded={open}\n aria-controls={open ? `${id}-body` : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"group/sh -mx-2 flex h-9 min-w-0 flex-1 items-center gap-2 rounded-kit-md px-2 text-left transition-colors\",\n disabled ? \"cursor-not-allowed\" : \"hover:bg-kit-hover\",\n )}\n >\n {icon ? <span aria-hidden className=\"flex shrink-0 text-kit-fg-3 [&_svg]:size-3.5\">{icon}</span> : null}\n <span id={`${id}-title`} className={titleCls}>{title}</span>\n {adornment}\n {!open && summary ? <span className=\"min-w-0 flex-1 truncate text-right text-kit-xs text-kit-fg-3\">{summary}</span> : <span className=\"flex-1\" />}\n {!open ? <GroupBadges status={st} /> : null}\n <IconChevronRight aria-hidden stroke={1.5} className={cn(\"size-4 shrink-0 text-kit-fg-3 transition-transform duration-200 group-hover/sh:text-kit-fg-2\", open && \"rotate-90\")} />\n </button>\n ) : (\n <h3 id={`${id}-title`} className={cn(titleCls, \"flex-1\")}>{title}</h3>\n )}\n {actions}\n </div>\n {collapsible ? <SectionBody open={open}>{body}</SectionBody> : body}\n </section>\n );\n}\n\n/**\n * The open / close motion of a section (D52: no jitter). Height only, 200ms, the same curve as conditional fields. The\n * body is clipped ONLY while the height moves, so focus rings, the gutter edge and popovers are never cut at rest and\n * nothing snaps when the clip comes off; no opacity flash on the content; instant with reduced motion.\n */\nfunction SectionBody({ open, children }: { open: boolean; children: React.ReactNode }) {\n const reduce = useReducedMotion();\n const el = React.useRef<HTMLDivElement | null>(null);\n const clip = (on: boolean) => {\n if (el.current) el.current.style.overflow = on ? \"hidden\" : \"\";\n };\n return (\n <AnimatePresence initial={false}>\n {open ? (\n <motion.div\n ref={el}\n initial={{ height: 0 }}\n animate={{ height: \"auto\" }}\n exit={{ height: 0 }}\n transition={{ duration: reduce ? 0 : 0.2, ease: [0.22, 1, 0.36, 1] }}\n onAnimationStart={() => clip(true)}\n onAnimationComplete={() => clip(false)}\n className=\"min-w-0\"\n >\n {children}\n </motion.div>\n ) : null}\n </AnimatePresence>\n );\n}\n\n/* ── <FieldInset>: a small object, inline ───────────────────────────── */\n/**\n * D63: the ONE way to show \"these fields belong together\" inside a form. The object's label sits above (the field shell);\n * the children sit behind a single 1px --line inset line, `ml-1.5 pl-3`. No tint, no ring, no radius, no padding box.\n * Children keep the form's own field gap. Short neighbours pair up on wide forms through `FieldRun`.\n */\nexport function FieldInset({\n children, labelledBy, label, className,\n}: { children: React.ReactNode; labelledBy?: string; label?: string; className?: string }) {\n return (\n <InsetScope>\n <div\n role=\"group\"\n aria-labelledby={labelledBy}\n aria-label={labelledBy ? undefined : label}\n data-group=\"inset\"\n className={cn(INSET_LINE, \"flex flex-col\", className)}\n >\n {children}\n </div>\n </InsetScope>\n );\n}\n/** The inset line every nested group uses (inline objects, expanded array rows). */\nexport const INSET_LINE = \"ml-1.5 min-w-0 border-l border-kit-line pl-3\";\n\n/* ── <FieldUnit>: one compound control (button = label + link, image + alt) ── */\n/**\n * Reads as ONE input: the field border, radius 6, the input focus treatment on the whole unit; rows inside are split by a\n * hairline and have no borders of their own. Use for values that only make sense together (founder rule: a button's\n * label and link are one unit).\n */\nexport const FieldUnit = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement> & { invalid?: boolean; disabled?: boolean }>(\n ({ invalid, disabled, className, children, ...rest }, ref) => (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"field-unit\"\n data-invalid={invalid || undefined}\n aria-disabled={disabled || undefined}\n {...rest}\n className={cn(\n \"flex min-w-0 flex-col divide-y divide-kit-line-subtle rounded-kit-md border border-kit-field-border bg-kit-field-bg shadow-kit-field transition-[border-color,box-shadow] duration-150\",\n \"hover:border-kit-field-border-hover focus-within:border-kit-field-border-focus focus-within:shadow-kit-ring-field\",\n \"[&>*:first-child]:rounded-t-[5px] [&>*:last-child]:rounded-b-[5px]\",\n invalid && \"border-[var(--kit-field-invalid)] hover:border-[var(--kit-field-invalid)]\",\n disabled && \"pointer-events-none bg-kit-subtle opacity-60\",\n className,\n )}\n >\n {children}\n </div>\n ),\n);\nFieldUnit.displayName = \"FieldUnit\";\n\n/** One row of a unit: 36px, 8px side padding, no border (the unit draws the hairline between rows). */\nexport function FieldUnitRow({ className, children, ...rest }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div {...rest} className={cn(\"flex min-h-9 min-w-0 items-center gap-2 px-1\", className)}>\n {children}\n </div>\n );\n}\n\n/* ── Breakpoints: one group, one switcher ───────────────────────────── */\nconst BREAKPOINT_NAMES = [\"desktop\", \"laptop\", \"tablet\", \"mobile\", \"phone\"] as const;\nexport const isBreakpointName = (n: string) => (BREAKPOINT_NAMES as readonly string[]).includes(n.toLowerCase());\nconst BP_ICON: Record<string, React.ComponentType<{ className?: string; stroke?: number }>> = {\n desktop: IconDeviceDesktop, laptop: IconDeviceLaptop, tablet: IconDeviceTablet, mobile: IconDeviceMobile, phone: IconDeviceMobile,\n};\n/** An object field \"differs\" from the base breakpoint when it has an inherit switch that is off, or (without one) any value. */\nfunction overrides(f: FieldSchema, v: unknown): boolean {\n if (!isObj(v)) return false;\n const inherit = (f.fields ?? []).find((x) => x.type === \"boolean\" && /^(inherit|same|sameAs|useDesktop|inheritDesktop)/i.test(x.name));\n if (inherit) return v[inherit.name] === false;\n return (f.fields ?? []).some((x) => !isEmptyValue(v[x.name]));\n}\n\nexport type RenderField = (field: FieldSchema, path: FieldPath, parent: Record<string, unknown>) => React.ReactNode;\n\n/**\n * Per-screen-size settings as ONE group: the section header, then a segmented switcher (Desktop · Tablet · Phone) with a\n * dot on every size that has its own values; only the chosen size's fields show. Replaces three stacked groups.\n */\nexport function BreakpointGroup({\n set, members, basePath, memoryKey, divider, renderField,\n}: {\n set: Fieldset;\n members: FieldSchema[];\n basePath: FieldPath;\n memoryKey: string;\n divider?: boolean;\n renderField: RenderField;\n}) {\n const form = useForm()!;\n const rhythm = useRhythm();\n const [bp, setBp] = React.useState<string>(() => (form.memory.get(`${memoryKey}:bp`) as string | undefined) ?? members[0].name);\n const active = members.find((m) => m.name === bp) ?? members[0];\n const select = (n: string) => {\n setBp(n);\n form.memory.set(`${memoryKey}:bp`, n);\n };\n const [open, setOpen] = React.useState<boolean>(() => (form.memory.get(memoryKey) as boolean | undefined) ?? !set.collapsed);\n const status = useGroupStatus(members.map((m) => [...basePath, m.name]));\n const valueOf = (m: FieldSchema) => form.getAt([...basePath, m.name]);\n const differing = members.slice(1).filter((m) => overrides(m, valueOf(m)));\n const summary = differing.length ? `Own settings on ${differing.map((m) => m.title.toLowerCase()).join(\" and \")}` : `Same on every screen`;\n const activeValue = valueOf(active);\n const obj = isObj(activeValue) ? activeValue : {};\n const fields = (active.fields ?? []).filter((f) => !isHidden(f, obj));\n const id = React.useId();\n const compactBp = members.length >= 4 && members.every((m) => BP_ICON[m.name.toLowerCase()] || m.icon);\n return (\n <FieldSection\n title={set.title}\n description={set.description}\n collapsible={set.collapsible !== false}\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n form.memory.set(memoryKey, o);\n }}\n summary={summary}\n status={status}\n divider={divider}\n revealWhen={form.showAllErrors && status.errors > 0}\n lead={\n <div className=\"flex flex-col gap-1.5\">\n {/* D46: up to three sizes show their names; four or more (desktop · laptop · tablet · phone) become a device\n switcher: the chosen size keeps its name, the others collapse to icons with a tooltip. Status dots sit on the icon. */}\n <Segmented\n aria-label={`${set.title}: screen size`}\n size=\"sm\"\n value={active.name}\n onChange={select}\n collapseInactive={compactBp}\n className=\"w-full [&>button]:flex-1\"\n items={members.map((m, i) => {\n const Icon = BP_ICON[m.name.toLowerCase()];\n const own = i > 0 && differing.includes(m);\n const errs = form.rollup([...basePath, m.name]).errors;\n const dot = errs ? <span aria-hidden className=\"size-1.5 rounded-full bg-kit-danger\" /> : own ? <span aria-hidden className=\"size-1.5 rounded-full bg-kit-accent\" /> : null;\n const sr = errs ? \", has issues\" : own ? \", has its own settings\" : \"\";\n const glyph = Icon ? <Icon stroke={1.5} /> : m.icon ? <KitIcon name={m.icon} /> : undefined;\n if (compactBp)\n return {\n value: m.name,\n name: `${m.title}${sr}`,\n tooltip: m.title,\n icon: (\n <span className=\"relative inline-flex\">\n {glyph}\n {dot ? <span className=\"absolute -right-1 -top-0.5 inline-flex\">{dot}</span> : null}\n </span>\n ),\n label: <span>{m.title}{sr ? <span className=\"sr-only\">{sr}</span> : null}</span>,\n };\n return {\n value: m.name,\n icon: glyph,\n label: (\n <span className=\"inline-flex items-center gap-1\">\n {m.title}\n {dot}\n {sr ? <span className=\"sr-only\">{sr}</span> : null}\n </span>\n ),\n };\n })}\n />\n {active.description ? <p className=\"text-kit-xs leading-4 text-kit-fg-3\">{active.title} · {active.description}</p> : null}\n </div>\n }\n >\n <div role=\"group\" aria-labelledby={`${id}-bp`} className=\"flex flex-col\">\n <span id={`${id}-bp`} className=\"sr-only\">{active.title} settings</span>\n <AnimatePresence initial={false} key={active.name}>\n {fields.map((f, i) => (\n <Appear key={f.name} space={i === 0 ? undefined : rhythm.field}>{renderField(f, [...basePath, active.name, f.name], obj)}</Appear>\n ))}\n </AnimatePresence>\n </div>\n </FieldSection>\n );\n}\n\n/* ══ Frame layout (V2 engine/field-list.tsx): group tabs → fieldsets → fields ══════════════════════════════════════ */\ntype Item = { kind: \"field\"; field: FieldSchema } | { kind: \"set\"; set: Fieldset; fields: FieldSchema[] };\n\nconst ADVANCED: Fieldset = { name: \"__advanced\", title: \"Advanced\", description: \"Rarely-changed and developer settings\", collapsed: true };\nconst BREAKPOINTS: Fieldset = { name: \"__breakpoints\", title: \"Screen sizes\", layout: \"breakpoints\" };\n\n/** Fields in schema order, with each fieldset (and the auto \"Advanced\" / \"Screen sizes\" sets) placed at its first member. */\nexport function arrangeFields(fields: FieldSchema[], fieldsets: Fieldset[] = []): Item[] {\n const items: Item[] = [];\n const sets = new Map<string, Extract<Item, { kind: \"set\" }>>();\n const adv: FieldSchema[] = [];\n /* D45: two or more sibling objects named for screen sizes (desktop · tablet · phone) become ONE breakpoint group */\n const bpCount = fields.filter((f) => !f.fieldset && !f.advanced && f.type === \"object\" && isBreakpointName(f.name)).length;\n for (const f of fields) {\n const auto = !f.fieldset && !f.advanced && bpCount >= 2 && f.type === \"object\" && isBreakpointName(f.name);\n const setName = f.fieldset ?? (auto ? BREAKPOINTS.name : undefined);\n if (setName) {\n let s = sets.get(setName);\n if (!s) {\n s = { kind: \"set\", set: auto ? BREAKPOINTS : fieldsets.find((x) => x.name === setName) ?? { name: setName, title: setName }, fields: [] };\n sets.set(setName, s);\n items.push(s);\n }\n s.fields.push(f);\n } else if (f.advanced) adv.push(f);\n else items.push({ kind: \"field\", field: f });\n }\n if (adv.length) items.push({ kind: \"set\", set: ADVANCED, fields: adv });\n return items;\n}\n\n/** The group a field without `group` belongs to: the one marked `default`, else the first. */\nexport const defaultGroup = (groups?: FieldGroup[]) => groups?.find((g) => g.default) ?? groups?.[0];\n\n/**\n * FieldList — lays out one frame's fields (CPO D45 grouping): group TABS (with error dots) at the top of the frame only,\n * FIELDSETS as <FieldSection> (hairline + 36px header, no box, collapsed = one-line summary), breakpoint objects as ONE\n * <BreakpointGroup> with a switcher, an auto \"Advanced\" section for `advanced` fields, and `hidden` conditions that\n * appear / disappear with a height animation.\n * Rhythm: label→control 6 · fields 16 · groups 24 (dense ≤360px: 12 · 20; document: 20 · 32).\n */\nexport function FieldList({\n fields,\n fieldsets,\n groups,\n basePath,\n memoryKey,\n renderField,\n}: {\n fields: FieldSchema[];\n fieldsets?: Fieldset[];\n groups?: FieldGroup[];\n basePath: FieldPath;\n /** where to remember the selected tab / open fieldsets */\n memoryKey: string;\n /** draws one field (the engine passes KitField) */\n renderField: RenderField;\n}) {\n const form = useForm()!;\n const env = useKitEnv();\n const raw = form.getAt(basePath);\n const obj = isObj(raw) ? raw : {};\n const visible = fields.filter((f) => !isHidden(f, obj));\n\n const usable = (groups ?? []).filter((g) => visible.some((f) => (f.group ?? defaultGroup(groups)?.name) === g.name));\n const tabs = usable.length >= 2;\n const allTab = tabs && env.variant === \"document\";\n const memTab = form.memory.get(`${memoryKey}:tab`) as string | undefined;\n const [tab, setTab] = React.useState<string>(memTab ?? (allTab ? \"__all\" : defaultGroup(usable)?.name ?? \"\"));\n const select = (t: string) => {\n setTab(t);\n form.memory.set(`${memoryKey}:tab`, t);\n };\n const validTabs = [...(allTab ? [\"__all\"] : []), ...usable.map((g) => g.name)];\n const active = validTabs.includes(tab) ? tab : validTabs[0] ?? \"\";\n const inTab = (f: FieldSchema) => !tabs || active === \"__all\" || (f.group ?? defaultGroup(groups)?.name) === active;\n const groupErrors = (g: string) =>\n visible.filter((f) => (f.group ?? defaultGroup(groups)?.name) === g).reduce((n, f) => n + form.rollup([...basePath, f.name]).errors, 0);\n\n const items = arrangeFields(visible.filter(inTab), fieldsets);\n const rhythm = useRhythm();\n return (\n <div className=\"flex flex-col\">\n {tabs ? (\n <div className={rhythm.tabs}>\n <GroupTabs\n id={memoryKey}\n value={active}\n onChange={select}\n items={[...(allTab ? [{ name: \"__all\", title: \"All fields\" }] : []), ...usable].map((g) => ({ value: g.name, label: g.title, icon: \"icon\" in g ? g.icon : undefined, errors: g.name === \"__all\" ? 0 : groupErrors(g.name) }))}\n />\n </div>\n ) : null}\n {/* keyed by tab: switching tabs swaps the list at once; only conditions inside a tab animate */}\n <AnimatePresence initial={false} key={active || \"all\"}>\n {items.map((it, i) => {\n const prev = items[i - 1];\n /* spacing: 16 between fields; 24 before a section that follows a field and after a section; sections that follow\n sections sit flush (their hairline is the separator) */\n const space = i === 0 ? undefined : it.kind === \"set\" ? (prev?.kind === \"set\" ? undefined : rhythm.group) : rhythm.field;\n return it.kind === \"field\" ? (\n <Appear key={it.field.name} space={space}>\n {renderField(it.field, [...basePath, it.field.name], obj)}\n </Appear>\n ) : (\n <Appear key={`set:${it.set.name}`} space={space}>\n <FieldsetSection set={it.set} fields={it.fields} basePath={basePath} obj={obj} memoryKey={`${memoryKey}:fs:${it.set.name}`} divider={i > 0} renderField={renderField} />\n </Appear>\n );\n })}\n </AnimatePresence>\n {items.length === 0 ? <p className=\"py-6 text-center text-kit-sm text-kit-fg-3\">No fields here yet.</p> : null}\n </div>\n );\n}\n\n/* ── Group tabs (underline, with error dots) ───────────────────────── */\nexport interface GroupTabItem {\n value: string;\n label: string;\n icon?: string;\n errors: number;\n}\nconst MORE_W = 72;\n/** Tabs that don't fit the width fold into a \"More\" menu, never clipped (V2 HEAD c896beb field-list.tsx GroupTabs). The\n * active tab always shows its label: when it sits in the fold it takes the last visible slot. */\nexport function GroupTabs({ id, value, onChange, items }: { id: string; value: string; onChange: (v: string) => void; items: GroupTabItem[] }) {\n const { variant } = useKitEnv();\n /* `id` is the memoryKey (\"root\" in every form): a NestedForm with groups in a dialog would share the panel's\n underline layoutId and animate across forms. useId scopes it to this tab strip (kit deviation, no DOM change). */\n const uid = React.useId();\n const gap = variant === \"document\" ? 20 : 16;\n const wrap = React.useRef<HTMLDivElement>(null);\n const measure = React.useRef<HTMLDivElement>(null);\n const [fit, setFit] = React.useState(items.length);\n const sig = items.map((t) => `${t.value}:${t.label}:${t.icon ?? \"\"}`).join(\"|\");\n React.useLayoutEffect(() => {\n const w = wrap.current;\n const m = measure.current;\n if (!w || !m) return;\n const run = () => {\n const widths = Array.from(m.querySelectorAll<HTMLElement>(\"[data-seg-value]\")).map((el) => el.offsetWidth);\n const room = w.clientWidth;\n if (!room || !widths.length) return;\n const total = widths.reduce((a, b) => a + b, 0) + gap * (widths.length - 1);\n if (total <= room) return setFit(widths.length);\n let used = 0;\n let k = 0;\n for (; k < widths.length; k++) {\n const next = used + (k ? gap : 0) + widths[k];\n if (next + gap + MORE_W > room) break;\n used = next;\n }\n setFit(Math.max(1, k));\n };\n run();\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(run);\n ro.observe(w);\n return () => ro.disconnect();\n }, [sig, gap]);\n\n const toTab = (t: GroupTabItem) => ({\n value: t.value,\n icon: t.icon ? <KitIcon name={t.icon} className=\"size-3.5\" /> : undefined,\n label: (\n <span className=\"inline-flex items-center gap-1.5\" aria-label={t.errors ? `${t.label}, has errors` : undefined}>\n {t.label}\n {t.errors ? <span className=\"size-1.5 rounded-full bg-kit-danger\" aria-hidden /> : null}\n </span>\n ),\n });\n let shown = items.slice(0, fit);\n if (fit < items.length && !shown.some((t) => t.value === value)) {\n const act = items.find((t) => t.value === value);\n if (act) shown = [...shown.slice(0, Math.max(0, fit - 1)), act];\n }\n const rest = items.filter((t) => !shown.includes(t));\n return (\n <div ref={wrap} className=\"relative -mt-1 flex min-w-0 items-stretch\">\n {/* D12/D43: text tabs, 14px in every host, the active one in fg with the 1.5px underline — never a 12px whisper */}\n <Segmented\n variant=\"tabs\"\n bordered\n aria-label=\"Field groups\"\n size=\"md\"\n layoutId={`kit-tab-${uid}-${id}`}\n value={value}\n onChange={onChange}\n className={cn(\"min-w-0 flex-1\", variant === \"document\" ? \"gap-5\" : \"gap-4\")}\n items={shown.map(toTab)}\n />\n {rest.length ? (\n <span className=\"flex shrink-0 items-center border-b border-kit-line pl-2\">\n <Menu>\n <MenuTrigger\n render={\n <button type=\"button\" className=\"inline-flex h-8 items-center gap-1 text-kit-sm font-medium text-kit-fg-3 transition-colors hover:text-kit-fg-2 data-[popup-open]:text-kit-fg\" />\n }\n >\n More\n {rest.some((t) => t.errors) ? <span className=\"size-1.5 rounded-full bg-kit-danger\" aria-label=\"has errors\" /> : null}\n <IconChevronDown className=\"size-3.5\" stroke={1.5} aria-hidden />\n </MenuTrigger>\n <MenuContent align=\"end\">\n {rest.map((t) => (\n <MenuItem key={t.value} icon={t.icon ? <KitIcon name={t.icon} className=\"size-3.5\" /> : undefined} onClick={() => onChange(t.value)}>\n {t.label}\n {t.errors ? <span className=\"ml-1.5 inline-block size-1.5 rounded-full bg-kit-danger\" aria-label=\"has errors\" /> : null}\n </MenuItem>\n ))}\n </MenuContent>\n </Menu>\n {/* a host can still open a folded tab by its value (the schema preview jumps to a field in another tab) */}\n <span hidden>\n {rest.map((t) => (\n <button key={t.value} type=\"button\" tabIndex={-1} data-seg-value={t.value} onClick={() => onChange(t.value)} />\n ))}\n </span>\n </span>\n ) : null}\n {/* the measuring row: every tab at its natural width, never seen, never focused */}\n <div ref={measure} aria-hidden inert className=\"pointer-events-none invisible absolute left-0 top-0 flex whitespace-nowrap\">\n <Segmented variant=\"tabs\" size=\"md\" value=\"__measure\" onChange={() => {}} className={variant === \"document\" ? \"gap-5\" : \"gap-4\"} items={items.map(toTab)} />\n </div>\n </div>\n );\n}\n\n/* ── Fieldset → <FieldSection> (both hosts; the document only scales the rhythm) ── */\nexport function FieldsetSection({\n set, fields, basePath, obj, memoryKey, divider, renderField,\n}: { set: Fieldset; fields: FieldSchema[]; basePath: FieldPath; obj: Record<string, unknown>; memoryKey: string; divider: boolean; renderField: RenderField }) {\n const form = useForm()!;\n const breakpoints = set.layout === \"breakpoints\" && fields.length >= 2 && fields.every((f) => f.type === \"object\");\n const remembered = form.memory.get(memoryKey) as boolean | undefined;\n const [open, setOpen] = React.useState(remembered ?? !set.collapsed);\n const status = useGroupStatus(fields.map((f) => [...basePath, f.name]));\n if (breakpoints) return <BreakpointGroup set={set} members={fields} basePath={basePath} memoryKey={memoryKey} divider={divider} renderField={renderField} />;\n return (\n <FieldSection\n title={set.title}\n description={set.description}\n collapsible={set.collapsible !== false}\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n form.memory.set(memoryKey, o);\n }}\n summary={groupSummary(fields, obj) || \"Nothing set yet\"}\n status={status}\n divider={divider}\n revealWhen={form.showAllErrors && status.errors > 0}\n >\n {/* D63: `columns: 2` pairs short neighbours on a wide form only; long fields always take the full row */}\n <FieldRun fields={fields} columns={set.columns === 2} render={(f) => renderField(f, [...basePath, f.name], obj)} />\n </FieldSection>\n );\n}\n/** D41: a short field shares a 2-column row; a scale, slider, cards or radio select needs the full row. */\nexport const isShort = (f: FieldSchema) => [\"string\", \"number\", \"select\", \"color\", \"icon\", \"boolean\", \"date\", \"slug\", \"email\", \"url\", \"rating\"].includes(f.type) && !(f.type === \"select\" && (f.layout === \"cards\" || f.layout === \"radio\")) && !(f.type === \"number\" && (f.scale || f.layout === \"slider\"));\n"],"mappings":"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"}
|
package/engine/item-list.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"item-list.js","names":[],"sources":["../../src/kit/engine/item-list.tsx"],"sourcesContent":["/**\n * ITEM LIST — arrays of one line each (CPO D47): feature lists, bullets, \"what's included\", key points\n * (V2 HEAD 9829bf1 kit/engine/item-list.tsx).\n * Each item is a row you type into directly: grip · auto-growing input (founder rule: the whole text shows) · ⋯.\n * No drill frame, no expand. Keyboard: Enter adds the next item, Backspace on an empty row removes it, a multi-line\n * paste becomes several items, ⌥↑ / ⌥↓ move the row, ↑ / ↓ at the edges of the text step between rows. None of these\n * keys are printed on screen (D44); they live in aria labels and the ⋯ menu.\n *\n * Works for arrays of primitives (string / text / url / email / number) AND arrays of one-field objects\n * (`[{ _key, text }]`), which read and write that one field and keep their `_key`.\n *\n * Kit deviation: V2 sorts with @dnd-kit, which is not on the kit's package allow-list. `useDragReorder` below is the\n * kit's sortable: pointer drag on the grip (4px activation, siblings slide out of the way like dnd-kit's vertical\n * strategy), and dnd-kit's KeyboardSensor + sortableKeyboardCoordinates on a focused grip: Space / Enter picks the row\n * up, the arrow keys move it (siblings slide, nothing is written yet), Space / Enter / Tab drops it as ONE reorder\n * (one undo step), Escape puts it back. `sort.a11y` is dnd-kit's accessibility markup (hidden instructions + a visually\n * hidden `role=\"status\"` live region), rendered where V2's DndContext rendered it: right after the sortable children.\n */\nimport * as React from \"react\";\nimport { useReducedMotion } from \"framer-motion\";\nimport { IconArrowDown, IconArrowUp, IconCopy, IconDots, IconGripVertical, IconPlus, IconTrash } from \"@tabler/icons-react\";\nimport { Button } from \"../ui/button\";\nimport { Textarea } from \"../ui/input\";\nimport { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldPath, FieldSchema } from \"../schema/types\";\nimport { useForm, useKitServices } from \"../context\";\nimport { newKey, pathKey } from \"../lib/path\";\nimport { itemNoun } from \"../lib/schema\";\n\nexport type ItemKind = \"text\" | \"number\" | \"url\" | \"email\";\n\nexport interface ItemListAdapter {\n kind: ItemKind;\n /** the text shown in the row */\n read: (item: unknown) => string;\n /** a new list item holding `value` (objects keep `prev`'s other keys and `_key`) */\n write: (value: unknown, prev?: unknown) => unknown;\n /** the stable key of an item, when it carries one (`_key` on objects) */\n keyOf?: (item: unknown) => string | undefined;\n /** the path of the editable value inside item `i` (canvas anchoring, issues) */\n valuePath: (i: number) => FieldPath;\n placeholder?: string;\n}\n\n/** V2 controls/text TEXT_FOCUS: a list row's input shows the field focus border only, no ring shadow. */\nconst TEXT_FOCUS = \"focus:shadow-none focus-visible:shadow-none\";\nconst EASE = \"cubic-bezier(0.22, 1, 0.36, 1)\";\n\n\nconst cap = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\n/** \"- Net-30\", \"• Net-30\", \"1. Net-30\", \"[x] Net-30\" → \"Net-30\" */\nconst stripBullet = (s: string) => s.replace(/^\\s*(?:[-*•‣◦▪–—]|\\d+[.)]|\\[[ xX]\\])\\s+/, \"\").trim();\nconst move = <T,>(list: T[], from: number, to: number): T[] => {\n const next = list.slice();\n const [it] = next.splice(from, 1);\n next.splice(to, 0, it);\n return next;\n};\n/** dnd-kit's arrayMove, for callers that reorder lists. */\nexport const arrayMove = move;\n\nfunction toValue(kind: ItemKind, text: string): unknown {\n if (kind === \"number\") {\n const t = text.trim();\n if (!t) return null;\n const n = Number(t.replace(/,/g, \"\"));\n return Number.isFinite(n) ? n : undefined;\n }\n return kind === \"url\" || kind === \"email\" ? text.trim() : text;\n}\n\n/* ── Sortable (the kit's stand-in for @dnd-kit) ─────────────────────── */\ninterface DragState {\n id: string;\n from: number;\n over: number;\n dx: number;\n dy: number;\n /** how far a sibling slides to make room (dragged height + the list gap) */\n shift: number;\n /** item rects at pick-up (grid tiles slide into their neighbour's rect) */\n rects: (DOMRect | undefined)[];\n /** picked up from the keyboard: the row glides between slots instead of following a pointer */\n keyboard?: boolean;\n}\n\n/** Tiles on the first row of a grid at pick-up (↑ / ↓ jump by this many, like sortableKeyboardCoordinates). */\nconst columns = (rects: (DOMRect | undefined)[]) => {\n const top = rects[0]?.top;\n return top == null ? 1 : Math.max(1, rects.filter((r) => r?.top === top).length);\n};\n\n/**\n * Sortable rows by id. `register(id)` goes on the element that moves, `handle(id)` on its grip. Pointer: drag past\n * `distance` px to pick up; the row follows the pointer, siblings slide (list axis by one row, grid into the\n * neighbour's rect), the drop commits ONE reorder.\n * Keyboard on the grip (dnd-kit KeyboardSensor): Space / Enter picks up; ↑ / ↓ (← / → too in a grid, where ↑ / ↓ jump\n * a row of tiles) move it one slot; Space / Enter / Tab drops it as ONE reorder; Escape (or leaving the grip) cancels\n * with nothing written. Focus stays on the grip.\n */\nexport function useDragReorder(\n ids: string[],\n onReorder: (from: number, to: number) => void,\n { axis = \"y\", disabled = false, distance = 4 }: { axis?: \"y\" | \"grid\"; disabled?: boolean; distance?: number } = {},\n) {\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [announcement, setOwnAnnouncement] = React.useState(\"\");\n const ownId = React.useId();\n /* inside a shared sort (V2's one DndContext over several lists) the instructions and live region are the context's */\n const shared = React.useContext(SharedSortContext);\n const describedBy = shared?.id ?? ownId;\n const setAnnouncement = shared?.announce ?? setOwnAnnouncement;\n /* reduced motion: the keyboard glide and the neighbours' slide jump straight to their place */\n const glide = useReducedMotion() ? \"none\" : `transform 200ms ${EASE}`;\n const els = React.useRef(new Map<string, HTMLElement>());\n const grips = React.useRef(new Map<string, HTMLElement>());\n const refocus = React.useRef<string | null>(null);\n /* the keyboard drag, read synchronously by key handlers (state lags a render behind) */\n const kb = React.useRef<DragState | null>(null);\n const setKb = (s: DragState | null) => {\n kb.current = s;\n setDrag(s);\n };\n const latest = React.useRef({ ids, onReorder });\n latest.current = { ids, onReorder };\n\n React.useLayoutEffect(() => {\n const id = refocus.current;\n if (!id) return;\n refocus.current = null;\n const g = grips.current.get(id);\n if (g && document.activeElement !== g) g.focus();\n });\n\n const register = (id: string) => (el: HTMLElement | null) => {\n if (el) els.current.set(id, el);\n else els.current.delete(id);\n };\n\n const onPointerDown = (id: string) => (e: React.PointerEvent) => {\n if (disabled || e.button !== 0 || kb.current) return;\n e.stopPropagation();\n const from = latest.current.ids.indexOf(id);\n if (from < 0) return;\n const x0 = e.clientX;\n const y0 = e.clientY;\n let rects: (DOMRect | undefined)[] = [];\n let state: DragState | null = null;\n const userSelect = document.body.style.userSelect;\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - x0;\n const dy = ev.clientY - y0;\n if (!state) {\n if (Math.hypot(dx, dy) < distance) return;\n rects = latest.current.ids.map((k) => els.current.get(k)?.getBoundingClientRect());\n const r = rects[from];\n const next = rects[from + 1] ?? rects[from - 1];\n const gap = r && next ? Math.max(0, next.top > r.top ? next.top - r.bottom : r.top - next.bottom) : 0;\n state = { id, from, over: from, dx, dy, shift: (r?.height ?? 0) + gap, rects };\n document.body.style.userSelect = \"none\";\n setAnnouncement(`Picked up item ${from + 1} of ${latest.current.ids.length}.`);\n }\n const hit = rects.findIndex((r) => r && ev.clientY >= r.top && ev.clientY <= r.bottom && (axis === \"y\" || (ev.clientX >= r.left && ev.clientX <= r.right)));\n state = { ...state, dx, dy, over: hit >= 0 ? hit : state.over };\n setDrag(state);\n };\n const end = (commit: boolean) => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", onCancel);\n document.body.style.userSelect = userSelect;\n const s = state;\n setDrag(null);\n if (!s) return;\n /* the click that ends a drag never opens the row under it */\n const swallow = (ce: MouseEvent) => {\n ce.stopPropagation();\n ce.preventDefault();\n };\n window.addEventListener(\"click\", swallow, { capture: true, once: true });\n window.setTimeout(() => window.removeEventListener(\"click\", swallow, { capture: true }), 0);\n if (commit && s.over !== s.from) latest.current.onReorder(s.from, s.over);\n setAnnouncement(commit ? `Item dropped at position ${s.over + 1} of ${latest.current.ids.length}.` : `Dragging was cancelled. Item ${s.from + 1} was dropped.`);\n };\n const onUp = () => end(true);\n const onCancel = () => end(false);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", onCancel);\n };\n\n /** where the picked-up row sits over slot `over` (the sortable strategies' target rect) */\n const offset = (s: DragState, over: number) => {\n const a = s.rects[s.from];\n const b = s.rects[over];\n if (!a || !b || over === s.from) return { dx: 0, dy: 0 };\n if (axis === \"grid\") return { dx: b.left - a.left, dy: b.top - a.top };\n return { dx: 0, dy: over > s.from ? b.bottom - a.bottom : b.top - a.top };\n };\n\n const onKeyDown = (id: string) => (e: React.KeyboardEvent) => {\n if (disabled || e.nativeEvent.isComposing) return;\n const { ids: list, onReorder: commit } = latest.current;\n const n = list.length;\n const s = kb.current;\n if (!s) {\n if (e.key !== \" \" && e.key !== \"Enter\") return;\n const from = list.indexOf(id);\n if (from < 0 || drag) return;\n e.preventDefault();\n e.stopPropagation();\n const rects = list.map((k) => els.current.get(k)?.getBoundingClientRect());\n const r = rects[from];\n const next = rects[from + 1] ?? rects[from - 1];\n const gap = r && next ? Math.max(0, next.top > r.top ? next.top - r.bottom : r.top - next.bottom) : 0;\n setKb({ id, from, over: from, dx: 0, dy: 0, shift: (r?.height ?? 0) + gap, rects, keyboard: true });\n setAnnouncement(`Picked up item ${from + 1} of ${n}.`);\n return;\n }\n if (s.id !== id) return;\n if (e.key === \" \" || e.key === \"Enter\" || e.key === \"Tab\") {\n if (e.key !== \"Tab\") {\n e.preventDefault();\n refocus.current = id;\n }\n e.stopPropagation();\n setKb(null);\n // the list changed under the drag (another writer): nothing is moved, and the reason is announced\n if (list[s.from] !== id) return setAnnouncement(`The list changed while moving. Item ${s.from + 1} was not moved.`);\n if (s.over !== s.from) commit(s.from, s.over);\n setAnnouncement(`Item dropped at position ${s.over + 1} of ${n}.`);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n refocus.current = id;\n setKb(null);\n setAnnouncement(`Dragging was cancelled. Item ${s.from + 1} was dropped.`);\n return;\n }\n const rowStep = axis === \"grid\" ? columns(s.rects) : 1;\n const step =\n e.key === \"ArrowDown\" ? rowStep : e.key === \"ArrowUp\" ? -rowStep :\n axis === \"grid\" && e.key === \"ArrowRight\" ? 1 : axis === \"grid\" && e.key === \"ArrowLeft\" ? -1 : 0;\n if (!step) return;\n e.preventDefault();\n e.stopPropagation();\n const to = s.over + step;\n if (to < 0 || to >= n) return;\n setKb({ ...s, over: to, ...offset(s, to) });\n setAnnouncement(`Item moved to position ${to + 1} of ${n}.`);\n };\n\n /* focus leaving a picked-up grip (a click elsewhere) puts the row back, like Escape */\n const onBlur = (id: string) => () => {\n const s = kb.current;\n if (!s || s.id !== id) return;\n setKb(null);\n setAnnouncement(`Dragging was cancelled. Item ${s.from + 1} was dropped.`);\n };\n\n const handle = (id: string) => ({\n ref: (el: HTMLElement | null) => {\n if (el) grips.current.set(id, el);\n else grips.current.delete(id);\n },\n onPointerDown: onPointerDown(id),\n onKeyDown: onKeyDown(id),\n onBlur: onBlur(id),\n \"aria-pressed\": drag?.id === id ? true : undefined,\n \"aria-roledescription\": \"sortable\",\n \"aria-describedby\": describedBy,\n \"data-drag-handle\": id,\n });\n\n const style = (id: string): React.CSSProperties | undefined => {\n if (!drag) return undefined;\n if (id === drag.id) return { transform: `translate3d(${axis === \"grid\" ? drag.dx : 0}px, ${drag.dy}px, 0)`, zIndex: 10, position: \"relative\", transition: drag.keyboard ? glide : \"none\" };\n const i = ids.indexOf(id);\n const { from, over, shift } = drag;\n if (axis === \"grid\") {\n /* dnd-kit rectSortingStrategy (V2 grid lists): each tile between the pick-up and the hover slot slides into its\n neighbour's rect, so the gap opens where the tile will land */\n const to = from < over && i > from && i <= over ? i - 1 : from > over && i >= over && i < from ? i + 1 : i;\n const a = drag.rects[i];\n const b = drag.rects[to];\n const t = to !== i && a && b ? `translate3d(${b.left - a.left}px, ${b.top - a.top}px, 0)` : undefined;\n return { transform: t, transition: glide };\n }\n const dy = from < over && i > from && i <= over ? -shift : from > over && i >= over && i < from ? shift : 0;\n return { transform: dy ? `translate3d(0, ${dy}px, 0)` : undefined, transition: glide };\n };\n\n const a11y = shared ? null : <SortAnnouncer id={describedBy} announcement={announcement} />;\n return { register, handle, style, active: drag?.id ?? null, over: drag ? ids[drag.over] ?? null : null, a11y };\n}\n\nconst SharedSortContext = React.createContext<{ id: string; announce: (message: string) => void } | null>(null);\n\n/**\n * One announcer for several sortable lists, as V2 has where ONE DndContext wraps them (a table's row groups): the\n * lists under `SharedSortProvider value={value}` describe their grips with its instructions and announce into its live region, and `a11y`\n * renders once where V2's DndContext rendered it (after its children).\n */\nexport function useSharedSort() {\n const [announcement, setAnnouncement] = React.useState(\"\");\n const id = React.useId();\n const value = React.useMemo(() => ({ id, announce: setAnnouncement }), [id]);\n return { value, a11y: <SortAnnouncer id={id} announcement={announcement} /> };\n}\nexport const SharedSortProvider = SharedSortContext.Provider;\n\n/* dnd-kit's LiveRegion style: visually hidden, still read by screen readers */\nconst LIVE_REGION: React.CSSProperties = {\n position: \"fixed\", top: 0, left: 0, width: 1, height: 1, margin: -1, border: 0, padding: 0, overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\", clipPath: \"inset(100%)\", whiteSpace: \"nowrap\",\n};\n/**\n * dnd-kit's <Accessibility> (V2 got it from every DndContext): the drag instructions (display: none, named by each\n * handle's aria-describedby) and an assertive `role=\"status\"` live region with the last move. Like dnd-kit it renders\n * only after mount.\n */\nfunction SortAnnouncer({ id, announcement }: { id: string; announcement: string }) {\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => setMounted(true), []);\n if (!mounted) return null;\n return (\n <>\n <div id={id} style={{ display: \"none\" }}>\n To pick up a draggable item, press the space bar or enter. While dragging, use the arrow keys to move the item. Press space or enter again to drop the item in its new position, or press escape to cancel.\n </div>\n <div style={LIVE_REGION} role=\"status\" aria-live=\"assertive\" aria-atomic>\n {announcement}\n </div>\n </>\n );\n}\n\n/** Keys for list items that have none (primitives): stable across our own edits, regenerated on outside changes. */\nfunction useRowKeys(list: unknown[], keyOf?: (item: unknown) => string | undefined) {\n const local = React.useRef<string[]>([]);\n if (keyOf) return { keys: list.map((it, i) => keyOf(it) ?? `i${i}`), set: (_: string[]) => {} };\n if (local.current.length !== list.length) {\n const next = local.current.slice(0, list.length);\n while (next.length < list.length) next.push(newKey());\n local.current = next;\n }\n return { keys: local.current, set: (k: string[]) => (local.current = k) };\n}\n\nexport function ItemList({\n field,\n path,\n list,\n readOnly,\n adapter,\n inputId,\n}: {\n field: FieldSchema;\n path: FieldPath;\n list: unknown[];\n readOnly: boolean;\n adapter: ItemListAdapter;\n /** the field label's `htmlFor` lands on the first row */\n inputId?: string;\n}) {\n const form = useForm()!;\n const { toast } = useKitServices();\n const { min, max } = field.validation ?? {};\n const noun = itemNoun(field);\n const { keys, set: setKeys } = useRowKeys(list, adapter.keyOf);\n const inputs = React.useRef(new Map<string, HTMLTextAreaElement>());\n const addRef = React.useRef<HTMLButtonElement>(null);\n const focusReq = React.useRef<{ key: string; caret: \"start\" | \"end\" | number } | null>(null);\n const atMax = max != null && list.length >= max;\n const atMin = min != null && list.length <= min;\n\n // Apply a pending focus after the list re-renders (add / remove / move / paste).\n React.useLayoutEffect(() => {\n const req = focusReq.current;\n if (!req) return;\n const el = inputs.current.get(req.key);\n if (!el) return;\n focusReq.current = null;\n el.focus({ preventScroll: false });\n const at = req.caret === \"start\" ? 0 : req.caret === \"end\" ? el.value.length : Math.min(req.caret, el.value.length);\n el.setSelectionRange(at, at);\n el.scrollIntoView?.({ block: \"nearest\" });\n });\n\n const commit = (next: unknown[], nextKeys: string[]) => {\n setKeys(nextKeys);\n form.setAt(path, next);\n };\n const limitToast = () => toast?.(\"Limit reached\", { description: `${field.title} allows ${max} at most.` });\n\n /** Insert `values` after row i (and optionally replace row i itself in the same write). */\n const insertAfter = (i: number, values: unknown[], caret: \"start\" | \"end\" = \"end\", current?: unknown) => {\n const room = max == null ? values.length : Math.max(0, max - list.length);\n if (room === 0) return limitToast();\n const take = values.slice(0, room);\n if (take.length < values.length) toast?.(\"Some lines were left out\", { description: `${field.title} allows ${max} at most, so ${values.length - take.length} didn't fit.` });\n const items = take.map((v) => adapter.write(v));\n const newKeys = items.map((it) => adapter.keyOf?.(it) ?? newKey());\n const head = current === undefined ? list.slice(0, i + 1) : [...list.slice(0, i), current];\n commit([...head, ...items, ...list.slice(i + 1)], [...keys.slice(0, i + 1), ...newKeys, ...keys.slice(i + 1)]);\n focusReq.current = { key: newKeys[newKeys.length - 1], caret };\n };\n const add = () => {\n if (atMax) return limitToast();\n insertAfter(list.length - 1, [adapter.kind === \"number\" ? null : \"\"]);\n };\n const removeAt = (i: number, opts: { undo?: boolean; focus?: \"prev\" | \"none\" } = {}) => {\n if (atMin) return toast?.(`At least ${min} required`, { description: `${field.title} needs ${min} or more.` });\n const prevList = list;\n const prevKeys = keys;\n commit(list.filter((_, j) => j !== i), keys.filter((_, j) => j !== i));\n if (opts.focus !== \"none\") {\n const target = i > 0 ? keys[i - 1] : keys[i + 1];\n if (target) focusReq.current = { key: target, caret: i > 0 ? \"end\" : \"start\" };\n else window.setTimeout(() => addRef.current?.focus(), 0);\n }\n if (opts.undo) {\n const text = adapter.read(prevList[i]);\n toast?.(text ? `“${text.length > 40 ? `${text.slice(0, 38)}…` : text}” removed` : `${cap(noun)} removed`, {\n action: { label: \"Undo\", onClick: () => commit(prevList, prevKeys) },\n duration: 10_000,\n });\n }\n };\n const moveRow = (i: number, d: -1 | 1, keepFocus = false) => {\n const to = i + d;\n if (to < 0 || to >= list.length) return;\n const caret = inputs.current.get(keys[i])?.selectionStart ?? \"end\";\n commit(move(list, i, to), move(keys, i, to));\n if (keepFocus) focusReq.current = { key: keys[i], caret };\n };\n const duplicate = (i: number) => {\n if (atMax) return limitToast();\n insertAfter(i, [toValue(adapter.kind, adapter.read(list[i])) ?? adapter.read(list[i])]);\n };\n const focusRow = (i: number, caret: \"start\" | \"end\") => {\n const el = inputs.current.get(keys[i]);\n if (!el) return;\n el.focus();\n const at = caret === \"start\" ? 0 : el.value.length;\n el.setSelectionRange(at, at);\n };\n\n const sort = useDragReorder(keys, (from, to) => commit(move(list, from, to), move(keys, from, to)), { disabled: readOnly });\n\n const n = list.length;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {n ? (\n <>\n <ul className=\"flex flex-col gap-1.5\" aria-label={field.title}>\n {list.map((item, i) => (\n <ItemRow\n key={keys[i]}\n rowKey={keys[i]}\n sort={sort}\n index={i}\n count={n}\n noun={noun}\n item={item}\n adapter={adapter}\n readOnly={readOnly}\n fieldKey={pathKey([...path, ...adapter.valuePath(i)])}\n invalid={!!form.visibleIssue(pathKey([...path, ...adapter.valuePath(i)]))}\n inputId={i === 0 ? inputId : undefined}\n canAdd={!atMax}\n canRemove={!atMin}\n min={min}\n register={(el) => (el ? inputs.current.set(keys[i], el) : inputs.current.delete(keys[i]))}\n onChange={(v) => form.setAt([...path, i], adapter.write(v, item))}\n onBlur={() => form.touch(pathKey([...path, ...adapter.valuePath(i)]))}\n onEnter={(caretAtStart) => {\n if (!adapter.read(item).trim() && i === n - 1) return; // an empty last row doesn't spawn another\n if (atMax) return limitToast();\n // caret at the very start of a filled row: insert ABOVE (like a list in a doc)\n if (caretAtStart && adapter.read(item)) {\n const k = adapter.write(adapter.kind === \"number\" ? null : \"\");\n const nk = adapter.keyOf?.(k) ?? newKey();\n commit([...list.slice(0, i), k, ...list.slice(i)], [...keys.slice(0, i), nk, ...keys.slice(i)]);\n focusReq.current = { key: keys[i], caret: \"start\" };\n return;\n }\n insertAfter(i, [adapter.kind === \"number\" ? null : \"\"]);\n }}\n onBackspaceEmpty={() => removeAt(i, { focus: \"prev\" })}\n onPasteLines={(first, rest, caret) => {\n const items = rest.map((t) => toValue(adapter.kind, t)).filter((v) => v !== undefined);\n const current = adapter.write(toValue(adapter.kind, first) ?? first, item);\n if (items.length && !atMax) insertAfter(i, items, \"end\", current);\n else {\n if (items.length) limitToast();\n form.setAt([...path, i], current);\n focusReq.current = { key: keys[i], caret };\n }\n }}\n onMove={(d) => moveRow(i, d, true)}\n onStep={(d) => {\n const j = i + d;\n if (j >= 0 && j < n) focusRow(j, d < 0 ? \"end\" : \"start\");\n }}\n onDuplicate={() => duplicate(i)}\n onRemove={() => removeAt(i, { undo: true })}\n onMenuMove={(d) => moveRow(i, d)}\n />\n ))}\n </ul>\n {sort.a11y}\n </>\n ) : null}\n {readOnly ? (n ? null : <span className=\"text-kit-sm text-kit-fg-3\">Nothing here yet.</span>) : (\n <Button ref={addRef} size=\"sm\" variant=\"ghost\" className=\"-ml-1 self-start text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={atMax} onClick={add}>\n Add {noun}\n </Button>\n )}\n </div>\n );\n}\n\nfunction ItemRow({\n rowKey, sort, index, count, noun, item, adapter, readOnly, fieldKey, invalid, inputId, canAdd, canRemove, min, register,\n onChange, onBlur, onEnter, onBackspaceEmpty, onPasteLines, onMove, onStep, onDuplicate, onRemove, onMenuMove,\n}: {\n rowKey: string; sort: ReturnType<typeof useDragReorder>; index: number; count: number; noun: string; item: unknown; adapter: ItemListAdapter; readOnly: boolean;\n fieldKey: string; invalid: boolean; inputId?: string; canAdd: boolean; canRemove: boolean; min?: number;\n register: (el: HTMLTextAreaElement | null) => void;\n onChange: (v: unknown) => void; onBlur: () => void; onEnter: (caretAtStart: boolean) => void; onBackspaceEmpty: () => void;\n onPasteLines: (first: string, rest: string[], caret: number) => void; onMove: (d: -1 | 1) => void; onStep: (d: -1 | 1) => void;\n onDuplicate: () => void; onRemove: () => void; onMenuMove: (d: -1 | 1) => void;\n}) {\n const isDragging = sort.active === rowKey;\n const text = adapter.read(item);\n // numbers keep what you're typing (\"1.\", \"-\") until it parses\n const [draft, setDraft] = React.useState<string | null>(null);\n const shown = draft ?? text;\n const label = `${cap(noun)} ${index + 1} of ${count}`;\n const name = text ? `“${text.length > 32 ? `${text.slice(0, 30)}…` : text}”` : `${noun} ${index + 1}`;\n return (\n <li\n ref={sort.register(rowKey)}\n style={sort.style(rowKey)}\n data-field-key={fieldKey}\n className={cn(\"group/il relative flex items-start gap-1\", isDragging && \"z-10 rounded-kit-md bg-kit-surface shadow-kit-lg\")}\n >\n {readOnly ? null : (\n <button\n type=\"button\"\n aria-label={`Reorder ${name}`}\n {...sort.handle(rowKey)}\n className=\"relative mt-1.5 flex h-5 w-4 shrink-0 cursor-grab touch-none items-center justify-center rounded-kit-sm text-kit-fg-4 transition-colors before:absolute before:-inset-1.5 hover:text-kit-fg-2 active:cursor-grabbing\"\n >\n <IconGripVertical className=\"size-3.5\" stroke={1.5} />\n </button>\n )}\n <div className=\"min-w-0 flex-1\">\n <Textarea\n ref={register}\n id={inputId}\n rows={1}\n value={shown}\n readOnly={readOnly}\n aria-label={label}\n aria-invalid={invalid || undefined}\n placeholder={adapter.placeholder ?? cap(noun)}\n inputMode={adapter.kind === \"number\" ? \"decimal\" : adapter.kind === \"url\" ? \"url\" : adapter.kind === \"email\" ? \"email\" : undefined}\n spellCheck={adapter.kind === \"text\"}\n onBlur={() => {\n setDraft(null);\n onBlur();\n }}\n onChange={(e) => {\n const raw = e.target.value.replace(/\\r?\\n/g, \" \");\n if (adapter.kind === \"number\") {\n setDraft(raw);\n const v = toValue(\"number\", raw);\n if (v !== undefined) onChange(v);\n return;\n }\n onChange(toValue(adapter.kind, raw));\n }}\n onPaste={(e) => {\n if (readOnly) return;\n const clip = e.clipboardData.getData(\"text/plain\");\n if (!/\\r?\\n/.test(clip.trim())) return; // one line: the browser pastes it\n const lines = clip.split(/\\r?\\n/).map(stripBullet).filter(Boolean);\n if (lines.length < 2) return;\n e.preventDefault();\n const el = e.currentTarget;\n const before = el.value.slice(0, el.selectionStart);\n const after = el.value.slice(el.selectionEnd);\n const rest = lines.slice(1);\n rest[rest.length - 1] = `${rest[rest.length - 1]}${after}`;\n onPasteLines(`${before}${lines[0]}`, rest, before.length + lines[0].length);\n }}\n onKeyDown={(e) => {\n if (readOnly || e.nativeEvent.isComposing) return;\n const el = e.currentTarget;\n const atStart = el.selectionStart === 0 && el.selectionEnd === 0;\n const atEnd = el.selectionStart === el.value.length && el.selectionEnd === el.value.length;\n if (e.key === \"Enter\" && !e.shiftKey && !e.metaKey && !e.ctrlKey) {\n e.preventDefault();\n onEnter(atStart && el.value.length > 0);\n } else if (e.key === \"Backspace\" && !el.value && canRemove) {\n e.preventDefault();\n onBackspaceEmpty();\n } else if (e.altKey && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\n e.preventDefault();\n onMove(e.key === \"ArrowUp\" ? -1 : 1);\n } else if (e.key === \"ArrowUp\" && atStart && !e.shiftKey) {\n if (index > 0) {\n e.preventDefault();\n onStep(-1);\n }\n } else if (e.key === \"ArrowDown\" && atEnd && !e.shiftKey) {\n if (index < count - 1) {\n e.preventDefault();\n onStep(1);\n }\n }\n }}\n className={cn(TEXT_FOCUS, \"min-h-8 py-1.5 leading-5\")}\n />\n </div>\n {readOnly ? null : (\n <Menu>\n <MenuTrigger\n aria-label={`${cap(noun)} ${index + 1} actions`}\n className=\"mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-4 transition-colors hover:bg-kit-hover hover:text-kit-fg group-focus-within/il:text-kit-fg-3 group-hover/il:text-kit-fg-3 data-[popup-open]:bg-kit-hover data-[popup-open]:text-kit-fg\"\n >\n <IconDots className=\"size-4\" stroke={1.5} />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"w-48\">\n <MenuItem icon={<IconCopy stroke={1.5} />} disabled={!canAdd} onClick={onDuplicate}>{canAdd ? \"Duplicate\" : \"Duplicate · limit reached\"}</MenuItem>\n <MenuSeparator />\n <MenuItem icon={<IconArrowUp stroke={1.5} />} disabled={index === 0} shortcut=\"⌥↑\" onClick={() => onMenuMove(-1)}>Move up</MenuItem>\n <MenuItem icon={<IconArrowDown stroke={1.5} />} disabled={index === count - 1} shortcut=\"⌥↓\" onClick={() => onMenuMove(1)}>Move down</MenuItem>\n <MenuSeparator />\n <MenuItem danger icon={<IconTrash stroke={1.5} />} disabled={!canRemove} onClick={onRemove}>{canRemove ? \"Delete\" : `Delete · at least ${min} required`}</MenuItem>\n </MenuContent>\n </Menu>\n )}\n </li>\n );\n}\n"],"mappings":"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"}
|
package/engine/kit-field.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kit-field.js","names":[],"sources":["../../src/kit/engine/kit-field.tsx"],"sourcesContent":["/**\n * KitField — renders ONE field of the schema at `path` (must be inside <SchemaForm>): the shell + the control for its\n * type (V2 HEAD 9829bf1 kit/engine/kit-field.tsx).\n *\n * Arrays (array.tsx) and slots (slot.tsx) get their rows; objects open inline (FieldInset), drill (NavRow -> a frame),\n * popover or dialog (NestedForm: its own navigation stack). Primitive types dispatch through the CONTROLS table, which\n * the controls lanes fill. Every SchemaType has a control there; a type that is none of them (a schema newer than this\n * kit) edits its raw value in the JSON control (FallbackControl), never nothing and never a stand-in.\n */\nimport * as React from \"react\";\nimport type { ComponentType } from \"react\";\nimport { IconChevronRight } from \"@tabler/icons-react\";\nimport { KitIcon } from \"../lib/icons\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldPath, FieldSchema, PrimitiveType, SchemaType } from \"../schema/types\";\nimport { resolveHelp } from \"../schema/help\";\nimport type { ControlProps } from \"../types\";\nimport { resolveFieldAccess, useForm, useKitEnv, useKitServices, type KitPeer } from \"../context\";\nimport { Button } from \"../ui/button\";\nimport { Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Popover, PopoverContent, PopoverTrigger } from \"../ui/overlay\";\nimport { isObj, pathKey } from \"../lib/path\";\nimport { isHidden, objectOpenMode, plainText, summarize } from \"../lib/schema\";\nimport { ArrayField, type NestedFormProps } from \"./array\";\nimport { ExpandAction, ExpandedField, expandKey, expandSpecFor, isExpandShortcut, openExpanded } from \"./expand\";\nimport { FieldShell } from \"./field-shell\";\nimport { FieldList } from \"./field-list\";\nimport { IssueDot, RowChrome } from \"./bits\";\nimport { FieldInset, FieldRun, groupSummary, useInsetDepth } from \"./grouping\";\nimport { SchemaForm } from \"./schema-form\";\nimport { SlotField } from \"./slot\";\nimport { JsonControl } from \"../controls/json\";\n\nexport interface KitFieldProps {\n field: FieldSchema;\n path: (string | number)[];\n parent?: Record<string, unknown>;\n}\n\n/** Type → control. Registered by the controls lane; a type with no entry edits its raw value (FallbackControl). */\nexport const CONTROLS: Partial<Record<SchemaType, ComponentType<ControlProps>>> = {};\n\n/**\n * Type → label-row action (DESIGN 4.4: slug Generate, rich text expand, table Edit in full screen), registered by the\n * controls lane next to its control. It gets the control's props. V2 draws it only while the field is editable, except\n * the types in ACTION_WHEN_READ_ONLY, whose action takes `readOnly` and decides for itself (slug Generate).\n */\nexport const ACTIONS: Partial<Record<SchemaType, ComponentType<ControlProps>>> = {};\nexport const ACTION_WHEN_READ_ONLY = new Set<SchemaType>([\"slug\"]);\n\n/** D58: the field for the lens: read-only (plain text) when it can't edit it. Hidden fields never reach here\n * (SchemaForm drops them from the schema). */\nexport function useFieldAccess(field: FieldSchema) {\n const env = useKitEnv();\n return { readOnly: resolveFieldAccess(field, env).readOnly };\n}\n\n/** CPO D39: the field's help line — schema text first, then a line computed from its settings, then the house convention. */\nexport function withDefaultHelp(field: FieldSchema, isPublished?: boolean, readOnly?: boolean): FieldSchema {\n let computed: string | undefined;\n /* a value set elsewhere says where, in one plain line (never a lock or a key) */\n if (readOnly && field.lockReason) return { ...field, description: field.lockReason.replace(/\\.?$/, \".\") };\n if (field.type === \"slug\" && isPublished === false) computed = \"Follows the title until you change it or publish.\";\n else if (field.type === \"number\" && !field.scale && field.layout !== \"slider\" && field.numeric?.unit) {\n /* D63: the unit sits in the input (\"/ 5\", \"min\"), so a line that only restates it or its range is noise. A range\n still earns a line when the unit does not already say it (\"Between 1 and 12 items.\"). */\n const { min, max, unit } = field.numeric;\n const said = unit.startsWith(\"/\") || (max != null && unit.includes(String(max)));\n computed = said || (min == null && max == null) ? \"\" : min != null && max != null ? `Between ${min} and ${max} ${unit}.` : min != null ? `${min} ${unit} or more.` : `Up to ${max} ${unit}.`;\n } else if (field.type === \"number\" && !field.scale && field.layout !== \"slider\" && (field.numeric?.min != null || field.numeric?.max != null)) {\n const { min, max } = field.numeric ?? {};\n computed = min != null && max != null ? `Between ${min} and ${max}.` : min != null ? `${min} or more.` : `Up to ${max}.`;\n }\n /* resolve here so the computed line wins over the house convention; \"\" survives as \"deliberately none\" */\n const help = resolveHelp(field, computed) ?? \"\";\n return help === field.description ? field : { ...field, description: help };\n}\n\nexport function KitField({ field, path, parent }: KitFieldProps) {\n const form = useForm();\n const env = useKitEnv();\n const id = React.useId();\n const { readOnly } = useFieldAccess(field);\n if (!form) return null;\n\n if (field.type === \"array\") return <ArrayField field={field} path={path} parent={parent} />;\n if (field.type === \"slot\") return <SlotField field={field} path={path} />;\n if (field.type === \"object\") return <ObjectField field={field} path={path} />;\n\n const key = pathKey(path);\n const value = form.getAt(path);\n const onChange = (v: unknown) => form.setAt(path, v);\n const onBlur = () => form.touch(key);\n const issue = form.visibleIssue(key);\n const Control = CONTROLS[field.type] ?? FallbackControl;\n const Action = ACTIONS[field.type];\n const f = withDefaultHelp(field, env.isPublished, readOnly);\n const plain = readOnly && PLAIN_TYPES.has(field.type as PrimitiveType);\n const card = field.type === \"boolean\" && field.layout !== \"checkbox\";\n /* D49: rich text, code and tables open the shared expanded editor (expand.tsx). A lane that registers its\n own ACTIONS[type] owns its expansion too (rich text's editor modal, the table's spreadsheet): the engine draws no\n second modal and binds no second ⌘↵ for it. */\n const expand = plain || Action ? null : expandSpecFor(field, { readOnly, hasKitControl: !!CONTROLS[field.type], variant: env.variant });\n const action =\n Action && (!readOnly || ACTION_WHEN_READ_ONLY.has(field.type)) ? (\n <Action field={f} value={value} onChange={onChange} id={id} readOnly={readOnly} path={path} parent={parent} />\n ) : expand ? (\n <ExpandAction field={f} path={path} spec={expand} />\n ) : undefined;\n return (\n <FieldShell field={f} path={path} id={id} value={value} onChange={onChange} readOnly={readOnly} issue={issue} layout={card ? \"card\" : \"stack\"} action={action}>\n {plain ? (\n card ? null /* the switch card already reads On / Off */ : <PlainValue field={f} value={value} id={id} />\n ) : (\n <div\n onBlur={onBlur}\n onKeyDown={\n expand\n ? (e) => {\n if (!isExpandShortcut(e)) return;\n e.preventDefault();\n openExpanded(expandKey(env.docId, path));\n }\n : undefined\n }\n className=\"min-w-0\"\n >\n <Control field={f} value={value} onChange={onChange} id={id} invalid={issue?.level === \"error\"} readOnly={readOnly} path={path} parent={parent} onBlur={onBlur} />\n </div>\n )}\n {expand ? (\n <ExpandedField field={f} path={path} spec={expand} Control={Control} value={value} onChange={onChange} onBlur={onBlur} invalid={issue?.level === \"error\"} id={id} parent={parent} />\n ) : null}\n </FieldShell>\n );\n}\n\n/**\n * A row that opens something (V2 NavRow): type tile, title over a summary line, the field's chrome (from RowChrome),\n * the issue rollup and a chevron.\n * Like V2 it always draws its button and chevron, also with no `onClick` (a popover trigger around it opens on the\n * click). Only `inert` (the form draws no frames, so nothing can open) leaves both out.\n */\nexport function NavRow({\n icon,\n title,\n subtitle,\n path,\n onClick,\n inert,\n className,\n trailing,\n}: {\n icon?: string;\n title: string;\n subtitle?: string;\n path?: FieldPath;\n onClick?: () => void;\n inert?: boolean;\n className?: string;\n trailing?: React.ReactNode;\n}) {\n const form = useForm();\n const roll = path && form ? form.rollup(path) : { errors: 0, warnings: 0 };\n const subId = React.useId();\n const chrome = React.useContext(RowChrome);\n const text = (\n <>\n <span className=\"block truncate text-kit-sm text-kit-fg\">{title}</span>\n <span id={subId} className=\"block truncate text-kit-xs text-kit-fg-3\">\n {subtitle || \"Nothing set yet\"}\n </span>\n </>\n );\n return (\n <div\n className={cn(\n \"group/nav relative flex min-h-11 w-full min-w-0 items-center gap-2.5 rounded-kit-lg border border-kit-line bg-kit-control-bg py-1.5 pl-2 pr-2 text-left transition-colors hover:border-kit-line-strong hover:bg-kit-subtle\",\n className,\n )}\n >\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2\">\n <KitIcon name={icon} fallback=\"folder\" className=\"size-4\" />\n </span>\n {!inert ? (\n <button\n type=\"button\"\n data-nav-main\n onClick={onClick}\n aria-label={`Open ${title}${roll.errors ? `, ${roll.errors} ${roll.errors === 1 ? \"issue\" : \"issues\"}` : \"\"}`}\n aria-describedby={subId}\n className=\"min-w-0 flex-1 text-left outline-none after:absolute after:inset-0 after:rounded-kit-lg after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-offset-2 focus-visible:after:outline-kit-focus-ring focus-visible:after:[outline-style:solid] [html[data-input-modality=pointer]_&]:focus-visible:after:outline-none\"\n >\n {text}\n </button>\n ) : (\n <div data-nav-main className=\"min-w-0 flex-1 text-left\">\n {text}\n </div>\n )}\n <IssueDot errors={roll.errors} warnings={roll.warnings} className=\"relative\" />\n {chrome ? <span className=\"relative z-[1] flex shrink-0 items-center gap-0.5 empty:hidden\">{chrome}</span> : null}\n {trailing}\n {!inert ? <IconChevronRight aria-hidden className=\"pointer-events-none size-4 shrink-0 text-kit-fg-3 transition-transform group-hover/nav:translate-x-0.5\" stroke={1.5} /> : null}\n </div>\n );\n}\n\n/* ── Object: inline · drill · popover · dialog (V2 ObjectField) ───── */\n\nfunction ObjectField({ field, path }: { field: FieldSchema; path: FieldPath }) {\n const form = useForm()!;\n const id = React.useId();\n const { readOnly } = useFieldAccess(field);\n const depth = useInsetDepth();\n const value = form.getAt(path);\n const obj = isObj(value) ? value : {};\n const fields = field.fields ?? [];\n /* D45 nesting rule: one container per level. Inside an inset (or an expanded row) an \"inline\" object would be a box in a\n box, so it drills instead — level 3+ is always a new frame, never more indentation. */\n const wanted = objectOpenMode(field);\n const mode = wanted === \"inline\" && depth > 0 ? \"drill\" : wanted;\n const [open, setOpen] = React.useState(false);\n const sum = groupSummary(fields, obj) || summarize(fields, obj);\n const nav = React.useRef<{ back: () => boolean }>(null);\n const shell = (control: React.ReactNode, layout?: \"row\") => (\n <FieldShell field={field} path={path} id={id} value={value} onChange={(v) => form.setAt(path, v)} readOnly={readOnly} issue={form.visibleIssue(pathKey(path))} layout={layout}>\n {control}\n </FieldShell>\n );\n if (mode === \"inline\") {\n const visible = fields.filter((f) => !isHidden(f, obj));\n /* D63: label, then the children behind one inset line; short neighbours pair up only on a wide form */\n return shell(\n <FieldInset label={field.title}>\n <FieldRun fields={visible} render={(f) => <KitField field={f} path={[...path, f.name]} parent={obj} />} />\n </FieldInset>,\n );\n }\n const help = resolveHelp(field) ?? \"\";\n if (mode === \"popover\")\n /* V2: Radix <PopoverTrigger asChild><div> — the whole row is the trigger (aria-expanded, aria-haspopup=\"dialog\");\n NavRow gets no onClick but still draws its button (\"Open <title>\") and chevron, whose click opens the popover. */\n return shell(\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger nativeButton={false} render={<div />}>\n <NavRow icon={field.icon} title={field.title} subtitle={sum || help} path={path} />\n </PopoverTrigger>\n <PopoverContent className=\"w-[340px] p-3\" align=\"start\">\n <FieldList fields={fields} basePath={path} memoryKey={`pop:${pathKey(path)}`} />\n </PopoverContent>\n </Popover>,\n \"row\",\n );\n if (mode === \"dialog\")\n return shell(\n <>\n <NavRow icon={field.icon} title={field.title} subtitle={sum || help} path={path} onClick={() => setOpen(true)} />\n <Modal\n open={open}\n onOpenChange={(o, d) => {\n // Escape steps back inside the dialog's own frames first (V2: onEscapeKeyDown + nav.back())\n if (!o && d.reason === \"escape-key\" && nav.current?.back()) return d.cancel();\n setOpen(o);\n }}\n >\n <ModalContent size=\"lg\">\n <ModalHeader title={field.title} description={field.description} icon={<KitIcon name={field.icon} fallback=\"folder\" />} />\n <ModalBody className=\"flex min-h-[320px] flex-col gap-5\">\n <NestedForm fields={fields} title={field.title} icon={field.icon} path={path} navRef={nav} />\n </ModalBody>\n <ModalFooter>\n <span className=\"mr-auto text-kit-xs text-kit-fg-3\">Changes save as you type</span>\n <Button variant=\"primary\" onClick={() => setOpen(false)}>\n Done\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n </>,\n \"row\",\n );\n return shell(<NavRow icon={field.icon} title={field.title} subtitle={sum || help} path={path} onClick={() => form.navigate(path)} inert={!form.canNavigate} />, \"row\");\n}\n\n/**\n * A dialog gets its OWN navigation stack: lists inside it drill inside the dialog (breadcrumb, Esc, stepper), never the\n * panel behind. Writes go straight into the parent form at `path`.\n */\nexport function NestedForm({ fields, title, icon, path, navRef }: NestedFormProps) {\n const form = useForm()!;\n const env = useKitEnv();\n const key = pathKey(path);\n const schema = React.useMemo(() => ({ name: key || \"nested\", title, icon, kind: \"object\" as const, fields }), [key, title, icon, fields]);\n const raw = form.getAt(path);\n const pub = form.hasPublished ? form.publishedAt(path) : undefined;\n const presence = React.useMemo(() => {\n const out: Record<string, KitPeer[]> = {};\n for (const [k, v] of Object.entries(env.presence)) if (k.startsWith(`${key}.`)) out[k.slice(key.length + 1)] = v;\n return out;\n }, [env.presence, key]);\n return (\n <SchemaForm\n schema={schema}\n value={isObj(raw) ? raw : {}}\n onChange={(v) => form.setAt(path, v)}\n variant=\"document\"\n scroll={false}\n navRef={navRef}\n resolveSchema={form.resolveSchema}\n blockLibrary={form.blockLibrary}\n published={isObj(pub) ? pub : undefined}\n presence={presence}\n readOnly={env.readOnly}\n showErrors={form.showAllErrors}\n onOpenReference={env.onOpenReference}\n env={{ docId: `${env.docId}:${key}`, docTitle: env.docTitle, urlPrefix: env.urlPrefix, isPublished: env.isPublished, palette: env.palette, helpDisplay: env.helpDisplay }}\n />\n );\n}\n\n/* ── Read-only as plain text (D58 §0): no greyed input, just the value ── */\nconst PLAIN_TYPES = new Set<PrimitiveType>([\"string\", \"text\", \"richtext\", \"number\", \"slug\", \"url\", \"email\", \"date\", \"datetime\", \"select\", \"multiselect\", \"tags\", \"boolean\", \"rating\"]);\nexport function plainOf(field: FieldSchema, value: unknown): string {\n if (value == null || value === \"\") return \"\";\n const label = (v: unknown) => field.options?.find((o) => o.value === v)?.label ?? String(v);\n if (field.type === \"boolean\") return value ? \"On\" : \"Off\";\n if (field.type === \"select\") return label(value);\n // before the list arm: stored rich text may be a Portable Text block array\n if (field.type === \"richtext\") return plainText(value);\n if (Array.isArray(value)) return value.map(label).join(\", \");\n if (field.type === \"date\" || field.type === \"datetime\") {\n const d = new Date(String(value).replace(/\\[.*\\]$/, \"\"));\n return Number.isNaN(+d) ? String(value) : d.toLocaleString(\"en-US\", field.type === \"date\" ? { month: \"short\", day: \"numeric\", year: \"numeric\" } : { month: \"short\", day: \"numeric\", year: \"numeric\", hour: \"numeric\", minute: \"2-digit\" });\n }\n if (field.type === \"number\" && isObj(value)) return String((value as { value?: unknown }).value ?? \"\");\n return typeof value === \"object\" ? \"\" : String(value);\n}\nfunction PlainValue({ field, value, id }: { field: FieldSchema; value: unknown; id: string }) {\n const text = plainOf(field, value);\n return (\n <p id={id} tabIndex={0} data-slot=\"kit-plain\" className={cn(\"min-w-0 whitespace-pre-wrap break-words text-kit-sm leading-6 text-kit-fg outline-none\", (field.type === \"slug\" || field.type === \"url\") && \"font-kit-mono text-kit-xs leading-6\")}>\n {text || <span className=\"text-kit-fg-3\">Empty</span>}\n </p>\n );\n}\n\n/* ── Unknown type: the raw value, in the JSON control ── */\n/**\n * Every SchemaType has a kit control (kit-field.test checks CONTROLS against the type list in schema/types.ts). A field\n * whose type is none of them edits its raw stored value in the JSON control, tagged `data-kit-fallback=\"<type>\"`: the\n * value is shown and kept, and an edit is written only once it parses.\n */\nexport function FallbackControl(props: ControlProps) {\n return (\n <div data-kit-fallback={props.field.type} className=\"min-w-0\">\n <JsonControl {...props} />\n </div>\n );\n}\n\n/* ── Hand-off: the host's own control for a value the kit refuses ── */\n/**\n * A control that cannot carry a stored value unchanged (rich text holding formatting its editor would drop) hands that\n * value to the host's control for the type (KitServices.LegacyControl: the dashboard's FieldRenderer arm), bare inside\n * the kit FieldShell, which owns the label and the help; the control names its reason above it. The box carries\n * `data-kit-legacy=\"<type>\"`, so the parity harness counts it (mismatch class `legacy-control`). A host with no legacy\n * service, or a control that throws while rendering, says why in words; the form around it keeps working.\n */\nexport function LegacyFallback(props: ControlProps) {\n const { LegacyControl } = useKitServices();\n const { field, id } = props;\n return (\n <div data-kit-legacy={field.type} className=\"min-w-0\">\n {LegacyControl ? (\n // keyed by the schema's content: a schema edit remounts the control (KitField hands over a fresh field object on\n // every render, so identity would remount on every keystroke). A value change retries in place (componentDidUpdate).\n <LegacyBoundary key={JSON.stringify(field)} field={field} id={id} value={props.value}>\n <LegacyControl {...props} />\n </LegacyBoundary>\n ) : (\n <LegacyRefusal id={id}>This view has no control for {field.type} fields.</LegacyRefusal>\n )}\n </div>\n );\n}\n\n/**\n * An `<output>`: a labelable element, so the FieldShell label's `for` lands on it, and focusable, so a keyboard user\n * reaches the reason. The neutral focus ring shows under keyboard modality only.\n */\nfunction LegacyRefusal({ id, children }: { id: string; children: React.ReactNode }) {\n return (\n <output\n id={id}\n role=\"note\"\n tabIndex={0}\n data-slot=\"kit-legacy-refusal\"\n className=\"block rounded-kit-sm text-kit-xs text-kit-fg-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-kit-focus-ring focus-visible:[outline-style:solid] [html[data-input-modality=pointer]_&]:focus-visible:outline-0\"\n >\n {children}\n </output>\n );\n}\n\n/** Retries the control once its field or value changes (a schema edit, a save from elsewhere, an undo). */\nclass LegacyBoundary extends React.Component<{ field: FieldSchema; id: string; value: unknown; children: React.ReactNode }, { reason: string | null }> {\n state = { reason: null as string | null };\n static getDerivedStateFromError(error: unknown) {\n return { reason: error instanceof Error ? error.message : String(error) };\n }\n componentDidUpdate(prev: { field: FieldSchema; value: unknown }) {\n if (this.state.reason === null) return;\n // by content: KitField hands over a fresh field object (withDefaultHelp) on every render\n if (prev.value !== this.props.value || JSON.stringify(prev.field) !== JSON.stringify(this.props.field)) this.setState({ reason: null });\n }\n render() {\n if (this.state.reason === null) return this.props.children;\n return (\n <LegacyRefusal id={this.props.id}>\n The {this.props.field.title} control could not load: {this.state.reason}\n </LegacyRefusal>\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-form.js","names":[],"sources":["../../src/kit/engine/schema-form.tsx"],"sourcesContent":["/**\n * <SchemaForm> — the BetterCMS Block Kit form engine (V2 HEAD 9829bf1 kit/engine/schema-form.tsx). One schema in, one\n * value out; renders through the shared field chrome; owns validation visibility, per-field undo + history (coalesced\n * 900ms, 50 steps), the published baseline (changed dots, Reset to published) and the navigation path.\n *\n * <SchemaForm schema={faq} value={v} onChange={setV} variant=\"panel\" />\n *\n * `path` is controllable so a canvas can sync selection <-> breadcrumb both ways. Frames (root, drilled object, array\n * item, slot block, button, history) come from lib/frames `resolveFrames`; the drill-in stage, crumbs and keys\n * (Esc / Alt+Up/Down) from frame.tsx and breadcrumb.tsx; the layout of each frame from grouping.tsx through field-list.\n *\n * The host provides the kit scope (`data-kit-scope`) around the form; the form never declares one of its own, so a\n * dark host scope is never reset to light inside it.\n */\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldPath, TypeSchema } from \"../schema/types\";\nimport { DEFAULT_ENV, FormProvider, KitEnvProvider, useKitEnv, visibleSchema, type FormApi, type HistoryEntry, type KitEnv, type KitPeer, type Swatch } from \"../context\";\nimport { resolveFrames } from \"../lib/frames\";\nimport { getIn, isObj, keyStartsWith, pathEq, pathKey, same, setIn } from \"../lib/path\";\nimport { collectIssues, type KitIssue } from \"../lib/validate\";\nimport { RowsHostContext } from \"./array\";\nimport { crumbSignature, FrameCrumbs, framesToCrumbs, type KitCrumb } from \"./breadcrumb\";\nimport { FieldList } from \"./field-list\";\nimport { FrameSlotsProvider, FrameStage, useFrameNavigation, type FrameSlots } from \"./frame\";\nimport { FieldSection } from \"./grouping\";\nimport { NestedForm } from \"./kit-field\";\nimport { TableFrame } from \"../controls/table/table\";\nimport { ButtonScreen } from \"../controls/button\";\n\nexport interface SchemaFormProps {\n schema: TypeSchema;\n value: Record<string, unknown>;\n onChange: (value: Record<string, unknown>) => void;\n /** controlled navigation path ([] = root). Omit for uncontrolled. */\n path?: FieldPath;\n defaultPath?: FieldPath;\n onPathChange?: (path: FieldPath) => void;\n /** \"panel\" = 320–420px inspector; \"document\" = the wide document editor column */\n variant?: \"panel\" | \"document\";\n /** resolve a block type (slot children) to its schema */\n resolveSchema?: (blockType: string) => TypeSchema | undefined;\n /** blocks offered by \"+ Add block\" (filtered by each slot's allow list) */\n blockLibrary?: TypeSchema[];\n /** the published version: enables changed dots and \"Reset to published\" */\n published?: Record<string, unknown>;\n /**\n * Component instance (CPO D28): values come from `from` unless a top-level key is in `overridden`. Overridden fields\n * get an accent dot + \"Reset\"; inherited ones read muted. `onReset(key)` drops one override.\n */\n inherited?: { from: string; overridden: string[]; onReset: (key: string) => void };\n /** pathKey → teammates in that field (\"items.1.answer\") */\n presence?: Record<string, KitPeer | KitPeer[]>;\n /** pathKey → open comment threads */\n comments?: Record<string, number>;\n /** host comment system. When set, the field comment chip opens the host's popover/panel instead of the kit's. */\n onComment?: KitEnv[\"onComment\"];\n /** \"Open {title}\" on a reference: the host opens the referenced entry (e.g. a stacked panel) */\n onOpenReference?: KitEnv[\"onOpenReference\"];\n /** the whole form is read-only for the lens (fields with their own `access.edit` still follow `env.can`) */\n readOnly?: boolean;\n /** validate everything now (after a publish attempt) */\n showErrors?: boolean;\n /** document identity + site context */\n env?: {\n docId?: string;\n docTitle?: string;\n urlPrefix?: string;\n isPublished?: boolean;\n palette?: Swatch[];\n syncedFrom?: string;\n /** D58: the host's access check (`useCan` at the host). Omitted → allow-all (staff tools, demos). */\n can?: KitEnv[\"can\"];\n /** CPO D39: \"tooltip\" moves help lines behind the ⓘ (dense hosts) */\n helpDisplay?: KitEnv[\"helpDisplay\"];\n };\n /** own scroll container (default: panel yes, document no) */\n scroll?: boolean;\n /** rendered above the breadcrumb (e.g. a block header) */\n header?: React.ReactNode;\n /** label of the root crumb (defaults to schema.title) */\n rootLabel?: string;\n /**\n * Host-owned trail (CPO D38): the form stops rendering its own breadcrumb and reports the drill-in crumbs\n * instead, so a host with its own path header shows ONE breadcrumb. Navigate with `onPathChange`. Called in a\n * layout effect, so the host header never lags a frame.\n */\n onCrumbs?: (crumbs: KitCrumb[]) => void;\n onIssuesChange?: (issues: KitIssue[]) => void;\n /** imperative navigation for hosts (e.g. a dialog's Escape: go up one level before closing) */\n navRef?: React.Ref<{ back: () => boolean }>;\n className?: string;\n}\n\nexport const COALESCE_MS = 900;\nexport const UNDO_STEPS = 50;\nconst HISTORY_ENTRIES = 30;\n\n/* The frame pieces other lanes own, handed to frame.tsx (which never imports them directly). ButtonScreen (link\n control) and TableFrame (table control) arrive with the controls lanes; until then the header title reads the\n button's label the way V2's `normLink(v).label` does.\n The getters read the imports at render, not at module evaluation: kit-field → array / field-list → schema-form →\n kit-field is a cycle, and an eager read would hit the TDZ the day one of them becomes a const or memo(). */\nconst buttonLabel = (v: unknown) => ({ label: isObj(v) && typeof v.label === \"string\" ? v.label : undefined });\nconst FRAME_SLOTS: FrameSlots = {\n get FieldList() {\n return FieldList;\n },\n get FieldSection() {\n return FieldSection;\n },\n get TableFrame() {\n return TableFrame;\n },\n get ButtonScreen() {\n return ButtonScreen;\n },\n normLink: buttonLabel,\n};\nconst ROWS_HOST = {\n get NestedForm() {\n return NestedForm;\n },\n};\n\nexport function SchemaForm({\n schema: schemaIn,\n value,\n onChange,\n path: controlledPath,\n defaultPath,\n onPathChange,\n variant = \"panel\",\n resolveSchema: resolveIn,\n blockLibrary,\n published,\n inherited,\n presence,\n comments,\n onComment,\n onOpenReference,\n readOnly,\n showErrors = false,\n env: envIn,\n scroll,\n header,\n rootLabel,\n onCrumbs,\n onIssuesChange,\n navRef,\n className,\n}: SchemaFormProps) {\n const outerCan = useKitEnv().can;\n const can = envIn?.can ?? outerCan; // a nested form (dialog object, article block) inherits its host form's check\n /* D58: fields the lens can't view are dropped from the schema here, once: not rendered, not validated */\n const schema = React.useMemo(() => visibleSchema(schemaIn, can), [schemaIn, can]);\n const resolveSchema = React.useMemo(\n () =>\n resolveIn\n ? (t: string) => {\n const s = resolveIn(t);\n return s && visibleSchema(s, can);\n }\n : undefined,\n [resolveIn, can],\n );\n const docId = envIn?.docId ?? schema.name;\n const ownScroll = scroll ?? variant === \"panel\";\n\n /* value + baseline */\n const valueRef = React.useRef(value);\n valueRef.current = value;\n const [baseline, setBaseline] = React.useState(value);\n const stacks = React.useRef(new Map<string, { path: FieldPath; values: unknown[]; at: number }>());\n const log = React.useRef(new Map<string, HistoryEntry[]>());\n const memory = React.useRef(new Map<string, unknown>());\n const [aiKeys, setAiKeys] = React.useState<Set<string>>(() => new Set());\n const [touched, setTouched] = React.useState<Set<string>>(() => new Set());\n const editing = React.useRef(new Set<string>());\n const [, bump] = React.useReducer((x: number) => x + 1, 0);\n React.useEffect(() => {\n setBaseline(valueRef.current);\n stacks.current.clear();\n log.current.clear();\n memory.current.clear();\n setTouched(new Set());\n setAiKeys(new Set());\n }, [docId]);\n\n /* navigation */\n const [innerPath, setInnerPath] = React.useState<FieldPath>(defaultPath ?? []);\n const rawPath = controlledPath ?? innerPath;\n const { frames, path } = React.useMemo(() => resolveFrames(schema, value, rawPath, resolveSchema), [schema, value, rawPath, resolveSchema]);\n const navigate = React.useCallback(\n (p: FieldPath) => {\n if (controlledPath === undefined) setInnerPath(p);\n onPathChange?.(p);\n },\n [controlledPath, onPathChange],\n );\n /* a path that no longer resolves (a removed item, a hidden field) settles on the deepest frame that does */\n React.useEffect(() => {\n if (!pathEq(path, rawPath)) navigate(path);\n }, [path, rawPath, navigate]);\n /* V2: a new document starts at its root (an uncontrolled path never carries the last document's drill or history).\n Skips the mount run so `defaultPath` survives. */\n const lastDoc = React.useRef(docId);\n React.useEffect(() => {\n if (lastDoc.current === docId) return;\n lastDoc.current = docId;\n if (controlledPath === undefined) setInnerPath([]);\n }, [docId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* writes */\n const setAt = React.useCallback<FormApi[\"setAt\"]>(\n (p, v, opts) => {\n const prev = getIn(valueRef.current, p);\n if (same(prev, v)) return;\n const key = pathKey(p);\n if (opts?.record !== false) {\n const now = Date.now();\n const st = stacks.current.get(key) ?? { path: p, values: [], at: 0 };\n if (!st.values.length || now - st.at > COALESCE_MS) st.values = [...st.values, prev].slice(-UNDO_STEPS);\n st.at = now;\n stacks.current.set(key, st);\n const h = log.current.get(key) ?? [];\n const entry: HistoryEntry = { value: v, at: now, by: \"You\", label: opts?.label };\n log.current.set(key, h.length && now - h[0].at < COALESCE_MS && !opts?.label ? [entry, ...h.slice(1)] : [entry, ...h].slice(0, HISTORY_ENTRIES));\n editing.current.add(key);\n }\n const next = setIn(valueRef.current, p, v);\n valueRef.current = next;\n onChange(next);\n },\n [onChange],\n );\n\n /* validation */\n const issueList = React.useMemo(() => collectIssues(schema.fields, value, [], resolveSchema), [schema, value, resolveSchema]);\n const issues = React.useMemo(() => new Map(issueList.map((i) => [i.key, i])), [issueList]);\n React.useEffect(() => onIssuesChange?.(issueList), [issueList, onIssuesChange]);\n const isVisible = React.useCallback(\n (i: KitIssue) => showErrors || touched.has(i.key) || (i.kind === \"rule\" && !editing.current.has(i.key)),\n [showErrors, touched],\n );\n\n const api: FormApi = {\n schema,\n value,\n setAt,\n getAt: (p) => getIn(value, p),\n baselineAt: (p) => getIn(baseline, p),\n publishedAt: (p) => getIn(published, p),\n hasPublished: !!published,\n inherited: inherited ? { from: inherited.from, isOverridden: (k) => inherited.overridden.includes(k), reset: inherited.onReset } : undefined,\n path,\n navigate,\n canNavigate: true,\n resolveSchema,\n blockLibrary,\n issues,\n visibleIssue: (k) => {\n const i = issues.get(k);\n return i && isVisible(i) ? i : undefined;\n },\n rollup: (prefix) => {\n const pk = pathKey(prefix);\n let errors = 0;\n let warnings = 0;\n for (const i of issueList) if (keyStartsWith(i.key, pk) && isVisible(i)) i.level === \"error\" ? errors++ : warnings++;\n return { errors, warnings };\n },\n touch: (k) => {\n editing.current.delete(k);\n if (!touched.has(k)) setTouched((s) => new Set(s).add(k));\n },\n showAllErrors: showErrors,\n canUndo: (k) => !!stacks.current.get(k)?.values.length,\n undo: (k) => {\n const st = stacks.current.get(k);\n if (!st?.values.length) return;\n const prev = st.values[st.values.length - 1];\n st.values = st.values.slice(0, -1);\n st.at = 0;\n const next = setIn(valueRef.current, st.path, prev);\n valueRef.current = next;\n onChange(next);\n bump();\n },\n history: (k) => log.current.get(k) ?? [],\n aiKeys,\n markAi: (k, on) =>\n setAiKeys((s) => {\n const n = new Set(s);\n if (on) n.add(k);\n else n.delete(k);\n return n;\n }),\n memory: memory.current,\n };\n\n const normPresence = React.useMemo(() => {\n const out: Record<string, KitPeer[]> = {};\n for (const [k, v] of Object.entries(presence ?? {})) out[k] = Array.isArray(v) ? v : [v];\n return out;\n }, [presence]);\n const env: KitEnv = React.useMemo(\n () => ({\n ...DEFAULT_ENV,\n variant,\n docId,\n docTitle: envIn?.docTitle,\n urlPrefix: envIn?.urlPrefix,\n /* a published copy proves \"live\"; its absence proves nothing (the dock has none), so it stays unknown */\n isPublished: envIn?.isPublished ?? (published ? true : undefined),\n palette: envIn?.palette ?? DEFAULT_ENV.palette,\n readOnly: !!readOnly,\n can,\n presence: normPresence,\n comments: comments ?? {},\n onComment,\n onOpenReference,\n syncedFrom: envIn?.syncedFrom,\n helpDisplay: envIn?.helpDisplay,\n }),\n [variant, docId, envIn?.docTitle, envIn?.urlPrefix, envIn?.isPublished, envIn?.palette, envIn?.syncedFrom, envIn?.helpDisplay, published, readOnly, can, normPresence, comments, onComment, onOpenReference],\n );\n\n React.useImperativeHandle(\n navRef,\n () => ({\n back: () => {\n if (frames.length < 2) return false;\n navigate(frames[frames.length - 2].path);\n return true;\n },\n }),\n [frames, navigate],\n );\n\n /* drill-in stage: direction-aware slide, scroll memory, focus on the entering frame, Esc / Alt+Up/Down */\n const root = React.useRef<HTMLDivElement>(null);\n const scroller = React.useRef<HTMLDivElement>(null);\n const nav = useFrameNavigation({ frames, navigate, root, scroller });\n\n const crumbs = framesToCrumbs(frames, schema, api.rollup, rootLabel);\n const crumbSig = crumbSignature(crumbs);\n const onCrumbsRef = React.useRef(onCrumbs);\n onCrumbsRef.current = onCrumbs;\n React.useLayoutEffect(() => {\n onCrumbsRef.current?.(crumbs);\n }, [crumbSig]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const syncedNote = envIn?.syncedFrom ? (\n <p className=\"mb-5 flex items-start gap-2 rounded-kit-lg bg-kit-info-soft px-3 py-2 text-kit-xs text-kit-info-fg\">\n <span className=\"mt-0.5 size-1.5 shrink-0 rounded-full bg-kit-info\" aria-hidden />\n <span>\n Synced from <span className=\"font-medium\">{envIn.syncedFrom}</span>. Changes here apply on every page that uses it.\n </span>\n </p>\n ) : null;\n const body = <FrameStage frames={frames} frameKey={nav.frameKey} dir={nav.dir} rootLabel={rootLabel ?? schema.title} variant={variant} before={syncedNote} />;\n\n return (\n <KitEnvProvider value={env}>\n <FormProvider value={api}>\n <FrameSlotsProvider value={FRAME_SLOTS}>\n <RowsHostContext.Provider value={ROWS_HOST}>\n <div ref={root} onKeyDown={nav.onKeyDown} className={cn(\"flex min-h-0 min-w-0 flex-col\", ownScroll && \"h-full\", className)} data-kit-form={schema.name}>\n {header}\n {onCrumbs ? null : <FrameCrumbs crumbs={crumbs} onNavigate={navigate} variant={variant} />}\n {ownScroll ? (\n <div ref={scroller} className=\"@container min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n {body}\n </div>\n ) : (\n <div className=\"@container\">{body}</div>\n )}\n </div>\n </RowsHostContext.Provider>\n </FrameSlotsProvider>\n </FormProvider>\n </KitEnvProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8FA,IAAa,cAAc;AAC3B,IAAa,aAAa;AAC1B,IAAM,kBAAkB;AAOxB,IAAM,eAAe,OAAgB,EAAE,OAAO,MAAM,EAAE,IAAI,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ,KAAA,GAAW;AAC7G,IAAM,cAA0B;CAC9B,IAAI,YAAY;AACd,SAAO;;CAET,IAAI,eAAe;AACjB,SAAO;;CAET,IAAI,aAAa;AACf,SAAO;;CAET,IAAI,eAAe;AACjB,SAAO;;CAET,UAAU;CACX;AACD,IAAM,YAAY,EAChB,IAAI,aAAa;AACf,QAAO;GAEV;AAED,SAAgB,WAAW,EACzB,QAAQ,UACR,OACA,UACA,MAAM,gBACN,aACA,cACA,UAAU,SACV,eAAe,WACf,cACA,WACA,WACA,UACA,UACA,WACA,iBACA,UACA,aAAa,OACb,KAAK,OACL,QACA,QACA,WACA,UACA,gBACA,QACA,aACkB;CAClB,MAAM,WAAW,WAAW,CAAC;CAC7B,MAAM,MAAM,OAAO,OAAO;CAE1B,MAAM,SAAS,MAAM,cAAc,cAAc,UAAU,IAAI,EAAE,CAAC,UAAU,IAAI,CAAC;CACjF,MAAM,gBAAgB,MAAM,cAExB,aACK,MAAc;EACb,MAAM,IAAI,UAAU,EAAE;AACtB,SAAO,KAAK,cAAc,GAAG,IAAI;KAEnC,KAAA,GACN,CAAC,WAAW,IAAI,CACjB;CACD,MAAM,QAAQ,OAAO,SAAS,OAAO;CACrC,MAAM,YAAY,UAAU,YAAY;CAGxC,MAAM,WAAW,MAAM,OAAO,MAAM;AACpC,UAAS,UAAU;CACnB,MAAM,CAAC,UAAU,eAAe,MAAM,SAAS,MAAM;CACrD,MAAM,SAAS,MAAM,uBAAO,IAAI,KAAiE,CAAC;CAClG,MAAM,MAAM,MAAM,uBAAO,IAAI,KAA6B,CAAC;CAC3D,MAAM,SAAS,MAAM,uBAAO,IAAI,KAAsB,CAAC;CACvD,MAAM,CAAC,QAAQ,aAAa,MAAM,+BAA4B,IAAI,KAAK,CAAC;CACxE,MAAM,CAAC,SAAS,cAAc,MAAM,+BAA4B,IAAI,KAAK,CAAC;CAC1E,MAAM,UAAU,MAAM,uBAAO,IAAI,KAAa,CAAC;CAC/C,MAAM,GAAG,QAAQ,MAAM,YAAY,MAAc,IAAI,GAAG,EAAE;AAC1D,OAAM,gBAAgB;AACpB,cAAY,SAAS,QAAQ;AAC7B,SAAO,QAAQ,OAAO;AACtB,MAAI,QAAQ,OAAO;AACnB,SAAO,QAAQ,OAAO;AACtB,6BAAW,IAAI,KAAK,CAAC;AACrB,4BAAU,IAAI,KAAK,CAAC;IACnB,CAAC,MAAM,CAAC;CAGX,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAoB,eAAe,EAAE,CAAC;CAC9E,MAAM,UAAU,kBAAkB;CAClC,MAAM,EAAE,QAAQ,SAAS,MAAM,cAAc,cAAc,QAAQ,OAAO,SAAS,cAAc,EAAE;EAAC;EAAQ;EAAO;EAAS;EAAc,CAAC;CAC3I,MAAM,WAAW,MAAM,aACpB,MAAiB;AAChB,MAAI,mBAAmB,KAAA,EAAW,cAAa,EAAE;AACjD,iBAAe,EAAE;IAEnB,CAAC,gBAAgB,aAAa,CAC/B;AAED,OAAM,gBAAgB;AACpB,MAAI,CAAC,OAAO,MAAM,QAAQ,CAAE,UAAS,KAAK;IACzC;EAAC;EAAM;EAAS;EAAS,CAAC;CAG7B,MAAM,UAAU,MAAM,OAAO,MAAM;AACnC,OAAM,gBAAgB;AACpB,MAAI,QAAQ,YAAY,MAAO;AAC/B,UAAQ,UAAU;AAClB,MAAI,mBAAmB,KAAA,EAAW,cAAa,EAAE,CAAC;IACjD,CAAC,MAAM,CAAC;CAGX,MAAM,QAAQ,MAAM,aACjB,GAAG,GAAG,SAAS;EACd,MAAM,OAAO,MAAM,SAAS,SAAS,EAAE;AACvC,MAAI,KAAK,MAAM,EAAE,CAAE;EACnB,MAAM,MAAM,QAAQ,EAAE;AACtB,MAAI,MAAM,WAAW,OAAO;GAC1B,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,KAAK,OAAO,QAAQ,IAAI,IAAI,IAAI;IAAE,MAAM;IAAG,QAAQ,EAAE;IAAE,IAAI;IAAG;AACpE,OAAI,CAAC,GAAG,OAAO,UAAU,MAAM,GAAG,KAAA,IAAkB,IAAG,SAAS,CAAC,GAAG,GAAG,QAAQ,KAAK,CAAC,MAAM,IAAY;AACvG,MAAG,KAAK;AACR,UAAO,QAAQ,IAAI,KAAK,GAAG;GAC3B,MAAM,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE;GACpC,MAAM,QAAsB;IAAE,OAAO;IAAG,IAAI;IAAK,IAAI;IAAO,OAAO,MAAM;IAAO;AAChF,OAAI,QAAQ,IAAI,KAAK,EAAE,UAAU,MAAM,EAAE,GAAG,KAAA,OAAoB,CAAC,MAAM,QAAQ,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,MAAM,GAAG,gBAAgB,CAAC;AAChJ,WAAQ,QAAQ,IAAI,IAAI;;EAE1B,MAAM,OAAO,MAAM,SAAS,SAAS,GAAG,EAAE;AAC1C,WAAS,UAAU;AACnB,WAAS,KAAK;IAEhB,CAAC,SAAS,CACX;CAGD,MAAM,YAAY,MAAM,cAAc,cAAc,OAAO,QAAQ,OAAO,EAAE,EAAE,cAAc,EAAE;EAAC;EAAQ;EAAO;EAAc,CAAC;CAC7H,MAAM,SAAS,MAAM,cAAc,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;AAC1F,OAAM,gBAAgB,iBAAiB,UAAU,EAAE,CAAC,WAAW,eAAe,CAAC;CAC/E,MAAM,YAAY,MAAM,aACrB,MAAgB,cAAc,QAAQ,IAAI,EAAE,IAAI,IAAK,EAAE,SAAS,UAAU,CAAC,QAAQ,QAAQ,IAAI,EAAE,IAAI,EACtG,CAAC,YAAY,QAAQ,CACtB;CAED,MAAM,MAAe;EACnB;EACA;EACA;EACA,QAAQ,MAAM,MAAM,OAAO,EAAE;EAC7B,aAAa,MAAM,MAAM,UAAU,EAAE;EACrC,cAAc,MAAM,MAAM,WAAW,EAAE;EACvC,cAAc,CAAC,CAAC;EAChB,WAAW,YAAY;GAAE,MAAM,UAAU;GAAM,eAAe,MAAM,UAAU,WAAW,SAAS,EAAE;GAAE,OAAO,UAAU;GAAS,GAAG,KAAA;EACnI;EACA;EACA,aAAa;EACb;EACA;EACA;EACA,eAAe,MAAM;GACnB,MAAM,IAAI,OAAO,IAAI,EAAE;AACvB,UAAO,KAAK,UAAU,EAAE,GAAG,IAAI,KAAA;;EAEjC,SAAS,WAAW;GAClB,MAAM,KAAK,QAAQ,OAAO;GAC1B,IAAI,SAAS;GACb,IAAI,WAAW;AACf,QAAK,MAAM,KAAK,UAAW,KAAI,cAAc,EAAE,KAAK,GAAG,IAAI,UAAU,EAAE,CAAE,GAAE,UAAU,UAAU,WAAW;AAC1G,UAAO;IAAE;IAAQ;IAAU;;EAE7B,QAAQ,MAAM;AACZ,WAAQ,QAAQ,OAAO,EAAE;AACzB,OAAI,CAAC,QAAQ,IAAI,EAAE,CAAE,aAAY,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;;EAE3D,eAAe;EACf,UAAU,MAAM,CAAC,CAAC,OAAO,QAAQ,IAAI,EAAE,EAAE,OAAO;EAChD,OAAO,MAAM;GACX,MAAM,KAAK,OAAO,QAAQ,IAAI,EAAE;AAChC,OAAI,CAAC,IAAI,OAAO,OAAQ;GACxB,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,SAAS;AAC1C,MAAG,SAAS,GAAG,OAAO,MAAM,GAAG,GAAG;AAClC,MAAG,KAAK;GACR,MAAM,OAAO,MAAM,SAAS,SAAS,GAAG,MAAM,KAAK;AACnD,YAAS,UAAU;AACnB,YAAS,KAAK;AACd,SAAM;;EAER,UAAU,MAAM,IAAI,QAAQ,IAAI,EAAE,IAAI,EAAE;EACxC;EACA,SAAS,GAAG,OACV,WAAW,MAAM;GACf,MAAM,IAAI,IAAI,IAAI,EAAE;AACpB,OAAI,GAAI,GAAE,IAAI,EAAE;OACX,GAAE,OAAO,EAAE;AAChB,UAAO;IACP;EACJ,QAAQ,OAAO;EAChB;CAED,MAAM,eAAe,MAAM,cAAc;EACvC,MAAM,MAAiC,EAAE;AACzC,OAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,YAAY,EAAE,CAAC,CAAE,KAAI,KAAK,MAAM,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE;AACxF,SAAO;IACN,CAAC,SAAS,CAAC;CACd,MAAM,MAAc,MAAM,eACjB;EACL,GAAG;EACH;EACA;EACA,UAAU,OAAO;EACjB,WAAW,OAAO;EAElB,aAAa,OAAO,gBAAgB,YAAY,OAAO,KAAA;EACvD,SAAS,OAAO,WAAW,YAAY;EACvC,UAAU,CAAC,CAAC;EACZ;EACA,UAAU;EACV,UAAU,YAAY,EAAE;EACxB;EACA;EACA,YAAY,OAAO;EACnB,aAAa,OAAO;EACrB,GACD;EAAC;EAAS;EAAO,OAAO;EAAU,OAAO;EAAW,OAAO;EAAa,OAAO;EAAS,OAAO;EAAY,OAAO;EAAa;EAAW;EAAU;EAAK;EAAc;EAAU;EAAW;EAAgB,CAC7M;AAED,OAAM,oBACJ,eACO,EACL,YAAY;AACV,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,WAAS,OAAO,OAAO,SAAS,GAAG,KAAK;AACxC,SAAO;IAEV,GACD,CAAC,QAAQ,SAAS,CACnB;CAGD,MAAM,OAAO,MAAM,OAAuB,KAAK;CAC/C,MAAM,WAAW,MAAM,OAAuB,KAAK;CACnD,MAAM,MAAM,mBAAmB;EAAE;EAAQ;EAAU;EAAM;EAAU,CAAC;CAEpE,MAAM,SAAS,eAAe,QAAQ,QAAQ,IAAI,QAAQ,UAAU;CACpE,MAAM,WAAW,eAAe,OAAO;CACvC,MAAM,cAAc,MAAM,OAAO,SAAS;AAC1C,aAAY,UAAU;AACtB,OAAM,sBAAsB;AAC1B,cAAY,UAAU,OAAO;IAC5B,CAAC,SAAS,CAAC;CAEd,MAAM,aAAa,OAAO,aACxB,qBAAC,KAAD;EAAG,WAAU;YAAb,CACE,oBAAC,QAAD;GAAM,WAAU;GAAoD,eAAA;GAAc,CAAA,EAClF,qBAAC,QAAD,EAAA,UAAA;GAAM;GACQ,oBAAC,QAAD;IAAM,WAAU;cAAe,MAAM;IAAkB,CAAA;;GAC9D,EAAA,CAAA,CACL;MACF;CACJ,MAAM,OAAO,oBAAC,YAAD;EAAoB;EAAQ,UAAU,IAAI;EAAU,KAAK,IAAI;EAAK,WAAW,aAAa,OAAO;EAAgB;EAAS,QAAQ;EAAc,CAAA;AAE7J,QACE,oBAAC,gBAAD;EAAgB,OAAO;YACrB,oBAAC,cAAD;GAAc,OAAO;aACnB,oBAAC,oBAAD;IAAoB,OAAO;cACzB,oBAAC,gBAAgB,UAAjB;KAA0B,OAAO;eAC/B,qBAAC,OAAD;MAAK,KAAK;MAAM,WAAW,IAAI;MAAW,WAAW,GAAG,iCAAiC,aAAa,UAAU,UAAU;MAAE,iBAAe,OAAO;gBAAlJ;OACG;OACA,WAAW,OAAO,oBAAC,aAAD;QAAqB;QAAQ,YAAY;QAAmB;QAAW,CAAA;OACzF,YACC,oBAAC,OAAD;QAAK,KAAK;QAAU,WAAU;kBAC3B;QACG,CAAA,GAEN,oBAAC,OAAD;QAAK,WAAU;kBAAc;QAAW,CAAA;OAEtC;;KACmB,CAAA;IACR,CAAA;GACR,CAAA;EACA,CAAA"}
|
package/engine/slot.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slot.js","names":[],"sources":["../../src/kit/engine/slot.tsx"],"sourcesContent":["/**\n * SLOTS — blocks inside blocks (tabs, columns, bento, carousels, mega-menu panels; V2 HEAD 9829bf1 kit/engine/slot.tsx).\n * Rows show the block icon, its name and a variant chip; \"+ Add block\" opens a compact, searchable block picker;\n * opening a row drills into THAT block's own schema (resolved with `resolveSchema(blockType)`).\n *\n * Drill rows call the RowsHostContext frame push (see array.tsx); with nothing to draw the frame they are inert.\n */\nimport * as React from \"react\";\nimport { IconPlus, IconSearch } from \"@tabler/icons-react\";\nimport { KitIcon } from \"../lib/icons\";\nimport { Button } from \"../ui/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldPath, FieldSchema, TypeSchema } from \"../schema/types\";\nimport { useForm } from \"../context\";\nimport { ensureKeys, isObj, itemId, pathKey } from \"../lib/path\";\nimport { newBlock, previewOf, slotAllow, summarize } from \"../lib/schema\";\nimport { RowList, useDrill, useListOps, type RowModel } from \"./array\";\nimport { FieldShell } from \"./field-shell\";\nimport { useFieldAccess } from \"./kit-field\";\n\nexport function SlotField({ field, path }: { field: FieldSchema; path: FieldPath }) {\n const form = useForm()!;\n const drill = useDrill();\n const id = React.useId();\n const { readOnly } = useFieldAccess(field);\n const key = pathKey(path);\n const value = form.getAt(path);\n const list = Array.isArray(value) ? value : [];\n const write = (next: unknown[]) => form.setAt(path, ensureKeys(next));\n const ops = useListOps(field, path, list, write, (i) => drill?.([...path, i]));\n const available = useAvailableBlocks(field);\n const rows: RowModel[] = list.map((it, i) => {\n const type = isObj(it) && typeof it._type === \"string\" ? it._type : \"\";\n const block = form.resolveSchema?.(type);\n const pv = previewOf(block, it, i, block?.title ?? \"Block\");\n const variant = block?.variants?.find((v) => isObj(it) && v.id === it._variant)?.name;\n const settings = field.slotSettings && isObj(it) ? summarize(field.slotSettings, it._settings, 2) : \"\";\n return {\n id: itemId(it, i),\n index: i,\n item: it,\n path: [...path, i],\n preview: { ...pv, title: pv.empty ? (block?.title ?? \"Unknown block\") : pv.title, icon: block?.icon ?? \"box\" },\n chip: variant,\n extra: [pv.empty ? undefined : block?.title, settings].filter(Boolean).join(\" · \") || block?.description || `Block ${i + 1} of ${list.length}`,\n };\n });\n return (\n <FieldShell\n field={field}\n path={path}\n id={id}\n value={list}\n onChange={(v) => form.setAt(path, v)}\n readOnly={readOnly}\n issue={form.visibleIssue(key)}\n meta={<span className=\"text-kit-xs text-kit-fg-3\">{list.length} {list.length === 1 ? \"block\" : \"blocks\"}{field.validation?.max != null ? ` · max ${field.validation.max}` : \"\"}</span>}\n >\n <RowList\n field={field}\n rows={rows}\n readOnly={readOnly}\n layout=\"list\"\n mode=\"drill\"\n openId={null}\n onOpen={drill && ((r) => drill(r.path))}\n onCloseInline={() => {}}\n ops={ops}\n renderInline={() => null}\n leading={(r) => (\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg-2 shadow-kit-xs\">\n <KitIcon name={r.preview.icon} className=\"size-4\" />\n </span>\n )}\n emptyLabel=\"No blocks yet. Add one to start composing.\"\n addButton={<BlockPicker blocks={available} disabled={readOnly || ops.atMax} onPick={(b) => ops.add(newBlock(b, field.slotSettings))} />}\n />\n </FieldShell>\n );\n}\n\n/** Blocks this slot accepts: its allow list resolved through `resolveSchema`, else the whole block library. */\nexport function useAvailableBlocks(field: FieldSchema): TypeSchema[] {\n const form = useForm()!;\n const allow = slotAllow(field);\n return React.useMemo(() => {\n const lib = form.blockLibrary ?? [];\n if (!allow?.length) return lib;\n return allow.map((t) => lib.find((b) => b.name === t) ?? form.resolveSchema?.(t)).filter((b): b is TypeSchema => !!b);\n }, [allow?.join(\"|\"), form.blockLibrary, form.resolveSchema]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function BlockPicker({ blocks, onPick, disabled, label = \"Add block\" }: { blocks: TypeSchema[]; onPick: (b: TypeSchema) => void; disabled?: boolean; label?: string }) {\n const [open, setOpen] = React.useState(false);\n const [q, setQ] = React.useState(\"\");\n const [active, setActive] = React.useState(0);\n const list = blocks.filter((b) => !q || `${b.title} ${b.category ?? \"\"} ${b.description ?? \"\"}`.toLowerCase().includes(q.toLowerCase()));\n const cats = Array.from(new Set(list.map((b) => b.category ?? \"Blocks\")));\n const flat = cats.flatMap((c) => list.filter((b) => (b.category ?? \"Blocks\") === c));\n const pick = (b: TypeSchema) => {\n onPick(b);\n setOpen(false);\n setQ(\"\");\n };\n return (\n <Popover open={open} onOpenChange={(o) => { setOpen(o); setQ(\"\"); setActive(0); }}>\n <PopoverTrigger render={<Button size=\"sm\" variant=\"ghost\" className=\"text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={disabled} />}>{label}</PopoverTrigger>\n <PopoverContent className=\"w-[300px] p-0\" align=\"start\">\n <label\n className=\"flex h-10 items-center gap-2 border-b border-kit-line px-3 text-kit-fg-3\"\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") { e.preventDefault(); setActive((a) => (a + 1) % Math.max(1, flat.length)); }\n if (e.key === \"ArrowUp\") { e.preventDefault(); setActive((a) => (a - 1 + flat.length) % Math.max(1, flat.length)); }\n if (e.key === \"Enter\" && flat[active]) { e.preventDefault(); pick(flat[active]); }\n }}\n >\n <IconSearch className=\"size-4 shrink-0\" stroke={1.5} />\n <input autoFocus value={q} onChange={(e) => { setQ(e.target.value); setActive(0); }} placeholder=\"Search blocks\" aria-label=\"Search blocks\" className=\"h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-3\" />\n </label>\n <div className=\"max-h-80 overflow-y-auto p-1\" role=\"listbox\">\n {flat.length === 0 ? <p className=\"px-3 py-6 text-center text-kit-sm text-kit-fg-3\">No blocks match</p> : null}\n {cats.map((c) => (\n <div key={c} className=\"pb-1\">\n <div className=\"px-2 pb-1 pt-1.5 text-kit-2xs font-medium text-kit-fg-3\">{c}</div>\n {list.filter((b) => (b.category ?? \"Blocks\") === c).map((b) => {\n const i = flat.indexOf(b);\n return (\n <button\n key={b.name}\n type=\"button\"\n role=\"option\"\n aria-selected={i === active}\n onMouseEnter={() => setActive(i)}\n onClick={() => pick(b)}\n className={cn(\"flex w-full items-center gap-2.5 rounded-kit-md p-1.5 text-left\", i === active && \"bg-kit-hover\")}\n >\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-surface text-kit-fg-2 shadow-kit-xs\">\n <KitIcon name={b.icon} className=\"size-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-kit-sm text-kit-fg\">{b.title}</span>\n {b.description ? <span className=\"block truncate text-kit-xs text-kit-fg-3\">{b.description}</span> : null}\n </span>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n <div data-hint=\"shortcuts\" className=\"border-t border-kit-line px-3 py-1.5 text-kit-2xs text-kit-fg-3\">↵ add · type to search</div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
|
package/index.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { cn } from "./lib/cn.js";
|
|
2
|
-
import { prod_types_exports } from "./adapters/prod-types.js";
|
|
3
|
-
import { AI_PRESETS, DEFAULT_ENV, FieldHeaderSlot, FormProvider, KitEnvProvider, KitServicesProvider, SITE_PALETTE, fieldAccessOf, registerKitServices, resolveFieldAccess, seesDevSurfaces, useForm, useKitEnv, useKitServices, visibleFields, visibleSchema } from "./context.js";
|
|
4
|
-
import { FieldDescribedByContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy } from "./ui/field-context.js";
|
|
5
|
-
import { Button, HintTooltip, IconButton, RevealLink, Sparkle, TooltipScope, buttonVariants, iconButtonVariants } from "./ui/button.js";
|
|
6
|
-
import { ShortcutHint, ShortcutHintsProvider, shortcutHintsOn, useShortcutHints } from "./ui/shortcut-hint.js";
|
|
7
|
-
import { Checkbox, ChoiceCard, ChoiceList, Progress, Radio, RadioGroup, Segmented, Slider, Switch, ToggleGroup, ToggleItem } from "./ui/controls.js";
|
|
8
|
-
import { FLOATING_LAYER, HoverCard, HoverCardContent, HoverCardTrigger, Menu, MenuCheckItem, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Sheet, SheetClose, SheetContent, SheetTrigger, Tooltip, TooltipProvider, useFocusReturn } from "./ui/overlay.js";
|
|
9
|
-
import { IssueDot, Kbdish, RowChrome, Thumb } from "./engine/bits.js";
|
|
10
|
-
import { Avatar, AvatarStack, Badge, Card, CardHeader, Dot, EmptyState, Kbd, PageHeader, SKELETON, Separator, SettingsSection, Skeleton, Stat, StatusPill, Table, Td, Th, Tr, avatarRingSpread, badgeVariants, colorFor, initials, statusMap } from "./ui/display.js";
|
|
11
|
-
import { Field, HelpMore, Input, Label, SearchInput, Textarea } from "./ui/input.js";
|
|
12
|
-
import { AGENT_PRESENCE, presenceColor, presenceSlot, registerPresenceRoster } from "./ui/presence.js";
|
|
13
|
-
import { DEV_FIELD, DEV_ONLY_FIELD, HISTORY_SEGMENT } from "./schema/types.js";
|
|
14
|
-
import { conventionalHelp, resolveHelp } from "./schema/help.js";
|
|
15
|
-
import { FieldShell, LABEL_HINT_AT, PeerStack, apiName, resetFieldClipboard } from "./engine/field-shell.js";
|
|
16
|
-
import { groupSummary } from "./engine/group-summary.js";
|
|
17
|
-
import { AnimatedFields, Appear, BreakpointGroup, FieldInset, FieldSection, FieldUnit, FieldUnitRow, FieldsetSection, GroupTabs, InsetScope, RHYTHM, arrangeFields, defaultGroup, isBreakpointName, isShort, useGroupStatus, useInsetDepth, useRhythm } from "./engine/grouping.js";
|
|
18
|
-
import { Highlight, SEARCH_THRESHOLD, Select, filterOptions, matchPositions, matchScore, nodeText, selectTriggerClass } from "./ui/select.js";
|
|
19
|
-
import { FieldList } from "./engine/field-list.js";
|
|
20
|
-
import { ItemList, SharedSortProvider, arrayMove, useDragReorder, useSharedSort } from "./engine/item-list.js";
|
|
21
|
-
import { ARRAY_CONTROLS, ArrayField, RowList, RowsHostContext, rowToggleField, useDrill, useListOps } from "./engine/array.js";
|
|
22
|
-
import { isDrillable, resolveFrames, rootFrame } from "./lib/frames.js";
|
|
23
|
-
import { ExpandedEditorModal } from "./ui/expanded-editor-modal.js";
|
|
24
|
-
import { FrameCrumbs, KitBreadcrumb, crumbSignature, framesToCrumbs, kitPathItems } from "./engine/breadcrumb.js";
|
|
25
|
-
import { ChoiceSwitch, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, fitsSegmented } from "./ui/choice-switch.js";
|
|
26
|
-
import { FrameHeader, FrameSlotsProvider, FrameStage, FrameView, HistoryView, frameContext, frameDirection, parentOfField, parentTitleOf, useFrameNavigation, useFrameSlots } from "./engine/frame.js";
|
|
27
|
-
import { COALESCE_MS, SchemaForm, UNDO_STEPS } from "./engine/schema-form.js";
|
|
28
|
-
import { BlockPicker, SlotField, useAvailableBlocks } from "./engine/slot.js";
|
|
29
|
-
import { ACTIONS, ACTION_WHEN_READ_ONLY, CONTROLS, FallbackControl, KitField, LegacyFallback, NavRow, NestedForm, plainOf, useFieldAccess, withDefaultHelp } from "./engine/kit-field.js";
|
|
30
|
-
import { controls_exports, registerKitControls } from "./controls/index.js";
|
|
31
|
-
import { CAP_IDS } from "./schema/sources.js";
|
|
32
|
-
import { blockDefToSchema, fieldDefToSchema, fieldDefsToSchema, inferField, propDefToField, titleFromKey } from "./schema/adapters.js";
|
|
33
|
-
import { ActionTray, TrayMeta, TrayMore, actionTrayClass, relTime } from "./ui/action-tray.js";
|
|
34
|
-
import { ModeBar, ModeBarDot, ModeBarLink } from "./ui/mode-bar.js";
|
|
35
|
-
import "./ui/index.js";
|
|
36
|
-
import { buttonFromProd, buttonToProd, codeFromProd, codeToProd, cropPreset, cropRect, dateFromProd, dateToProd, datetimeFromProd, datetimeToProd, imageFromProd, imageToProd, isDockIcon, linkFromProd, linkToProd, listFromProd, listToProd, ratingFromProd, ratingToProd, referenceFromProd, referenceToProd, scaleFromProd, scaleToProd, tableFromProd, tableToProd, tagsFromProd, tagsToProd, videoFromProd, videoToProd, zoneListFromProd, zoneListToProd } from "./adapters/values.js";
|
|
37
|
-
import { CATEGORY_TO_PROD, fromTypeSchema, leafValuePlan, planFromProd, planToProd, propsToTypeSchema, toTypeSchema } from "./adapters/schema.js";
|
|
38
|
-
import "./controls/date-register.js";
|
|
39
|
-
import "./controls/icon-register.js";
|
|
40
|
-
import "./controls/code-register.js";
|
|
41
|
-
import "./controls/json-register.js";
|
|
42
|
-
import "./controls/location-register.js";
|
|
43
|
-
import "./controls/media-register.js";
|
|
44
|
-
import "./controls/reference-register.js";
|
|
45
|
-
import "./controls/form-picker-register.js";
|
|
46
|
-
import "./controls/slot-register.js";
|
|
47
|
-
import "./controls/rich-text/index.js";
|
|
48
|
-
import "./controls/table/index.js";
|
|
49
|
-
import "./kit.css";
|
|
50
|
-
//#region src/kit/index.ts
|
|
51
|
-
registerKitControls();
|
|
52
|
-
//#endregion
|
|
53
|
-
export { ACTIONS, ACTION_WHEN_READ_ONLY, AGENT_PRESENCE, AI_PRESETS, ARRAY_CONTROLS, ActionTray, AnimatedFields, Appear, ArrayField, Avatar, AvatarStack, Badge, BlockPicker, BreakpointGroup, Button, CAP_IDS, CATEGORY_TO_PROD, COALESCE_MS, CONTROLS, Card, CardHeader, Checkbox, ChoiceCard, ChoiceList, ChoiceSwitch, DEFAULT_ENV, DEV_FIELD, DEV_ONLY_FIELD, Dot, EmptyState, ExpandedEditorModal, FLOATING_LAYER, FallbackControl, Field, FieldDescribedByContext, FieldHeaderSlot, FieldInset, FieldLabelledByContext, FieldList, FieldSection, FieldShell, FieldUnit, FieldUnitRow, FieldsetSection, FormProvider, FrameCrumbs, FrameHeader, FrameSlotsProvider, FrameStage, FrameView, GroupTabs, HISTORY_SEGMENT, HelpMore, Highlight, HintTooltip, HistoryView, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, Input, InsetScope, IssueDot, ItemList, Kbd, Kbdish, KitBreadcrumb, KitEnvProvider, KitField, KitServicesProvider, LABEL_HINT_AT, Label, LegacyFallback, Menu, MenuCheckItem, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger, ModeBar, ModeBarDot, ModeBarLink, NavRow, NestedForm, PageHeader, PeerStack, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Progress, RHYTHM, Radio, RadioGroup, RevealLink, RowChrome, RowList, RowsHostContext, SEARCH_THRESHOLD, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, SITE_PALETTE, SKELETON, SchemaForm, SearchInput, Segmented, Select, Separator, SettingsSection, SharedSortProvider, Sheet, SheetClose, SheetContent, SheetTrigger, ShortcutHint, ShortcutHintsProvider, Skeleton, Slider, SlotField, Sparkle, Stat, StatusPill, Switch, Table, Td, Textarea, Th, Thumb, ToggleGroup, ToggleItem, Tooltip, TooltipProvider, TooltipScope, Tr, TrayMeta, TrayMore, UNDO_STEPS, actionTrayClass, apiName, arrangeFields, arrayMove, avatarRingSpread, badgeVariants, blockDefToSchema, buttonFromProd, buttonToProd, buttonVariants, cn, codeFromProd, codeToProd, colorFor, controls_exports as controls, conventionalHelp, cropPreset, cropRect, crumbSignature, dateFromProd, dateToProd, datetimeFromProd, datetimeToProd, defaultGroup, fieldAccessOf, fieldDefToSchema, fieldDefsToSchema, filterOptions, fitsSegmented, frameContext, frameDirection, framesToCrumbs, fromTypeSchema, groupSummary, iconButtonVariants, imageFromProd, imageToProd, inferField, initials, isBreakpointName, isDockIcon, isDrillable, isShort, kitPathItems, leafValuePlan, linkFromProd, linkToProd, listFromProd, listToProd, matchPositions, matchScore, nodeText, parentOfField, parentTitleOf, plainOf, planFromProd, planToProd, presenceColor, presenceSlot, prod_types_exports as prod, propDefToField, propsToTypeSchema, ratingFromProd, ratingToProd, referenceFromProd, referenceToProd, registerKitControls, registerKitServices, registerPresenceRoster, relTime, resetFieldClipboard, resolveFieldAccess, resolveFrames, resolveHelp, rootFrame, rowToggleField, scaleFromProd, scaleToProd, seesDevSurfaces, selectTriggerClass, shortcutHintsOn, statusMap, tableFromProd, tableToProd, tagsFromProd, tagsToProd, titleFromKey, toTypeSchema, useAvailableBlocks, useDragReorder, useDrill, useFieldAccess, useFieldDescribedBy, useFieldId, useFieldLabelledBy, useFocusReturn, useForm, useFrameNavigation, useFrameSlots, useGroupStatus, useInsetDepth, useKitEnv, useKitServices, useListOps, useRhythm, useSharedSort, useShortcutHints, videoFromProd, videoToProd, visibleFields, visibleSchema, withDefaultHelp, zoneListFromProd, zoneListToProd };
|
|
54
|
-
|
|
55
|
-
//# sourceMappingURL=index.js.map
|
package/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/kit/index.ts"],"sourcesContent":["/**\n * @bettercms-ai/kit entry point (in-app: \"@/kit\"). Importing it loads kit.css, whose tokens apply only\n * inside [data-kit-scope].\n *\n * scale.ts, table.ts and lib/utils.ts each export their own `formatNumber`, so they are not re-exported\n * here: import them by path (\"@/kit/schema/scale\", \"@/kit/schema/table\", \"@/kit/lib/utils\").\n */\nimport \"./kit.css\";\nimport { registerKitControls } from \"./controls\";\n\nexport * from \"./schema/types\";\nexport * from \"./schema/sources\";\nexport * from \"./schema/help\";\nexport * from \"./schema/adapters\";\nexport { cn } from \"./lib/cn\";\nexport * from \"./ui\";\n\n/* the form engine, its runtime contexts, and the V2 ↔ prod schema and value adapters */\nexport * from \"./context\";\nexport type { ControlProps } from \"./types\";\nexport * from \"./engine/schema-form\";\nexport * from \"./engine/kit-field\";\nexport * from \"./engine/field-shell\";\nexport * from \"./engine/bits\";\nexport * from \"./engine/group-summary\";\n/* layout (grouping.tsx's FieldList takes `renderField`; the engine's FieldList is field-list's, drawing KitField) */\nexport {\n RHYTHM, useRhythm, InsetScope, useInsetDepth, useGroupStatus, Appear, AnimatedFields, FieldSection, FieldInset, FieldUnit, FieldUnitRow,\n isBreakpointName, BreakpointGroup, arrangeFields, defaultGroup, GroupTabs, FieldsetSection, isShort,\n type GroupStatus, type RenderField, type GroupTabItem, type FieldSectionProps,\n} from \"./engine/grouping\";\nexport * from \"./engine/field-list\";\nexport * from \"./engine/array\";\nexport * from \"./engine/item-list\";\nexport * from \"./engine/slot\";\nexport {\n FrameSlotsProvider, useFrameSlots, FrameView, frameContext, FrameHeader, HistoryView, parentOfField, parentTitleOf, frameDirection,\n useFrameNavigation, FrameStage, type FrameFieldListProps, type FrameSlots,\n} from \"./engine/frame\";\nexport * from \"./engine/breadcrumb\";\nexport { resolveFrames, rootFrame, isDrillable, type Frame } from \"./lib/frames\";\nexport * from \"./adapters/schema\";\nexport * from \"./adapters/values\";\n/* the prod model's names (Fieldset, OpenMode, ScaleUnit, SelectOption) collide with the kit's own, so they live under `prod` */\nexport * as prod from \"./adapters/prod-types\";\nexport type { LossyFeature } from \"./adapters/lossy\";\n\n/* controls: each register file adds its types to the engine's dispatch tables (one import per lane file) */\nimport \"./controls/date-register\";\nimport \"./controls/icon-register\";\nimport \"./controls/code-register\";\nimport \"./controls/json-register\";\nimport \"./controls/location-register\";\nimport \"./controls/media-register\";\nimport \"./controls/reference-register\";\nimport \"./controls/form-picker-register\";\nimport \"./controls/slot-register\";\nimport \"./controls/rich-text\";\nimport \"./controls/table\";\n/* the ported controls: registered once here, so any host that loads the kit draws them instead of its legacy control.\n Their helpers keep short names (str, toNum…), so they live under `controls`. */\nexport * as controls from \"./controls\";\nexport { registerKitControls };\nregisterKitControls();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,qBAAqB"}
|
package/lib/cn.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cn.js","names":[],"sources":["../../src/kit/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/** Merge Tailwind classes; our custom text sizes (2xs..3xl) are registered so twMerge\n * doesn't confuse `text-sm` (size) with `text-fg-2` (color). */\nimport { extendTailwindMerge } from \"tailwind-merge\";\nconst merge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [{ text: [\"2xs\", \"xs\", \"sm\", \"base\", \"md\", \"lg\", \"xl\", \"2xl\", \"3xl\", \"kit-2xs\", \"kit-xs\", \"kit-sm\", \"kit-base\", \"kit-md\", \"kit-lg\", \"kit-xl\", \"kit-2xl\", \"kit-3xl\"] }],\n // Kit shadow and radius tokens (src/kit/kit.css @theme, namespaced \"kit-\"). Without this twMerge reads\n // `shadow-kit-md` as a shadow COLOUR and keeps it next to `shadow-none`, so a variant could no longer\n // override the base shadow; `rounded-kit-md` would not conflict with `rounded-none` either.\n shadow: [{ shadow: [\"kit-xs\", \"kit-sm\", \"kit-md\", \"kit-lg\", \"kit-xl\", \"kit-canvas-frame\", \"kit-device\", \"kit-field\", \"kit-ring-field\"] }],\n rounded: [{ rounded: [\"kit-xs\", \"kit-sm\", \"kit-md\", \"kit-lg\", \"kit-xl\", \"kit-2xl\"] }],\n },\n },\n});\nexport function cn(...inputs: ClassValue[]) {\n return merge(clsx(inputs));\n}\nexport { twMerge };\n"],"mappings":";;;;;AAMA,IAAM,QAAQ,oBAAoB,EAChC,QAAQ,EACN,aAAa;CACX,aAAa,CAAC,EAAE,MAAM;EAAC;EAAO;EAAM;EAAM;EAAQ;EAAM;EAAM;EAAM;EAAO;EAAO;EAAW;EAAU;EAAU;EAAY;EAAU;EAAU;EAAU;EAAW;EAAU,EAAE,CAAC;CAInL,QAAQ,CAAC,EAAE,QAAQ;EAAC;EAAU;EAAU;EAAU;EAAU;EAAU;EAAoB;EAAc;EAAa;EAAiB,EAAE,CAAC;CACzI,SAAS,CAAC,EAAE,SAAS;EAAC;EAAU;EAAU;EAAU;EAAU;EAAU;EAAU,EAAE,CAAC;CACtF,EACF,EACF,CAAC;AACF,SAAgB,GAAG,GAAG,QAAsB;AAC1C,QAAO,MAAM,KAAK,OAAO,CAAC"}
|
package/lib/columns.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"columns.js","names":[],"sources":["../../src/kit/lib/columns.ts"],"sourcesContent":["/**\n * COLUMNS (CPO D63; V2 HEAD c896beb kit/lib/columns.ts) — the one rule for putting fields side by side, shared by every\n * host (sections, insets, array rows). Pure, no React.\n *\n * A field may sit in a column only when its value is genuinely short. The layout also needs room: `FieldRun` turns two-up\n * only when the form is at least 420px wide (a container query), so the 300 to 380px inspector is always one column.\n */\nimport type { FieldSchema } from \"../schema/types\";\n\n/** Text longer than this never sits in a column. */\nexport const SHORT_TEXT_MAX = 24;\n\n/** Long text, rich text, lists, media, links, references, buttons, tables and objects are always full width. */\nexport function isColumnField(f: FieldSchema): boolean {\n switch (f.type) {\n case \"number\":\n return !f.scale && f.layout !== \"slider\"; // a scale needs the full row (D41)\n case \"boolean\": case \"date\": case \"color\": case \"icon\": case \"rating\":\n return true;\n case \"select\":\n return f.layout !== \"cards\" && f.layout !== \"radio\";\n case \"string\":\n return (f.validation?.max ?? Infinity) <= SHORT_TEXT_MAX;\n default:\n return false;\n }\n}\n/** Pairs neighbouring column fields; a column field with no short neighbour spans the full row. true = half width. */\nexport function columnSpans(fields: FieldSchema[]): boolean[] {\n const out = fields.map(() => false);\n for (let i = 0; i < fields.length - 1; i++) {\n if (isColumnField(fields[i]) && isColumnField(fields[i + 1])) {\n out[i] = out[i + 1] = true;\n i++;\n }\n }\n return out;\n}\n"],"mappings":";AAaA,SAAgB,cAAc,GAAyB;AACrD,SAAQ,EAAE,MAAV;EACE,KAAK,SACH,QAAO,CAAC,EAAE,SAAS,EAAE,WAAW;EAClC,KAAK;EAAW,KAAK;EAAQ,KAAK;EAAS,KAAK;EAAQ,KAAK,SAC3D,QAAO;EACT,KAAK,SACH,QAAO,EAAE,WAAW,WAAW,EAAE,WAAW;EAC9C,KAAK,SACH,SAAQ,EAAE,YAAY,OAAO,aAAA;EAC/B,QACE,QAAO;;;;AAIb,SAAgB,YAAY,QAAkC;CAC5D,MAAM,MAAM,OAAO,UAAU,MAAM;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,IACrC,KAAI,cAAc,OAAO,GAAG,IAAI,cAAc,OAAO,IAAI,GAAG,EAAE;AAC5D,MAAI,KAAK,IAAI,IAAI,KAAK;AACtB;;AAGJ,QAAO"}
|
package/lib/frames.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frames.js","names":[],"sources":["../../src/kit/lib/frames.ts"],"sourcesContent":["/**\n * NAVIGATION MODEL — a path resolves to a STACK OF FRAMES (one per breadcrumb). The last frame is what the\n * panel shows. Drillable nodes: object fields (drill mode), array items, slot children (blocks), button fields\n * (the one button screen) and \"@history\" (a field's versions as a stacked panel).\n */\nimport { HISTORY_SEGMENT, type Crumb, type FieldGroup, type FieldPath, type FieldSchema, type Fieldset, type TypeSchema } from \"../schema/types\";\nimport { cellText, isTableValue, normalizeTable } from \"../schema/table\";\nimport { getIn, isObj } from \"./path\";\nimport { isPrimitive, itemSchemaFor, previewOf } from \"./schema\";\n\nexport interface Frame {\n path: FieldPath;\n kind: Crumb[\"kind\"];\n title: string;\n icon?: string;\n fields: FieldSchema[];\n fieldsets?: Fieldset[];\n groups?: FieldGroup[];\n /** the field that owns this frame (object / array / slot / button / history target) */\n field?: FieldSchema;\n /** array items and slot children */\n item?: {\n arrayPath: FieldPath;\n index: number;\n count: number;\n itemSchema?: FieldSchema;\n block?: TypeSchema;\n slotField?: FieldSchema;\n /** the title of sibling `i` (table rows and columns, whose items have no schema to preview) */\n titleAt?: (i: number) => string;\n };\n}\n\nexport function rootFrame(schema: TypeSchema): Frame {\n return { path: [], kind: \"root\", title: schema.title, icon: schema.icon, fields: schema.fields, fieldsets: schema.fieldsets, groups: schema.groups };\n}\n\n/** Resolve `path` into frames. Stops at the first segment that doesn't resolve (returns the valid prefix). */\nexport function resolveFrames(\n schema: TypeSchema,\n value: unknown,\n path: FieldPath,\n resolveSchema?: (t: string) => TypeSchema | undefined,\n): { frames: Frame[]; path: FieldPath } {\n const frames: Frame[] = [rootFrame(schema)];\n let fields = schema.fields;\n let i = 0;\n while (i < path.length) {\n const seg = path[i];\n if (typeof seg !== \"string\") break;\n const f = fields.find((x) => x.name === seg);\n if (!f) break;\n const here = path.slice(0, i + 1);\n if (path[i + 1] === HISTORY_SEGMENT) {\n frames.push({ path: [...here, HISTORY_SEGMENT], kind: \"history\", title: \"History\", icon: \"clock\", fields: [f], field: f });\n i += 2;\n break;\n }\n if (f.type === \"object\" && f.fields) {\n frames.push({ path: here, kind: \"object\", title: f.title, icon: f.icon, fields: f.fields, field: f });\n fields = f.fields;\n i += 1;\n continue;\n }\n if (f.type === \"button\") {\n frames.push({ path: here, kind: \"button\", title: f.title, icon: \"click\", fields: [f], field: f });\n i += 1;\n // a button screen is a leaf, except for its own history\n if (path[i] === HISTORY_SEGMENT) {\n frames.push({ path: [...here, HISTORY_SEGMENT], kind: \"history\", title: \"History\", icon: \"clock\", fields: [f], field: f });\n i += 1;\n }\n break;\n }\n /* D50: a table's rows and columns drill like array items. A row inside a row group gets the group as a crumb\n (its path is the table field, which resolves back to the frame that shows the table). */\n if (f.type === \"table\" && (path[i + 1] === \"rows\" || path[i + 1] === \"columns\") && typeof path[i + 2] === \"number\") {\n const raw = getIn(value, here);\n if (!isTableValue(raw)) break;\n const t = normalizeTable(raw);\n const idx = path[i + 2] as number;\n const arrayPath = [...here, path[i + 1]];\n if (path[i + 1] === \"rows\") {\n const row = t.rows[idx];\n if (!row) break;\n const group = row.group && !row.footer ? t.rowGroups?.find((g) => g._key === row.group) : undefined;\n if (group) frames.push({ path: here, kind: \"tableGroup\", title: group.label || \"Untitled group\", icon: \"folder\", fields: [], field: f });\n const first = t.columns[0];\n const titleAt = (j: number) => {\n const r = t.rows[j];\n return (r && first && cellText(first, r, r.cells[first._key])) || \"Untitled row\";\n };\n frames.push({\n path: [...arrayPath, idx], kind: \"tableRow\", title: titleAt(idx), icon: \"list\", fields: [], field: f,\n item: { arrayPath, index: idx, count: t.rows.length, itemSchema: { name: \"row\", title: \"Row\", type: \"object\" }, titleAt },\n });\n } else {\n const col = t.columns[idx];\n if (!col) break;\n const titleAt = (j: number) => t.columns[j]?.label || \"Untitled column\";\n frames.push({\n path: [...arrayPath, idx], kind: \"tableColumn\", title: titleAt(idx), icon: \"layout-columns\", fields: [], field: f,\n item: { arrayPath, index: idx, count: t.columns.length, itemSchema: { name: \"column\", title: \"Column\", type: \"object\" }, titleAt },\n });\n }\n i += 3;\n break;\n }\n if ((f.type === \"array\" || f.type === \"slot\") && typeof path[i + 1] === \"number\") {\n const idx = path[i + 1] as number;\n const list = getIn(value, here);\n const items = Array.isArray(list) ? list : [];\n const item = items[idx];\n if (item === undefined) break;\n const itemPath = [...here, idx];\n if (f.type === \"array\") {\n const s = itemSchemaFor(f, item);\n if (!s || isPrimitive(s.type) || !s.fields) break;\n const pv = previewOf(s, item, idx);\n frames.push({\n path: itemPath, kind: \"item\", title: pv.title, icon: s.icon ?? f.icon, fields: s.fields, field: f,\n item: { arrayPath: here, index: idx, count: items.length, itemSchema: s },\n });\n fields = s.fields;\n } else {\n const type = isObj(item) && typeof item._type === \"string\" ? item._type : \"\";\n const block = resolveSchema?.(type);\n if (!block) break;\n const pv = previewOf(block, item, idx, block.title);\n frames.push({\n path: itemPath, kind: \"block\", title: pv.empty ? block.title : pv.title, icon: block.icon, fields: block.fields,\n fieldsets: block.fieldsets, groups: block.groups, field: f,\n item: { arrayPath: here, index: idx, count: items.length, block, slotField: f },\n });\n fields = block.fields;\n }\n i += 2;\n continue;\n }\n break;\n }\n return { frames, path: frames.length > 1 ? frames[frames.length - 1].path : [] };\n}\n\n/** Can this field be opened as its own frame (drill target)? */\nexport const isDrillable = (f: FieldSchema) => f.type === \"object\" || f.type === \"button\";\n"],"mappings":"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"}
|
package/lib/icons.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","names":[],"sources":["../../src/kit/lib/icons.tsx"],"sourcesContent":["/**\n * Icon names in schemas are kebab-case Tabler names (\"help-circle\", \"layout-grid\"). Catalog data still\n * carries lucide-style names (\"CircleHelp\", \"LayoutGrid\"); `kitIcon()` resolves both.\n * The curated set doubles as the icon picker's library (explicit imports keep the bundle small).\n */\nimport {\n IconAlertTriangle, IconAppWindow, IconArrowRight, IconArrowUpRight, IconAward, IconBadge, IconBolt, IconBook, IconBookmark,\n IconBox, IconBrandInstagram, IconBriefcase, IconBuildingStore, IconBulb, IconCalendar, IconCamera, IconCampfire, IconCards,\n IconChartBar, IconChartPie, IconCheck, IconChefHat, IconCircleCheck, IconClick, IconClock, IconCloud, IconCode, IconColumns2,\n IconColumns3, IconCompass, IconCreditCard, IconCurrencyDollar, IconDeviceMobile, IconDiamond, IconDownload, IconFeather,\n IconFile, IconFileText, IconFilter, IconFlag, IconFlame, IconForms, IconGift, IconGlobe, IconHeart, IconHelpCircle, IconHome,\n IconInfoCircle, IconKey, IconLayoutBottombar, IconLayoutCards, IconLayoutGrid, IconLayoutNavbar, IconLayoutSidebar,\n IconLayoutList, IconLeaf, IconLibraryPhoto, IconLink, IconList, IconListDetails, IconLock, IconMail, IconMap, IconMapPin,\n IconMenu2, IconMessage, IconMessage2, IconMoon, IconMountain, IconMovie, IconNews, IconPackage, IconPalette, IconPhoto,\n IconPlayerPlay, IconPlug, IconPresentation, IconPuzzle, IconQuote, IconRecycle, IconRocket, IconRuler, IconSearch, IconSeo,\n IconSettings, IconShieldCheck, IconShoppingBag, IconShoppingCart, IconSparkles, IconSpeakerphone, IconStack2, IconStar,\n IconSun, IconTable, IconTag, IconTags, IconTarget, IconTemplate, IconTent, IconTool, IconTools, IconTruck, IconTypography,\n IconUser, IconUsers, IconUsersGroup, IconVideo, IconWorld, IconSquareRoundedPlus, IconLayoutDashboard, IconAdjustments,\n IconLayoutColumns, IconSection, IconCategory, IconToggleLeft, IconCursorText, IconBrandYoutube, IconFolder, IconClipboardList,\n type Icon,\n} from \"@tabler/icons-react\";\n\nexport const KIT_ICONS: Record<string, Icon> = {\n \"alert-triangle\": IconAlertTriangle, \"app-window\": IconAppWindow, \"arrow-right\": IconArrowRight, \"arrow-up-right\": IconArrowUpRight,\n award: IconAward, badge: IconBadge, bolt: IconBolt, book: IconBook, bookmark: IconBookmark, box: IconBox, instagram: IconBrandInstagram,\n briefcase: IconBriefcase, store: IconBuildingStore, bulb: IconBulb, calendar: IconCalendar, camera: IconCamera, campfire: IconCampfire,\n cards: IconCards, \"chart-bar\": IconChartBar, \"chart-pie\": IconChartPie, check: IconCheck, \"chef-hat\": IconChefHat,\n \"circle-check\": IconCircleCheck, click: IconClick, clock: IconClock, cloud: IconCloud, code: IconCode, \"columns-2\": IconColumns2,\n \"columns-3\": IconColumns3, compass: IconCompass, \"credit-card\": IconCreditCard, \"currency-dollar\": IconCurrencyDollar,\n \"device-mobile\": IconDeviceMobile, diamond: IconDiamond, download: IconDownload, feather: IconFeather, file: IconFile,\n \"file-text\": IconFileText, filter: IconFilter, flag: IconFlag, flame: IconFlame, forms: IconForms, gift: IconGift, globe: IconGlobe,\n heart: IconHeart, \"help-circle\": IconHelpCircle, home: IconHome, \"info-circle\": IconInfoCircle, key: IconKey,\n \"layout-bottombar\": IconLayoutBottombar, \"layout-cards\": IconLayoutCards, \"layout-grid\": IconLayoutGrid, \"layout-navbar\": IconLayoutNavbar,\n \"layout-sidebar\": IconLayoutSidebar, \"layout-list\": IconLayoutList, leaf: IconLeaf, \"library-photo\": IconLibraryPhoto, link: IconLink,\n list: IconList, \"list-details\": IconListDetails, lock: IconLock, mail: IconMail, map: IconMap, \"map-pin\": IconMapPin, menu: IconMenu2,\n message: IconMessage, \"message-2\": IconMessage2, moon: IconMoon, mountain: IconMountain, movie: IconMovie, news: IconNews,\n package: IconPackage, palette: IconPalette, photo: IconPhoto, \"player-play\": IconPlayerPlay, plug: IconPlug, presentation: IconPresentation,\n puzzle: IconPuzzle, quote: IconQuote, recycle: IconRecycle, rocket: IconRocket, ruler: IconRuler, search: IconSearch, seo: IconSeo,\n settings: IconSettings, \"shield-check\": IconShieldCheck, \"shopping-bag\": IconShoppingBag, \"shopping-cart\": IconShoppingCart,\n sparkles: IconSparkles, speakerphone: IconSpeakerphone, stack: IconStack2, star: IconStar, sun: IconSun, table: IconTable, tag: IconTag,\n tags: IconTags, target: IconTarget, template: IconTemplate, tent: IconTent, tool: IconTool, tools: IconTools, truck: IconTruck,\n typography: IconTypography, user: IconUser, users: IconUsers, \"users-group\": IconUsersGroup, video: IconVideo, world: IconWorld,\n \"square-plus\": IconSquareRoundedPlus, \"layout-dashboard\": IconLayoutDashboard, adjustments: IconAdjustments,\n \"layout-columns\": IconLayoutColumns, section: IconSection, category: IconCategory, toggle: IconToggleLeft, \"cursor-text\": IconCursorText,\n youtube: IconBrandYoutube, folder: IconFolder, \"clipboard-list\": IconClipboardList,\n};\n\n/** lucide-style names used by seed/catalog data → our kebab keys. */\nconst ALIASES: Record<string, string> = {\n \"circle-help\": \"help-circle\", megaphone: \"speakerphone\", \"panel-top\": \"layout-navbar\", \"panel-bottom\": \"layout-bottombar\",\n \"layout-template\": \"template\", \"bar-chart-3\": \"chart-bar\", \"badge-dollar-sign\": \"currency-dollar\", newspaper: \"news\",\n \"mouse-pointer-click\": \"click\", images: \"library-photo\", \"message-square-text\": \"message-2\", type: \"typography\",\n \"shield-check\": \"shield-check\", \"shopping-bag\": \"shopping-bag\", \"columns-2\": \"columns-2\", \"layout-grid\": \"layout-grid\",\n \"help-circle\": \"help-circle\", sparkle: \"sparkles\",\n};\n\nconst kebab = (s: string) =>\n s.replace(/^Icon/, \"\").replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\").replace(/[_\\s]+/g, \"-\").toLowerCase();\n\nexport function iconKey(name?: string): string | undefined {\n if (!name) return undefined;\n const k = kebab(name);\n if (KIT_ICONS[k]) return k;\n const a = ALIASES[k];\n return a && KIT_ICONS[a] ? a : undefined;\n}\n\n/** Render a schema icon by name. Falls back to `fallback` (default: a neutral square). */\nexport function KitIcon({ name, className, fallback = \"box\" }: { name?: string; className?: string; fallback?: string }) {\n const I = KIT_ICONS[iconKey(name) ?? fallback] ?? IconBox;\n return <I className={className} stroke={1.5} aria-hidden />;\n}\n\n/** Human label for an icon key: \"help-circle\" → \"Help circle\". */\nexport const iconLabel = (k: string) => (k.charAt(0).toUpperCase() + k.slice(1)).replace(/-/g, \" \");\n"],"mappings":"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"}
|