@bettercms-ai/kit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/{adapters → dist/adapters}/icons.js +2 -2
- package/dist/adapters/icons.js.map +1 -0
- package/{adapters → dist/adapters}/lossy.d.ts +90 -31
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
- package/{adapters → dist/adapters}/prod-types.js +71 -3
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +996 -179
- package/dist/adapters/schema.js.map +1 -0
- package/{adapters → dist/adapters}/values.d.ts +26 -5
- package/{adapters → dist/adapters}/values.js +87 -17
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/{context.d.ts → dist/context.d.ts} +92 -2
- package/{context.js → dist/context.js} +5 -2
- package/dist/context.js.map +1 -0
- package/{controls → dist/controls}/button.d.ts +19 -5
- package/{controls → dist/controls}/button.js +125 -54
- package/dist/controls/button.js.map +1 -0
- package/{controls → dist/controls}/c1.js +1 -1
- package/dist/controls/c1.js.map +1 -0
- package/{controls → dist/controls}/c2.js +1 -1
- package/dist/controls/c2.js.map +1 -0
- package/{controls → dist/controls}/choice.d.ts +7 -2
- package/{controls → dist/controls}/choice.js +71 -18
- package/dist/controls/choice.js.map +1 -0
- package/{controls → dist/controls}/code-register.js +1 -1
- package/dist/controls/code-register.js.map +1 -0
- package/{controls → dist/controls}/code.js +10 -9
- package/dist/controls/code.js.map +1 -0
- package/{controls → dist/controls}/color.js +8 -8
- package/dist/controls/color.js.map +1 -0
- package/{controls → dist/controls}/component-services.d.ts +42 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/{controls → dist/controls}/date-register.js +1 -1
- package/dist/controls/date-register.js.map +1 -0
- package/{controls → dist/controls}/date-zone.js +8 -2
- package/dist/controls/date-zone.js.map +1 -0
- package/{controls → dist/controls}/date.js +32 -24
- package/dist/controls/date.js.map +1 -0
- package/{controls → dist/controls}/form-picker-register.js +1 -1
- package/dist/controls/form-picker-register.js.map +1 -0
- package/{controls → dist/controls}/form-picker.js +11 -9
- package/dist/controls/form-picker.js.map +1 -0
- package/{controls → dist/controls}/icon-register.js +1 -1
- package/dist/controls/icon-register.js.map +1 -0
- package/{controls → dist/controls}/icon.d.ts +4 -2
- package/{controls → dist/controls}/icon.js +32 -27
- package/dist/controls/icon.js.map +1 -0
- package/{controls → dist/controls}/index.d.ts +1 -1
- package/{controls → dist/controls}/index.js +4 -3
- package/dist/controls/index.js.map +1 -0
- package/{controls → dist/controls}/json-register.js +1 -1
- package/dist/controls/json-register.js.map +1 -0
- package/{controls → dist/controls}/json.js +13 -3
- package/dist/controls/json.js.map +1 -0
- package/{controls → dist/controls}/link.js +6 -6
- package/dist/controls/link.js.map +1 -0
- package/{controls → dist/controls}/location-register.js +1 -1
- package/dist/controls/location-register.js.map +1 -0
- package/{controls → dist/controls}/location.js +64 -40
- package/dist/controls/location.js.map +1 -0
- package/{controls → dist/controls}/media-register.js +1 -1
- package/dist/controls/media-register.js.map +1 -0
- package/{controls → dist/controls}/media-services.d.ts +6 -0
- package/dist/controls/media-services.js +0 -0
- package/{controls → dist/controls}/media.d.ts +35 -4
- package/{controls → dist/controls}/media.js +491 -171
- package/dist/controls/media.js.map +1 -0
- package/{controls → dist/controls}/number.js +10 -9
- package/dist/controls/number.js.map +1 -0
- package/{controls → dist/controls}/reference-register.js +1 -1
- package/dist/controls/reference-register.js.map +1 -0
- package/{controls → dist/controls}/reference-services.d.ts +4 -0
- package/dist/controls/reference-services.js +0 -0
- package/{controls → dist/controls}/reference.d.ts +1 -1
- package/{controls → dist/controls}/reference.js +93 -77
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/{controls → dist/controls}/rich-text/blocks.js +471 -144
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
- package/{controls → dist/controls}/rich-text/catalog.js +75 -65
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +3 -1
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
- package/{controls → dist/controls}/rich-text/component-card.js +417 -99
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
- package/{controls → dist/controls}/rich-text/control.js +84 -42
- package/dist/controls/rich-text/control.js.map +1 -0
- package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
- package/{controls → dist/controls}/rich-text/dom.js +379 -50
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
- package/{controls → dist/controls}/rich-text/editor.js +148 -48
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
- package/{controls → dist/controls}/rich-text/floating.js +35 -18
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/{controls → dist/controls}/rich-text/index.js +1 -1
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/{controls → dist/controls}/rich-text/markdown.js +4 -2
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/{controls → dist/controls}/rich-text/ops.js +17 -15
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
- package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/{controls → dist/controls}/scale.js +5 -5
- package/dist/controls/scale.js.map +1 -0
- package/{controls → dist/controls}/slot-register.js +1 -1
- package/dist/controls/slot-register.js.map +1 -0
- package/{controls → dist/controls}/slot-services.d.ts +25 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/{controls → dist/controls}/slot.js +42 -24
- package/dist/controls/slot.js.map +1 -0
- package/{controls → dist/controls}/table/index.js +1 -1
- package/dist/controls/table/index.js.map +1 -0
- package/{controls → dist/controls}/table/prod.js +3 -3
- package/dist/controls/table/prod.js.map +1 -0
- package/{controls → dist/controls}/table/refs.js +13 -2
- package/dist/controls/table/refs.js.map +1 -0
- package/{controls → dist/controls}/table/stored.js +1 -1
- package/dist/controls/table/stored.js.map +1 -0
- package/{controls → dist/controls}/table/table-editor.js +51 -48
- package/dist/controls/table/table-editor.js.map +1 -0
- package/{controls → dist/controls}/table/table-link.js +3 -3
- package/dist/controls/table/table-link.js.map +1 -0
- package/{controls → dist/controls}/table/table.js +3 -3
- package/dist/controls/table/table.js.map +1 -0
- package/{controls → dist/controls}/text.d.ts +2 -2
- package/{controls → dist/controls}/text.js +78 -43
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/{engine → dist/engine}/array.js +34 -21
- package/dist/engine/array.js.map +1 -0
- package/{engine → dist/engine}/bits.js +1 -1
- package/dist/engine/bits.js.map +1 -0
- package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
- package/{engine → dist/engine}/breadcrumb.js +12 -36
- package/dist/engine/breadcrumb.js.map +1 -0
- package/{engine → dist/engine}/expand.d.ts +2 -4
- package/{engine → dist/engine}/expand.js +5 -22
- package/dist/engine/expand.js.map +1 -0
- package/{engine → dist/engine}/field-list.js +1 -1
- package/dist/engine/field-list.js.map +1 -0
- package/{engine → dist/engine}/field-shell.js +249 -121
- package/dist/engine/field-shell.js.map +1 -0
- package/{engine → dist/engine}/frame.d.ts +3 -1
- package/{engine → dist/engine}/frame.js +16 -14
- package/dist/engine/frame.js.map +1 -0
- package/{engine → dist/engine}/group-summary.d.ts +2 -1
- package/{engine → dist/engine}/group-summary.js +7 -3
- package/dist/engine/group-summary.js.map +1 -0
- package/{engine → dist/engine}/grouping.d.ts +19 -5
- package/{engine → dist/engine}/grouping.js +193 -21
- package/dist/engine/grouping.js.map +1 -0
- package/{engine → dist/engine}/item-list.d.ts +11 -1
- package/{engine → dist/engine}/item-list.js +35 -13
- package/dist/engine/item-list.js.map +1 -0
- package/{engine → dist/engine}/kit-field.js +45 -10
- package/dist/engine/kit-field.js.map +1 -0
- package/{engine → dist/engine}/schema-form.d.ts +27 -2
- package/{engine → dist/engine}/schema-form.js +182 -40
- package/dist/engine/schema-form.js.map +1 -0
- package/{engine → dist/engine}/slot.js +5 -15
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/{kit.css → dist/kit.css} +19 -0
- package/{lib → dist/lib}/cn.js +7 -4
- package/dist/lib/cn.js.map +1 -0
- package/{lib → dist/lib}/columns.js +4 -1
- package/dist/lib/columns.js.map +1 -0
- package/{lib → dist/lib}/frames.js +2 -2
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/{lib → dist/lib}/icons.js +4 -3
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/{lib → dist/lib}/path.js +4 -2
- package/dist/lib/path.js.map +1 -0
- package/{lib → dist/lib}/schema.d.ts +34 -3
- package/{lib → dist/lib}/schema.js +110 -13
- package/dist/lib/schema.js.map +1 -0
- package/{lib → dist/lib}/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -0
- package/{lib → dist/lib}/validate.d.ts +11 -1
- package/{lib → dist/lib}/validate.js +85 -11
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/{schema → dist/schema}/adapters.js +1 -2
- package/dist/schema/adapters.js.map +1 -0
- package/{schema → dist/schema}/help.d.ts +2 -0
- package/{schema → dist/schema}/help.js +6 -4
- package/dist/schema/help.js.map +1 -0
- package/{schema → dist/schema}/scale.js +1 -1
- package/dist/schema/scale.js.map +1 -0
- package/{schema → dist/schema}/sources.js +1 -1
- package/dist/schema/sources.js.map +1 -0
- package/{schema → dist/schema}/table.js +11 -10
- package/dist/schema/table.js.map +1 -0
- package/{schema → dist/schema}/types.d.ts +29 -1
- package/{schema → dist/schema}/types.js +1 -1
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +22 -0
- package/dist/theme.js +43 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.js +0 -0
- package/{ui → dist/ui}/action-tray.d.ts +1 -1
- package/{ui → dist/ui}/action-tray.js +20 -19
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +6 -7
- package/dist/ui/button.js.map +1 -0
- package/{ui → dist/ui}/choice-switch.js +1 -1
- package/dist/ui/choice-switch.js.map +1 -0
- package/{ui → dist/ui}/controls.js +51 -39
- package/dist/ui/controls.js.map +1 -0
- package/{ui → dist/ui}/display.d.ts +10 -3
- package/{ui → dist/ui}/display.js +57 -46
- package/dist/ui/display.js.map +1 -0
- package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
- package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/{ui → dist/ui}/field-context.js +1 -1
- package/dist/ui/field-context.js.map +1 -0
- package/{ui → dist/ui}/floating-panel.d.ts +1 -1
- package/{ui → dist/ui}/floating-panel.js +28 -12
- package/dist/ui/floating-panel.js.map +1 -0
- package/{ui → dist/ui}/index.d.ts +4 -0
- package/dist/ui/index.js +18 -0
- package/{ui → dist/ui}/input.d.ts +1 -1
- package/{ui → dist/ui}/input.js +9 -9
- package/dist/ui/input.js.map +1 -0
- package/{ui → dist/ui}/mode-bar.js +3 -3
- package/dist/ui/mode-bar.js.map +1 -0
- package/{ui → dist/ui}/overlay.d.ts +77 -5
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/{ui → dist/ui}/path-crumbs.js +37 -3
- package/dist/ui/path-crumbs.js.map +1 -0
- package/{ui → dist/ui}/presence.js +2 -2
- package/dist/ui/presence.js.map +1 -0
- package/{ui → dist/ui}/select.js +89 -87
- package/dist/ui/select.js.map +1 -0
- package/{ui → dist/ui}/shortcut-hint.js +1 -1
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/{ui → dist/ui}/surfaces.js +1 -1
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
- package/{ui → dist/ui}/tooltip-root.js +9 -8
- package/dist/ui/tooltip-root.js.map +1 -0
- package/{ui → dist/ui}/variants.js +1 -1
- package/dist/ui/variants.js.map +1 -0
- package/package.json +77 -23
- package/adapters/icons.js.map +0 -1
- package/adapters/lossy.js +0 -233
- package/adapters/lossy.js.map +0 -1
- package/adapters/prod-types.js.map +0 -1
- package/adapters/schema.js.map +0 -1
- package/adapters/values.js.map +0 -1
- package/brand/logo.js +0 -9
- package/brand/logo.js.map +0 -1
- package/context.js.map +0 -1
- package/controls/button.js.map +0 -1
- package/controls/c1.js.map +0 -1
- package/controls/c2.js.map +0 -1
- package/controls/choice.js.map +0 -1
- package/controls/code-register.js.map +0 -1
- package/controls/code.js.map +0 -1
- package/controls/color.js.map +0 -1
- package/controls/date-register.js.map +0 -1
- package/controls/date-zone.js.map +0 -1
- package/controls/date.js.map +0 -1
- package/controls/form-picker-register.js.map +0 -1
- package/controls/form-picker.js.map +0 -1
- package/controls/icon-register.js.map +0 -1
- package/controls/icon.js.map +0 -1
- package/controls/index.js.map +0 -1
- package/controls/json-register.js.map +0 -1
- package/controls/json.js.map +0 -1
- package/controls/link.js.map +0 -1
- package/controls/location-register.js.map +0 -1
- package/controls/location.js.map +0 -1
- package/controls/media-register.js.map +0 -1
- package/controls/media.js.map +0 -1
- package/controls/number.js.map +0 -1
- package/controls/reference-register.js.map +0 -1
- package/controls/reference.js.map +0 -1
- package/controls/rich-text/blocks.d.ts +0 -28
- package/controls/rich-text/blocks.js.map +0 -1
- package/controls/rich-text/catalog.js.map +0 -1
- package/controls/rich-text/codec.js.map +0 -1
- package/controls/rich-text/component-card.js.map +0 -1
- package/controls/rich-text/control.js.map +0 -1
- package/controls/rich-text/dom.js.map +0 -1
- package/controls/rich-text/editor.js.map +0 -1
- package/controls/rich-text/floating.js.map +0 -1
- package/controls/rich-text/index.js.map +0 -1
- package/controls/rich-text/link-form.js +0 -111
- package/controls/rich-text/link-form.js.map +0 -1
- package/controls/rich-text/markdown.js.map +0 -1
- package/controls/rich-text/ops.js.map +0 -1
- package/controls/rich-text/toolbar.js.map +0 -1
- package/controls/scale.js.map +0 -1
- package/controls/slot-register.js.map +0 -1
- package/controls/slot-services.js +0 -38
- package/controls/slot-services.js.map +0 -1
- package/controls/slot.js.map +0 -1
- package/controls/table/index.js.map +0 -1
- package/controls/table/prod.js.map +0 -1
- package/controls/table/refs.js.map +0 -1
- package/controls/table/stored.js.map +0 -1
- package/controls/table/table-editor.js.map +0 -1
- package/controls/table/table-link.js.map +0 -1
- package/controls/table/table.js.map +0 -1
- package/controls/text.js.map +0 -1
- package/engine/array.js.map +0 -1
- package/engine/bits.js.map +0 -1
- package/engine/breadcrumb.js.map +0 -1
- package/engine/expand.js.map +0 -1
- package/engine/field-list.js.map +0 -1
- package/engine/field-shell.js.map +0 -1
- package/engine/frame.js.map +0 -1
- package/engine/group-summary.js.map +0 -1
- package/engine/grouping.js.map +0 -1
- package/engine/item-list.js.map +0 -1
- package/engine/kit-field.js.map +0 -1
- package/engine/schema-form.js.map +0 -1
- package/engine/slot.js.map +0 -1
- package/index.js +0 -55
- package/index.js.map +0 -1
- package/lib/cn.js.map +0 -1
- package/lib/columns.js.map +0 -1
- package/lib/frames.js.map +0 -1
- package/lib/icons.js.map +0 -1
- package/lib/path.js.map +0 -1
- package/lib/schema.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/lib/validate.js.map +0 -1
- package/schema/adapters.js.map +0 -1
- package/schema/help.js.map +0 -1
- package/schema/scale.js.map +0 -1
- package/schema/sources.js.map +0 -1
- package/schema/table.js.map +0 -1
- package/schema/types.js.map +0 -1
- package/ui/action-tray.js.map +0 -1
- package/ui/button.js.map +0 -1
- package/ui/choice-switch.js.map +0 -1
- package/ui/controls.js.map +0 -1
- package/ui/display.js.map +0 -1
- package/ui/expanded-editor-modal.js.map +0 -1
- package/ui/field-context.js.map +0 -1
- package/ui/floating-panel.js.map +0 -1
- package/ui/index.js +0 -13
- package/ui/input.js.map +0 -1
- package/ui/mode-bar.js.map +0 -1
- package/ui/overlay.js +0 -378
- package/ui/overlay.js.map +0 -1
- package/ui/path-crumbs.js.map +0 -1
- package/ui/presence.js.map +0 -1
- package/ui/select.js.map +0 -1
- package/ui/shortcut-hint.js.map +0 -1
- package/ui/surfaces.js.map +0 -1
- package/ui/tooltip-root.js.map +0 -1
- package/ui/variants.js.map +0 -1
- /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
- /package/{adapters → dist/adapters}/icons.d.ts +0 -0
- /package/{brand → dist/brand}/logo.d.ts +0 -0
- /package/{controls → dist/controls}/c1.d.ts +0 -0
- /package/{controls → dist/controls}/c2.d.ts +0 -0
- /package/{controls → dist/controls}/code-register.d.ts +0 -0
- /package/{controls → dist/controls}/code.d.ts +0 -0
- /package/{controls → dist/controls}/color.d.ts +0 -0
- /package/{controls → dist/controls}/date-register.d.ts +0 -0
- /package/{controls → dist/controls}/date-zone.d.ts +0 -0
- /package/{controls → dist/controls}/date.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker.d.ts +0 -0
- /package/{controls → dist/controls}/icon-register.d.ts +0 -0
- /package/{controls → dist/controls}/json-register.d.ts +0 -0
- /package/{controls → dist/controls}/json.d.ts +0 -0
- /package/{controls → dist/controls}/link.d.ts +0 -0
- /package/{controls → dist/controls}/location-register.d.ts +0 -0
- /package/{controls → dist/controls}/location.d.ts +0 -0
- /package/{controls → dist/controls}/media-register.d.ts +0 -0
- /package/{controls → dist/controls}/number.d.ts +0 -0
- /package/{controls → dist/controls}/reference-register.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
- /package/{controls → dist/controls}/scale.d.ts +0 -0
- /package/{controls → dist/controls}/slot-register.d.ts +0 -0
- /package/{controls → dist/controls}/slot.d.ts +0 -0
- /package/{controls → dist/controls}/table/index.d.ts +0 -0
- /package/{controls → dist/controls}/table/prod.d.ts +0 -0
- /package/{controls → dist/controls}/table/refs.d.ts +0 -0
- /package/{controls → dist/controls}/table/stored.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
- /package/{controls → dist/controls}/table/table.d.ts +0 -0
- /package/{engine → dist/engine}/array.d.ts +0 -0
- /package/{engine → dist/engine}/bits.d.ts +0 -0
- /package/{engine → dist/engine}/field-list.d.ts +0 -0
- /package/{engine → dist/engine}/field-shell.d.ts +0 -0
- /package/{engine → dist/engine}/kit-field.d.ts +0 -0
- /package/{engine → dist/engine}/slot.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/cn.d.ts +0 -0
- /package/{lib → dist/lib}/columns.d.ts +0 -0
- /package/{lib → dist/lib}/frames.d.ts +0 -0
- /package/{lib → dist/lib}/icons.d.ts +0 -0
- /package/{lib → dist/lib}/path.d.ts +0 -0
- /package/{lib → dist/lib}/utils.d.ts +0 -0
- /package/{schema → dist/schema}/adapters.d.ts +0 -0
- /package/{schema → dist/schema}/scale.d.ts +0 -0
- /package/{schema → dist/schema}/sources.d.ts +0 -0
- /package/{schema → dist/schema}/table.d.ts +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
- /package/{ui → dist/ui}/controls.d.ts +0 -0
- /package/{ui → dist/ui}/field-context.d.ts +0 -0
- /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
- /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
- /package/{ui → dist/ui}/presence.d.ts +0 -0
- /package/{ui → dist/ui}/select.d.ts +0 -0
- /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
- /package/{ui → dist/ui}/surfaces.d.ts +0 -0
- /package/{ui → dist/ui}/variants.d.ts +0 -0
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { DEFAULT_ENV, FormProvider, KitEnvProvider, fieldAccessOf, useForm, useKitEnv, visibleSchema } from "../context.js";
|
|
2
3
|
import { getIn, isObj, keyStartsWith, pathEq, pathKey, same, setIn } from "../lib/path.js";
|
|
3
|
-
import {
|
|
4
|
+
import { condCtx, isHidden } from "../lib/schema.js";
|
|
4
5
|
import { collectIssues } from "../lib/validate.js";
|
|
5
|
-
import { FieldSection } from "./grouping.js";
|
|
6
|
+
import { FieldList, FieldSection } from "./grouping.js";
|
|
6
7
|
import { ButtonScreen } from "../controls/button.js";
|
|
7
|
-
import { FieldList } from "./field-list.js";
|
|
8
|
+
import { FieldList as FieldList$1 } from "./field-list.js";
|
|
8
9
|
import { RowsHostContext } from "./array.js";
|
|
9
10
|
import { resolveFrames } from "../lib/frames.js";
|
|
10
11
|
import { FrameCrumbs, crumbSignature, framesToCrumbs } from "./breadcrumb.js";
|
|
11
12
|
import { FrameSlotsProvider, FrameStage, useFrameNavigation } from "./frame.js";
|
|
12
13
|
import { TableFrame } from "../controls/table/table.js";
|
|
13
|
-
import { NestedForm } from "./kit-field.js";
|
|
14
|
+
import { KitField, NestedForm } from "./kit-field.js";
|
|
14
15
|
import * as React from "react";
|
|
15
16
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
-
//#region src/
|
|
17
|
+
//#region src/engine/schema-form.tsx
|
|
17
18
|
/**
|
|
18
19
|
* <SchemaForm> — the BetterCMS Block Kit form engine (V2 HEAD 9829bf1 kit/engine/schema-form.tsx). One schema in, one
|
|
19
20
|
* value out; renders through the shared field chrome; owns validation visibility, per-field undo + history (coalesced
|
|
@@ -34,7 +35,7 @@ var HISTORY_ENTRIES = 30;
|
|
|
34
35
|
var buttonLabel = (v) => ({ label: isObj(v) && typeof v.label === "string" ? v.label : void 0 });
|
|
35
36
|
var FRAME_SLOTS = {
|
|
36
37
|
get FieldList() {
|
|
37
|
-
return FieldList;
|
|
38
|
+
return FieldList$1;
|
|
38
39
|
},
|
|
39
40
|
get FieldSection() {
|
|
40
41
|
return FieldSection;
|
|
@@ -50,13 +51,136 @@ var FRAME_SLOTS = {
|
|
|
50
51
|
var ROWS_HOST = { get NestedForm() {
|
|
51
52
|
return NestedForm;
|
|
52
53
|
} };
|
|
53
|
-
|
|
54
|
+
/** Drop archived fields at every depth (V2 registry: "What a form renders: archived fields left out (their values stay
|
|
55
|
+
* stored)"). Same object back when nothing is archived, so a form with none renders exactly as before. */
|
|
56
|
+
function liveFields(fields) {
|
|
57
|
+
let changed = false;
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const f of fields) {
|
|
60
|
+
if (f.archived) {
|
|
61
|
+
changed = true;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
let g = f;
|
|
65
|
+
if (f.fields) {
|
|
66
|
+
const n = liveFields(f.fields);
|
|
67
|
+
if (n !== f.fields) g = {
|
|
68
|
+
...g,
|
|
69
|
+
fields: n
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (Array.isArray(f.of)) {
|
|
73
|
+
const n = liveFields(f.of);
|
|
74
|
+
if (n !== f.of) g = {
|
|
75
|
+
...g,
|
|
76
|
+
of: n
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (f.slotSettings) {
|
|
80
|
+
const n = liveFields(f.slotSettings);
|
|
81
|
+
if (n !== f.slotSettings) g = {
|
|
82
|
+
...g,
|
|
83
|
+
slotSettings: n
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (g !== f) changed = true;
|
|
87
|
+
out.push(g);
|
|
88
|
+
}
|
|
89
|
+
return changed ? out : fields;
|
|
90
|
+
}
|
|
91
|
+
function liveSchema(schema) {
|
|
92
|
+
const fields = liveFields(schema.fields);
|
|
93
|
+
return fields === schema.fields ? schema : {
|
|
94
|
+
...schema,
|
|
95
|
+
fields
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
var GHOST = "__ghost";
|
|
99
|
+
var HiddenLineCtx = React.createContext(void 0);
|
|
100
|
+
/** A stand-in that keeps a hidden field's place: no value rules, no condition, nothing to validate or drill into. */
|
|
101
|
+
function ghostOf(f, why) {
|
|
102
|
+
return {
|
|
103
|
+
name: f.name,
|
|
104
|
+
title: f.title,
|
|
105
|
+
type: f.type === "object" || f.type === "array" || f.type === "slot" ? "string" : f.type,
|
|
106
|
+
fieldset: f.fieldset,
|
|
107
|
+
group: f.group,
|
|
108
|
+
readOnly: true,
|
|
109
|
+
[GHOST]: {
|
|
110
|
+
why,
|
|
111
|
+
field: f
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** `visibleSchema`, except that a field the lens can't view stays as a ghost (top level and inside objects). */
|
|
116
|
+
function lensGhosts(schema, can) {
|
|
117
|
+
const walk = (fields) => fields.map((f) => {
|
|
118
|
+
const a = fieldAccessOf(f);
|
|
119
|
+
if (a?.view && !can(a.view)) return ghostOf(f, "access");
|
|
120
|
+
return f.type === "object" && f.fields ? {
|
|
121
|
+
...f,
|
|
122
|
+
fields: walk(f.fields)
|
|
123
|
+
} : f;
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
...schema,
|
|
127
|
+
fields: walk(schema.fields)
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** The frame's field list with condition-hidden fields kept as ghosts, every ghost drawn by the host's line. */
|
|
131
|
+
function GhostFieldList(props) {
|
|
132
|
+
const form = useForm();
|
|
133
|
+
const line = React.useContext(HiddenLineCtx);
|
|
134
|
+
const raw = form.getAt(props.basePath);
|
|
135
|
+
const parent = isObj(raw) ? raw : {};
|
|
136
|
+
const cc = condCtx(form, props.basePath);
|
|
137
|
+
const fields = props.fields.map((f) => f[GHOST] || f.hidden === true || !isHidden(f, parent, cc) ? f : ghostOf(f, "rule"));
|
|
138
|
+
return /* @__PURE__ */ jsx(FieldList, {
|
|
139
|
+
...props,
|
|
140
|
+
fields,
|
|
141
|
+
renderField: (f, path, p) => {
|
|
142
|
+
const g = f[GHOST];
|
|
143
|
+
return g ? /* @__PURE__ */ jsx("div", {
|
|
144
|
+
"data-field-key": pathKey(path),
|
|
145
|
+
"data-ghost": g.why,
|
|
146
|
+
children: line(g.field, path, g.why)
|
|
147
|
+
}) : /* @__PURE__ */ jsx(KitField, {
|
|
148
|
+
field: f,
|
|
149
|
+
path,
|
|
150
|
+
parent: p
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
var GHOST_SLOTS = {
|
|
156
|
+
get FieldList() {
|
|
157
|
+
return GhostFieldList;
|
|
158
|
+
},
|
|
159
|
+
get FieldSection() {
|
|
160
|
+
return FieldSection;
|
|
161
|
+
},
|
|
162
|
+
get TableFrame() {
|
|
163
|
+
return TableFrame;
|
|
164
|
+
},
|
|
165
|
+
get ButtonScreen() {
|
|
166
|
+
return ButtonScreen;
|
|
167
|
+
},
|
|
168
|
+
normLink: buttonLabel
|
|
169
|
+
};
|
|
170
|
+
function SchemaForm({ schema: schemaIn, value, onChange, path: controlledPath, defaultPath, onPathChange, variant = "panel", resolveSchema: resolveIn, blockLibrary, published, inherited, presence, comments, onComment, onOpenReference, review, readOnly, showErrors = false, env: envIn, scroll, header, rootLabel, onCrumbs, onIssuesChange, navRef, className, can: canIn, hiddenLine, extraIssues }) {
|
|
54
171
|
const outerCan = useKitEnv().can;
|
|
55
|
-
const can = envIn?.can ?? outerCan;
|
|
56
|
-
const schema = React.useMemo(() =>
|
|
172
|
+
const can = envIn?.can ?? canIn ?? outerCan;
|
|
173
|
+
const schema = React.useMemo(() => {
|
|
174
|
+
const live = liveSchema(schemaIn);
|
|
175
|
+
return hiddenLine ? lensGhosts(live, can) : visibleSchema(live, can);
|
|
176
|
+
}, [
|
|
177
|
+
schemaIn,
|
|
178
|
+
can,
|
|
179
|
+
hiddenLine
|
|
180
|
+
]);
|
|
57
181
|
const resolveSchema = React.useMemo(() => resolveIn ? (t) => {
|
|
58
182
|
const s = resolveIn(t);
|
|
59
|
-
return s && visibleSchema(s, can);
|
|
183
|
+
return s && visibleSchema(liveSchema(s), can);
|
|
60
184
|
} : void 0, [resolveIn, can]);
|
|
61
185
|
const docId = envIn?.docId ?? schema.name;
|
|
62
186
|
const ownScroll = scroll ?? variant === "panel";
|
|
@@ -131,14 +255,18 @@ function SchemaForm({ schema: schemaIn, value, onChange, path: controlledPath, d
|
|
|
131
255
|
valueRef.current = next;
|
|
132
256
|
onChange(next);
|
|
133
257
|
}, [onChange]);
|
|
134
|
-
const issueList = React.useMemo(() =>
|
|
258
|
+
const issueList = React.useMemo(() => {
|
|
259
|
+
const own = collectIssues(schema.fields, value, [], resolveSchema);
|
|
260
|
+
return extraIssues?.length ? [...own, ...extraIssues.filter((x) => !own.some((o) => o.key === x.key))] : own;
|
|
261
|
+
}, [
|
|
135
262
|
schema,
|
|
136
263
|
value,
|
|
137
|
-
resolveSchema
|
|
264
|
+
resolveSchema,
|
|
265
|
+
extraIssues
|
|
138
266
|
]);
|
|
139
267
|
const issues = React.useMemo(() => new Map(issueList.map((i) => [i.key, i])), [issueList]);
|
|
140
268
|
React.useEffect(() => onIssuesChange?.(issueList), [issueList, onIssuesChange]);
|
|
141
|
-
const isVisible = React.useCallback((i) => showErrors || touched.has(i.key) || i.kind === "rule" && !editing.current.has(i.key), [showErrors, touched]);
|
|
269
|
+
const isVisible = React.useCallback((i) => showErrors || !!i.live || touched.has(i.key) || i.kind === "rule" && !editing.current.has(i.key), [showErrors, touched]);
|
|
142
270
|
const api = {
|
|
143
271
|
schema,
|
|
144
272
|
value,
|
|
@@ -211,6 +339,7 @@ function SchemaForm({ schema: schemaIn, value, onChange, path: controlledPath, d
|
|
|
211
339
|
docTitle: envIn?.docTitle,
|
|
212
340
|
urlPrefix: envIn?.urlPrefix,
|
|
213
341
|
isPublished: envIn?.isPublished ?? (published ? true : void 0),
|
|
342
|
+
slugIsAddress: envIn?.slugIsAddress,
|
|
214
343
|
palette: envIn?.palette ?? DEFAULT_ENV.palette,
|
|
215
344
|
readOnly: !!readOnly,
|
|
216
345
|
can,
|
|
@@ -219,23 +348,32 @@ function SchemaForm({ schema: schemaIn, value, onChange, path: controlledPath, d
|
|
|
219
348
|
onComment,
|
|
220
349
|
onOpenReference,
|
|
221
350
|
syncedFrom: envIn?.syncedFrom,
|
|
222
|
-
helpDisplay: envIn?.helpDisplay
|
|
351
|
+
helpDisplay: envIn?.helpDisplay,
|
|
352
|
+
review,
|
|
353
|
+
fieldChrome: envIn?.fieldChrome,
|
|
354
|
+
controls: envIn?.controls,
|
|
355
|
+
sectionSummary: envIn?.sectionSummary
|
|
223
356
|
}), [
|
|
224
357
|
variant,
|
|
225
358
|
docId,
|
|
226
359
|
envIn?.docTitle,
|
|
227
360
|
envIn?.urlPrefix,
|
|
228
361
|
envIn?.isPublished,
|
|
362
|
+
envIn?.slugIsAddress,
|
|
229
363
|
envIn?.palette,
|
|
230
364
|
envIn?.syncedFrom,
|
|
231
365
|
envIn?.helpDisplay,
|
|
366
|
+
envIn?.fieldChrome,
|
|
367
|
+
envIn?.controls,
|
|
368
|
+
envIn?.sectionSummary,
|
|
232
369
|
published,
|
|
233
370
|
readOnly,
|
|
234
371
|
can,
|
|
235
372
|
normPresence,
|
|
236
373
|
comments,
|
|
237
374
|
onComment,
|
|
238
|
-
onOpenReference
|
|
375
|
+
onOpenReference,
|
|
376
|
+
review
|
|
239
377
|
]);
|
|
240
378
|
React.useImperativeHandle(navRef, () => ({ back: () => {
|
|
241
379
|
if (frames.length < 2) return false;
|
|
@@ -272,6 +410,7 @@ function SchemaForm({ schema: schemaIn, value, onChange, path: controlledPath, d
|
|
|
272
410
|
] })]
|
|
273
411
|
}) : null;
|
|
274
412
|
const body = /* @__PURE__ */ jsx(FrameStage, {
|
|
413
|
+
review: !!review,
|
|
275
414
|
frames,
|
|
276
415
|
frameKey: nav.frameKey,
|
|
277
416
|
dir: nav.dir,
|
|
@@ -283,31 +422,34 @@ function SchemaForm({ schema: schemaIn, value, onChange, path: controlledPath, d
|
|
|
283
422
|
value: env,
|
|
284
423
|
children: /* @__PURE__ */ jsx(FormProvider, {
|
|
285
424
|
value: api,
|
|
286
|
-
children: /* @__PURE__ */ jsx(
|
|
287
|
-
value:
|
|
288
|
-
children: /* @__PURE__ */ jsx(
|
|
289
|
-
value:
|
|
290
|
-
children: /* @__PURE__ */
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
425
|
+
children: /* @__PURE__ */ jsx(HiddenLineCtx.Provider, {
|
|
426
|
+
value: hiddenLine,
|
|
427
|
+
children: /* @__PURE__ */ jsx(FrameSlotsProvider, {
|
|
428
|
+
value: hiddenLine ? GHOST_SLOTS : FRAME_SLOTS,
|
|
429
|
+
children: /* @__PURE__ */ jsx(RowsHostContext.Provider, {
|
|
430
|
+
value: ROWS_HOST,
|
|
431
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
432
|
+
ref: root,
|
|
433
|
+
onKeyDown: nav.onKeyDown,
|
|
434
|
+
className: cn("flex min-h-0 min-w-0 flex-col", ownScroll && "h-full", className),
|
|
435
|
+
"data-kit-form": schema.name,
|
|
436
|
+
children: [
|
|
437
|
+
header,
|
|
438
|
+
onCrumbs ? null : /* @__PURE__ */ jsx(FrameCrumbs, {
|
|
439
|
+
crumbs,
|
|
440
|
+
onNavigate: navigate,
|
|
441
|
+
variant
|
|
442
|
+
}),
|
|
443
|
+
ownScroll ? /* @__PURE__ */ jsx("div", {
|
|
444
|
+
ref: scroller,
|
|
445
|
+
className: "@container min-h-0 flex-1 overflow-y-auto overscroll-contain",
|
|
446
|
+
children: body
|
|
447
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
448
|
+
className: "@container",
|
|
449
|
+
children: body
|
|
450
|
+
})
|
|
451
|
+
]
|
|
452
|
+
})
|
|
311
453
|
})
|
|
312
454
|
})
|
|
313
455
|
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-form.js","names":[],"sources":["../../src/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, FieldSchema, TypeSchema } from \"../schema/types\";\nimport { DEFAULT_ENV, fieldAccessOf, FormProvider, KitEnvProvider, useForm, 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 { condCtx, isHidden } from \"../lib/schema\";\nimport { collectIssues, type KitIssue } from \"../lib/validate\";\nimport { RowsHostContext } from \"./array\";\nimport { crumbSignature, FrameCrumbs, framesToCrumbs, type KitCrumb } from \"./breadcrumb\";\nimport { FieldList, type FieldListProps } from \"./field-list\";\nimport { FrameSlotsProvider, FrameStage, useFrameNavigation, type FrameSlots } from \"./frame\";\nimport { FieldList as GroupedFieldList, FieldSection } from \"./grouping\";\nimport { KitField, 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 /** D61: the host's Review changes markers (while its History panel is open) */\n review?: KitEnv[\"review\"];\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 /** the slug is the document's address (KitEnv.slugIsAddress) */\n slugIsAddress?: 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 /** \"quiet\" field chrome for meta-forms (see `KitEnv.fieldChrome`) */\n fieldChrome?: KitEnv[\"fieldChrome\"];\n /** the host's own controls by path key (see `KitEnv.controls`); keep it stable */\n controls?: KitEnv[\"controls\"];\n /** the host's chip summary for collapsed fieldsets (see `KitEnv.sectionSummary`); keep it stable */\n sectionSummary?: KitEnv[\"sectionSummary\"];\n };\n /**\n * Issues the host computes itself (a live check the schema can't express), merged with the form's own. A host issue on a\n * path the form already flags is dropped; `live` ones show while typing; `fix` adds one action after the message.\n */\n extraIssues?: KitIssue[];\n /** The host's access check (V2 `KitEnv.can`), the same as `env.can`; `env.can` wins when both are set. */\n can?: KitEnv[\"can\"];\n /**\n * D70 (V2 `KitEnv.hiddenLine`): keep the fields that would leave the form in place as the host's line instead. `why`\n * says what hid it: \"rule\" (its condition doesn't hold for the current value) or \"access\" (the lens can't `view` it).\n * The schema preview draws its dashed \"Hidden for Editor\" / \"Hidden: …\" lines with it. Absent: hidden fields leave the\n * form, as in every editor. Keep it stable (a new function re-renders the form).\n */\n hiddenLine?: (field: FieldSchema, path: FieldPath, why: HiddenWhy) => React.ReactNode;\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\n/* ── archived fields leave every form ───────────────────────────────── */\n/** Drop archived fields at every depth (V2 registry: \"What a form renders: archived fields left out (their values stay\n * stored)\"). Same object back when nothing is archived, so a form with none renders exactly as before. */\nfunction liveFields(fields: FieldSchema[]): FieldSchema[] {\n let changed = false;\n const out: FieldSchema[] = [];\n for (const f of fields) {\n if (f.archived) {\n changed = true;\n continue;\n }\n let g = f;\n if (f.fields) {\n const n = liveFields(f.fields);\n if (n !== f.fields) g = { ...g, fields: n };\n }\n if (Array.isArray(f.of)) {\n const n = liveFields(f.of);\n if (n !== f.of) g = { ...g, of: n };\n }\n if (f.slotSettings) {\n const n = liveFields(f.slotSettings);\n if (n !== f.slotSettings) g = { ...g, slotSettings: n };\n }\n if (g !== f) changed = true;\n out.push(g);\n }\n return changed ? out : fields;\n}\nfunction liveSchema(schema: TypeSchema): TypeSchema {\n const fields = liveFields(schema.fields);\n return fields === schema.fields ? schema : { ...schema, fields };\n}\n\n/* ── hiddenLine: hidden fields kept in place as the host's line ──────── */\nexport type HiddenWhy = \"rule\" | \"access\";\nconst GHOST = \"__ghost\";\ntype Ghost = { why: HiddenWhy; field: FieldSchema };\ntype GhostField = FieldSchema & { [GHOST]?: Ghost };\nconst HiddenLineCtx = React.createContext<SchemaFormProps[\"hiddenLine\"]>(undefined);\n\n/** A stand-in that keeps a hidden field's place: no value rules, no condition, nothing to validate or drill into. */\nfunction ghostOf(f: FieldSchema, why: HiddenWhy): GhostField {\n return { name: f.name, title: f.title, type: f.type === \"object\" || f.type === \"array\" || f.type === \"slot\" ? \"string\" : f.type, fieldset: f.fieldset, group: f.group, readOnly: true, [GHOST]: { why, field: f } };\n}\n\n/** `visibleSchema`, except that a field the lens can't view stays as a ghost (top level and inside objects). */\nfunction lensGhosts(schema: TypeSchema, can: KitEnv[\"can\"]): TypeSchema {\n const walk = (fields: FieldSchema[]): FieldSchema[] =>\n fields.map((f) => {\n const a = fieldAccessOf(f);\n if (a?.view && !can(a.view)) return ghostOf(f, \"access\");\n return f.type === \"object\" && f.fields ? { ...f, fields: walk(f.fields) } : f;\n });\n return { ...schema, fields: walk(schema.fields) };\n}\n\n/** The frame's field list with condition-hidden fields kept as ghosts, every ghost drawn by the host's line. */\nfunction GhostFieldList(props: FieldListProps) {\n const form = useForm()!;\n const line = React.useContext(HiddenLineCtx)!;\n const raw = form.getAt(props.basePath);\n const parent = isObj(raw) ? raw : {};\n const cc = condCtx(form, props.basePath);\n const fields = props.fields.map((f) => ((f as GhostField)[GHOST] || f.hidden === true || !isHidden(f, parent, cc) ? f : ghostOf(f, \"rule\")));\n return (\n <GroupedFieldList\n {...props}\n fields={fields}\n renderField={(f, path, p) => {\n const g = (f as GhostField)[GHOST];\n return g ? (\n <div data-field-key={pathKey(path)} data-ghost={g.why}>\n {line(g.field, path, g.why)}\n </div>\n ) : (\n <KitField field={f} path={path} parent={p} />\n );\n }}\n />\n );\n}\nconst GHOST_SLOTS: FrameSlots = {\n get FieldList() {\n return GhostFieldList;\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};\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 review,\n readOnly,\n showErrors = false,\n env: envIn,\n scroll,\n header,\n rootLabel,\n onCrumbs,\n onIssuesChange,\n navRef,\n className,\n can: canIn,\n hiddenLine,\n extraIssues,\n}: SchemaFormProps) {\n const outerCan = useKitEnv().can;\n const can = envIn?.can ?? canIn ?? 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 (with\n `hiddenLine`, they stay as ghosts: a place and a line, still nothing to validate) */\n const schema = React.useMemo(() => {\n const live = liveSchema(schemaIn);\n return hiddenLine ? lensGhosts(live, can) : visibleSchema(live, can);\n }, [schemaIn, can, hiddenLine]);\n const resolveSchema = React.useMemo(\n () =>\n resolveIn\n ? (t: string) => {\n const s = resolveIn(t);\n return s && visibleSchema(liveSchema(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(() => {\n const own = collectIssues(schema.fields, value, [], resolveSchema);\n return extraIssues?.length ? [...own, ...extraIssues.filter((x) => !own.some((o) => o.key === x.key))] : own;\n }, [schema, value, resolveSchema, extraIssues]);\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 || !!i.live || 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 slugIsAddress: envIn?.slugIsAddress,\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 review,\n fieldChrome: envIn?.fieldChrome,\n controls: envIn?.controls,\n sectionSummary: envIn?.sectionSummary,\n }),\n [variant, docId, envIn?.docTitle, envIn?.urlPrefix, envIn?.isPublished, envIn?.slugIsAddress, envIn?.palette, envIn?.syncedFrom, envIn?.helpDisplay, envIn?.fieldChrome, envIn?.controls, envIn?.sectionSummary, published, readOnly, can, normPresence, comments, onComment, onOpenReference, review],\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 review={!!review} 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 <HiddenLineCtx.Provider value={hiddenLine}>\n <FrameSlotsProvider value={hiddenLine ? GHOST_SLOTS : 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 </HiddenLineCtx.Provider>\n </FormProvider>\n </KitEnvProvider>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { useForm } from "../context.js";
|
|
2
3
|
import { ensureKeys, isObj, itemId, pathKey } from "../lib/path.js";
|
|
3
4
|
import { KitIcon } from "../lib/icons.js";
|
|
4
|
-
import { useForm } from "../context.js";
|
|
5
5
|
import { Button } from "../ui/button.js";
|
|
6
6
|
import { Popover, PopoverContent, PopoverTrigger } from "../ui/overlay.js";
|
|
7
|
-
import { newBlock,
|
|
7
|
+
import { newBlock, slotAllow, slotRowOf } from "../lib/schema.js";
|
|
8
8
|
import { FieldShell } from "./field-shell.js";
|
|
9
9
|
import { RowList, useDrill, useListOps } from "./array.js";
|
|
10
10
|
import { useFieldAccess } from "./kit-field.js";
|
|
11
11
|
import * as React from "react";
|
|
12
|
-
import { IconPlus, IconSearch } from "@tabler/icons-react";
|
|
13
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
-
|
|
13
|
+
import { IconPlus, IconSearch } from "@tabler/icons-react";
|
|
14
|
+
//#region src/engine/slot.tsx
|
|
15
15
|
/**
|
|
16
16
|
* SLOTS — blocks inside blocks (tabs, columns, bento, carousels, mega-menu panels; V2 HEAD 9829bf1 kit/engine/slot.tsx).
|
|
17
17
|
* Rows show the block icon, its name and a variant chip; "+ Add block" opens a compact, searchable block picker;
|
|
@@ -32,22 +32,12 @@ function SlotField({ field, path }) {
|
|
|
32
32
|
const available = useAvailableBlocks(field);
|
|
33
33
|
const rows = list.map((it, i) => {
|
|
34
34
|
const type = isObj(it) && typeof it._type === "string" ? it._type : "";
|
|
35
|
-
const block = form.resolveSchema?.(type);
|
|
36
|
-
const pv = previewOf(block, it, i, block?.title ?? "Block");
|
|
37
|
-
const variant = block?.variants?.find((v) => isObj(it) && v.id === it._variant)?.name;
|
|
38
|
-
const settings = field.slotSettings && isObj(it) ? summarize(field.slotSettings, it._settings, 2) : "";
|
|
39
35
|
return {
|
|
40
36
|
id: itemId(it, i),
|
|
41
37
|
index: i,
|
|
42
38
|
item: it,
|
|
43
39
|
path: [...path, i],
|
|
44
|
-
|
|
45
|
-
...pv,
|
|
46
|
-
title: pv.empty ? block?.title ?? "Unknown block" : pv.title,
|
|
47
|
-
icon: block?.icon ?? "box"
|
|
48
|
-
},
|
|
49
|
-
chip: variant,
|
|
50
|
-
extra: [pv.empty ? void 0 : block?.title, settings].filter(Boolean).join(" · ") || block?.description || `Block ${i + 1} of ${list.length}`
|
|
40
|
+
...slotRowOf(form.resolveSchema?.(type), it, i, list.length, field.slotSettings)
|
|
51
41
|
};
|
|
52
42
|
});
|
|
53
43
|
return /* @__PURE__ */ jsx(FieldShell, {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot.js","names":[],"sources":["../../src/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, slotAllow, slotRowOf } 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 return { id: itemId(it, i), index: i, item: it, path: [...path, i], ...slotRowOf(form.resolveSchema?.(type), it, i, list.length, field.slotSettings) };\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/dist/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { prod_types_exports } from "./adapters/prod-types.js";
|
|
2
|
+
import { buttonFromProd, buttonToProd, codeFromProd, codeToProd, cropPreset, cropRect, dateFromProd, dateToProd, datetimeFromProd, datetimeToProd, imageFromProd, imageToProd, isCropRect, isDockIcon, linkFromProd, linkToProd, listFromProd, listToProd, parseTargetTag, ratingFromProd, ratingToProd, referenceFromProd, referenceToProd, scaleFromProd, scaleToProd, tableFromProd, tableToProd, tagsFromProd, tagsToProd, targetTag, typedRowsFromProd, typedRowsToProd, videoFromProd, videoToProd, zoneListFromProd, zoneListToProd } from "./adapters/values.js";
|
|
3
|
+
import { CATEGORY_TO_PROD, SHOPIFY_REF_LOCK, fromTypeSchema, leafValuePlan, planFromProd, planToProd, propsToTypeSchema, schemaSlugOf, toTypeSchema } from "./adapters/schema.js";
|
|
4
|
+
import { cn } from "./lib/cn.js";
|
|
5
|
+
import { AI_PRESETS, DEFAULT_ENV, FieldHeaderSlot, FormProvider, KitEnvProvider, KitSectionTitle, KitServicesProvider, SITE_PALETTE, fieldAccessOf, registerKitServices, resolveFieldAccess, seesDevSurfaces, useForm, useKitEnv, useKitServices, visibleFields, visibleSchema } from "./context.js";
|
|
6
|
+
import { FieldDescribedByContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy } from "./ui/field-context.js";
|
|
7
|
+
import { Button, HintTooltip, IconButton, RevealLink, Sparkle, TooltipScope, buttonVariants, iconButtonVariants } from "./ui/button.js";
|
|
8
|
+
import { ShortcutHint, ShortcutHintsProvider, shortcutHintsOn, useShortcutHints } from "./ui/shortcut-hint.js";
|
|
9
|
+
import { Checkbox, ChoiceCard, ChoiceList, Progress, Radio, RadioGroup, Segmented, Slider, Switch, ToggleGroup, ToggleItem } from "./ui/controls.js";
|
|
10
|
+
import { FLOATING_LAYER, FlowBody, FlowClose, FlowFooter, FlowHeader, FlowLabel, FlowModal, HeaderStatus, HoverCard, HoverCardContent, HoverCardTrigger, Menu, MenuCheckItem, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger, MoreOptions, OptionRow, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Sheet, SheetClose, SheetContent, SheetTrigger, Tooltip, TooltipProvider, useFocusReturn } from "./ui/overlay.js";
|
|
11
|
+
import { IssueDot, Kbdish, RowChrome, Thumb } from "./engine/bits.js";
|
|
12
|
+
import { Avatar, AvatarStack, Badge, Card, CardHeader, Dot, EmptyState, Kbd, PageHeader, Separator, SettingsSection, Skeleton, Stat, StatusMark, StatusPill, Table, Td, Th, Tr, avatarRingSpread, badgeVariants, colorFor, initials, statusMap } from "./ui/display.js";
|
|
13
|
+
import { AGENT_PRESENCE, presenceColor, presenceSlot, registerPresenceRoster } from "./ui/presence.js";
|
|
14
|
+
import { DEV_FIELD, DEV_ONLY_FIELD, HISTORY_SEGMENT } from "./schema/types.js";
|
|
15
|
+
import { HELP_STRINGS, conventionalHelp, resolveHelp } from "./schema/help.js";
|
|
16
|
+
import { FieldShell, LABEL_HINT_AT, PeerStack, apiName, resetFieldClipboard } from "./engine/field-shell.js";
|
|
17
|
+
import { groupSummary } from "./engine/group-summary.js";
|
|
18
|
+
import { AnimatedFields, Appear, BreakpointGroup, FieldInset, FieldSection, FieldUnit, FieldUnitRow, FieldsetSection, GroupTabs, InsetScope, RHYTHM, arrangeFields, defaultGroup, isBreakpointName, isShort, useGroupStatus, useInsetDepth, useRhythm } from "./engine/grouping.js";
|
|
19
|
+
import { Field, HelpMore, Input, Label, SearchInput, Textarea } from "./ui/input.js";
|
|
20
|
+
import { Highlight, SEARCH_THRESHOLD, Select, filterOptions, matchPositions, matchScore, nodeText, selectTriggerClass } from "./ui/select.js";
|
|
21
|
+
import { FieldList } from "./engine/field-list.js";
|
|
22
|
+
import { ItemList, OrderLockSlot, SharedSortProvider, arrayMove, useDragReorder, useSharedSort } from "./engine/item-list.js";
|
|
23
|
+
import { ARRAY_CONTROLS, ArrayField, RowList, RowsHostContext, rowToggleField, useDrill, useListOps } from "./engine/array.js";
|
|
24
|
+
import { isDrillable, resolveFrames, rootFrame } from "./lib/frames.js";
|
|
25
|
+
import { ExpandedEditorModal } from "./ui/expanded-editor-modal.js";
|
|
26
|
+
import { FrameCrumbs, KitBreadcrumb, crumbSignature, framesToCrumbs, kitPathItems } from "./engine/breadcrumb.js";
|
|
27
|
+
import { ChoiceSwitch, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, fitsSegmented } from "./ui/choice-switch.js";
|
|
28
|
+
import { FrameHeader, FrameSlotsProvider, FrameStage, FrameView, HistoryView, frameContext, frameDirection, parentOfField, parentTitleOf, useFrameNavigation, useFrameSlots } from "./engine/frame.js";
|
|
29
|
+
import { COALESCE_MS, SchemaForm, UNDO_STEPS } from "./engine/schema-form.js";
|
|
30
|
+
import { BlockPicker, SlotField, useAvailableBlocks } from "./engine/slot.js";
|
|
31
|
+
import { ACTIONS, ACTION_WHEN_READ_ONLY, CONTROLS, FallbackControl, KitField, LegacyFallback, NavRow, NestedForm, plainOf, useFieldAccess, withDefaultHelp } from "./engine/kit-field.js";
|
|
32
|
+
import { controls_exports, registerKitControls } from "./controls/index.js";
|
|
33
|
+
import { CAP_IDS } from "./schema/sources.js";
|
|
34
|
+
import { blockDefToSchema, fieldDefToSchema, fieldDefsToSchema, inferField, propDefToField, titleFromKey } from "./schema/adapters.js";
|
|
35
|
+
import { ActionTray, TrayMeta, TrayMore, actionTrayClass, relTime } from "./ui/action-tray.js";
|
|
36
|
+
import { ModeBar, ModeBarDot, ModeBarLink } from "./ui/mode-bar.js";
|
|
37
|
+
import { Spinner } from "./ui/spinner.js";
|
|
38
|
+
import { Tab, TabList, TabPanel, Tabs } from "./ui/tab.js";
|
|
39
|
+
import { KitToaster, kitToast, kitToastManager } from "./ui/toast.js";
|
|
40
|
+
import { Autocomplete } from "./ui/autocomplete.js";
|
|
41
|
+
import "./kit.css";
|
|
42
|
+
//#region src/index.ts
|
|
43
|
+
registerKitControls();
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ACTIONS, ACTION_WHEN_READ_ONLY, AGENT_PRESENCE, AI_PRESETS, ARRAY_CONTROLS, ActionTray, AnimatedFields, Appear, ArrayField, Autocomplete, 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, FlowBody, FlowClose, FlowFooter, FlowHeader, FlowLabel, FlowModal, FormProvider, FrameCrumbs, FrameHeader, FrameSlotsProvider, FrameStage, FrameView, GroupTabs, HELP_STRINGS, HISTORY_SEGMENT, HeaderStatus, HelpMore, Highlight, HintTooltip, HistoryView, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, Input, InsetScope, IssueDot, ItemList, Kbd, Kbdish, KitBreadcrumb, KitEnvProvider, KitField, KitSectionTitle, KitServicesProvider, KitToaster, 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, MoreOptions, NavRow, NestedForm, OptionRow, OrderLockSlot, PageHeader, PeerStack, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Progress, RHYTHM, Radio, RadioGroup, RevealLink, RowChrome, RowList, RowsHostContext, SEARCH_THRESHOLD, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, SHOPIFY_REF_LOCK, SITE_PALETTE, SchemaForm, SearchInput, Segmented, Select, Separator, SettingsSection, SharedSortProvider, Sheet, SheetClose, SheetContent, SheetTrigger, ShortcutHint, ShortcutHintsProvider, Skeleton, Slider, SlotField, Sparkle, Spinner, Stat, StatusMark, StatusPill, Switch, Tab, TabList, TabPanel, Table, Tabs, 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, isCropRect, isDockIcon, isDrillable, isShort, kitPathItems, kitToast, kitToastManager, leafValuePlan, linkFromProd, linkToProd, listFromProd, listToProd, matchPositions, matchScore, nodeText, parentOfField, parentTitleOf, parseTargetTag, 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, schemaSlugOf, seesDevSurfaces, selectTriggerClass, shortcutHintsOn, statusMap, tableFromProd, tableToProd, tagsFromProd, tagsToProd, targetTag, titleFromKey, toTypeSchema, typedRowsFromProd, typedRowsToProd, 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 };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/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,oBAAoB"}
|
package/{kit.css → dist/kit.css}
RENAMED
|
@@ -22,12 +22,31 @@
|
|
|
22
22
|
to { opacity: 1; transform: none; }
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/* V2 slide-up (mobile flow modal sheet) */
|
|
26
|
+
@keyframes kit-slide-up {
|
|
27
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
28
|
+
to { opacity: 1; transform: none; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* V2 image editor enter (image-editor.tsx: opacity 0, y 8 → rest) */
|
|
32
|
+
@keyframes kit-rise-in {
|
|
33
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
34
|
+
to { opacity: 1; transform: none; }
|
|
35
|
+
}
|
|
36
|
+
|
|
25
37
|
/* V2 sheet-in-r / sheet-in-l (index.css), run by SheetContent on open */
|
|
26
38
|
@keyframes kit-sheet-in-r {
|
|
27
39
|
from { transform: translateX(24px); opacity: 0; }
|
|
28
40
|
to { transform: none; opacity: 1; }
|
|
29
41
|
}
|
|
30
42
|
|
|
43
|
+
/* V2 floating inspector exit (editor.tsx inspector-float: x 16, opacity 0). Reduced motion is handled where it is
|
|
44
|
+
applied (FloatingInspector: skipped in JS, plus motion-reduce:animate-none). */
|
|
45
|
+
@keyframes kit-sheet-out-r {
|
|
46
|
+
from { transform: none; opacity: 1; }
|
|
47
|
+
to { transform: translateX(16px); opacity: 0; }
|
|
48
|
+
}
|
|
49
|
+
|
|
31
50
|
@keyframes kit-sheet-in-l {
|
|
32
51
|
from { transform: translateX(-24px); opacity: 0; }
|
|
33
52
|
to { transform: none; opacity: 1; }
|
package/{lib → dist/lib}/cn.js
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { clsx } from "clsx";
|
|
2
|
-
import { extendTailwindMerge } from "tailwind-merge";
|
|
3
|
-
//#region src/
|
|
2
|
+
import { extendTailwindMerge, twMerge } from "tailwind-merge";
|
|
3
|
+
//#region src/lib/cn.ts
|
|
4
4
|
/** Merge Tailwind classes; our custom text sizes (2xs..3xl) are registered so twMerge
|
|
5
5
|
* doesn't confuse `text-sm` (size) with `text-fg-2` (color). */
|
|
6
6
|
var merge = extendTailwindMerge({ extend: { classGroups: {
|
|
@@ -33,7 +33,10 @@ var merge = extendTailwindMerge({ extend: { classGroups: {
|
|
|
33
33
|
"kit-canvas-frame",
|
|
34
34
|
"kit-device",
|
|
35
35
|
"kit-field",
|
|
36
|
-
"kit-ring-field"
|
|
36
|
+
"kit-ring-field",
|
|
37
|
+
"kit-button-primary",
|
|
38
|
+
"kit-sheet-r",
|
|
39
|
+
"kit-sheet-b"
|
|
37
40
|
] }],
|
|
38
41
|
rounded: [{ rounded: [
|
|
39
42
|
"kit-xs",
|
|
@@ -48,6 +51,6 @@ function cn(...inputs) {
|
|
|
48
51
|
return merge(clsx(inputs));
|
|
49
52
|
}
|
|
50
53
|
//#endregion
|
|
51
|
-
export { cn };
|
|
54
|
+
export { cn, twMerge };
|
|
52
55
|
|
|
53
56
|
//# sourceMappingURL=cn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.js","names":[],"sources":["../../src/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\", \"kit-button-primary\", \"kit-sheet-r\", \"kit-sheet-b\"] }],\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;CAAS,EAAE,CAAC;CAIlL,QAAQ,CAAC,EAAE,QAAQ;EAAC;EAAU;EAAU;EAAU;EAAU;EAAU;EAAoB;EAAc;EAAa;EAAkB;EAAsB;EAAe;CAAa,EAAE,CAAC;CAC5L,SAAS,CAAC,EAAE,SAAS;EAAC;EAAU;EAAU;EAAU;EAAU;EAAU;CAAS,EAAE,CAAC;AACtF,EACF,EACF,CAAC;AACD,SAAgB,GAAG,GAAG,QAAsB;CAC1C,OAAO,MAAM,KAAK,MAAM,CAAC;AAC3B"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
//#region src/lib/columns.ts
|
|
2
|
+
/** Text longer than this never sits in a column. */
|
|
3
|
+
var SHORT_TEXT_MAX = 24;
|
|
1
4
|
/** Long text, rich text, lists, media, links, references, buttons, tables and objects are always full width. */
|
|
2
5
|
function isColumnField(f) {
|
|
3
6
|
switch (f.type) {
|
|
@@ -22,6 +25,6 @@ function columnSpans(fields) {
|
|
|
22
25
|
return out;
|
|
23
26
|
}
|
|
24
27
|
//#endregion
|
|
25
|
-
export { columnSpans, isColumnField };
|
|
28
|
+
export { SHORT_TEXT_MAX, columnSpans, isColumnField };
|
|
26
29
|
|
|
27
30
|
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.js","names":[],"sources":["../../src/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":";;AAUA,IAAa,iBAAiB;;AAG9B,SAAgB,cAAc,GAAyB;CACrD,QAAQ,EAAE,MAAV;EACE,KAAK,UACH,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW;EAClC,KAAK;EAAW,KAAK;EAAQ,KAAK;EAAS,KAAK;EAAQ,KAAK,UAC3D,OAAO;EACT,KAAK,UACH,OAAO,EAAE,WAAW,WAAW,EAAE,WAAW;EAC9C,KAAK,UACH,QAAQ,EAAE,YAAY,OAAO,aAAA;EAC/B,SACE,OAAO;CACX;AACF;;AAEA,SAAgB,YAAY,QAAkC;CAC5D,MAAM,MAAM,OAAO,UAAU,KAAK;CAClC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KACrC,IAAI,cAAc,OAAO,EAAE,KAAK,cAAc,OAAO,IAAI,EAAE,GAAG;EAC5D,IAAI,KAAK,IAAI,IAAI,KAAK;EACtB;CACF;CAEF,OAAO;AACT"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { getIn, isObj } from "./path.js";
|
|
2
1
|
import { cellText, isTableValue, normalizeTable } from "../schema/table.js";
|
|
2
|
+
import { getIn, isObj } from "./path.js";
|
|
3
3
|
import { isPrimitive, itemSchemaFor, previewOf } from "./schema.js";
|
|
4
4
|
import { HISTORY_SEGMENT } from "../schema/types.js";
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/lib/frames.ts
|
|
6
6
|
/**
|
|
7
7
|
* NAVIGATION MODEL — a path resolves to a STACK OF FRAMES (one per breadcrumb). The last frame is what the
|
|
8
8
|
* panel shows. Drillable nodes: object fields (drill mode), array items, slot children (blocks), button fields
|