@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
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import * as React from "react";
|
|
12
12
|
import type { Cap } from "./schema/sources";
|
|
13
|
-
import type { FieldAccess, FieldPath, FieldSchema, TypeSchema } from "./schema/types";
|
|
13
|
+
import type { FieldAccess, FieldPath, FieldSchema, Fieldset, TypeSchema } from "./schema/types";
|
|
14
14
|
import type { KitIssue } from "./lib/validate";
|
|
15
15
|
import type { ControlProps } from "./types";
|
|
16
16
|
import type { LinkTarget } from "./controls/link";
|
|
@@ -31,6 +31,23 @@ export interface KitMediaPickerProps {
|
|
|
31
31
|
onPick: (assets: KitMediaAsset[]) => void;
|
|
32
32
|
multiple?: boolean;
|
|
33
33
|
accept?: ("image" | "video" | "file" | "svg")[];
|
|
34
|
+
/** What the dialog is for, in the author's words ("Replace icon"). Absent: the host's own title. */
|
|
35
|
+
title?: string;
|
|
36
|
+
/** An icon's Remove, in the dialog's footer (its row has no room for one). Absent: no Remove. */
|
|
37
|
+
onRemove?: () => void;
|
|
38
|
+
/**
|
|
39
|
+
* An icon's first tab: the icons already on this site, each with the value it is stored as. The field's own icon
|
|
40
|
+
* leads, marked `current`: picking it closes the dialog with no write. Absent: no such tab.
|
|
41
|
+
*/
|
|
42
|
+
icons?: KitSiteIcon[];
|
|
43
|
+
onPickIcon?: (value: unknown) => void;
|
|
44
|
+
}
|
|
45
|
+
/** One icon already on the site (KitServices.useSiteIcons), as the picker's first tab draws it. */
|
|
46
|
+
export interface KitSiteIcon {
|
|
47
|
+
url: string;
|
|
48
|
+
value: unknown;
|
|
49
|
+
assetId?: string;
|
|
50
|
+
current?: boolean;
|
|
34
51
|
}
|
|
35
52
|
export interface KitToastOptions {
|
|
36
53
|
/** the second line under the message (V2 sonner `description`) */
|
|
@@ -65,6 +82,13 @@ export interface KitFieldCommentsProps {
|
|
|
65
82
|
/** "Open in panel": set when the host has a comments panel (`env.onComment`) */
|
|
66
83
|
onOpenPanel?: () => void;
|
|
67
84
|
}
|
|
85
|
+
/** One field's ⋯ menu, as the host's extra items see it (KitServices.FieldMenuExtras). */
|
|
86
|
+
export interface KitFieldMenuExtrasProps {
|
|
87
|
+
field: FieldSchema;
|
|
88
|
+
path: FieldPath;
|
|
89
|
+
/** the field is read-only for the lens: a host offers nothing that edits */
|
|
90
|
+
readOnly: boolean;
|
|
91
|
+
}
|
|
68
92
|
export interface KitServices {
|
|
69
93
|
/** The media library picker. */
|
|
70
94
|
MediaPicker?: React.ComponentType<KitMediaPickerProps>;
|
|
@@ -96,6 +120,17 @@ export interface KitServices {
|
|
|
96
120
|
}[];
|
|
97
121
|
/** Toasts for Copy / Paste / Reset / AI (each with Undo). Absent → the action still runs, silently. */
|
|
98
122
|
toast?: KitToast;
|
|
123
|
+
/**
|
|
124
|
+
* A slug's "Save new address" with "Redirect it to the new address" ticked (V2 SlugControl): the host files the
|
|
125
|
+
* redirect from the old slug to the new one. Absent → no checkbox is offered, and the toast says the old address
|
|
126
|
+
* will return "Not found", which is what happens. A rejection is named in a toast (the new slug is already saved).
|
|
127
|
+
*/
|
|
128
|
+
redirectSlug?: (from: string, to: string) => void | Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* A slug's "Save new address": the host writes the new address before any redirect is filed. Absent → the form's
|
|
131
|
+
* value is the save (V2). A rejection is named in a toast and the old-address box stays for another try.
|
|
132
|
+
*/
|
|
133
|
+
saveSlug?: (to: string) => Promise<void>;
|
|
99
134
|
/** Rewrite with AI. Absent → the ⋯ menu offers no rewrite. `attempt` counts "Try again" presses. */
|
|
100
135
|
aiRewrite?: (text: string, preset: AiPreset, attempt: number) => string | Promise<string>;
|
|
101
136
|
/** In-place field comments. Absent and no `env.onComment` → the field shows no add-comment control. */
|
|
@@ -111,6 +146,12 @@ export interface KitServices {
|
|
|
111
146
|
* owns the label row and the help; the box is tagged `data-kit-legacy`. Absent → the field says why in words.
|
|
112
147
|
*/
|
|
113
148
|
LegacyControl?: React.ComponentType<ControlProps>;
|
|
149
|
+
/**
|
|
150
|
+
* The host's own items for a field's ⋯ menu (the entry editor's Move up · Move down · Move to panel), drawn after
|
|
151
|
+
* History and before Rewrite with AI. It renders kit `MenuItem`s, with its own leading `MenuSeparator`, or null.
|
|
152
|
+
* Absent → the menu is exactly V2's.
|
|
153
|
+
*/
|
|
154
|
+
FieldMenuExtras?: React.ComponentType<KitFieldMenuExtrasProps>;
|
|
114
155
|
/**
|
|
115
156
|
* A React HOOK: the project's pages and CMS items a link can point at (controls/link.tsx). The host passes the same
|
|
116
157
|
* function for the life of the form (it is called on every render of a link control). Absent → the link picker says
|
|
@@ -122,6 +163,11 @@ export interface KitServices {
|
|
|
122
163
|
loading?: boolean;
|
|
123
164
|
error?: string;
|
|
124
165
|
};
|
|
166
|
+
/**
|
|
167
|
+
* A React HOOK: every SVG the site already uses (its pages, header and footer, the library's SVGs), for an icon's
|
|
168
|
+
* picker. The host passes the same function for the life of the form. Absent → the picker has no site tab.
|
|
169
|
+
*/
|
|
170
|
+
useSiteIcons?: () => KitSiteIcon[];
|
|
125
171
|
}
|
|
126
172
|
/** Register app services once at module load (e.g. the Content feature registers its media library). */
|
|
127
173
|
export declare function registerKitServices(s: KitServices): void;
|
|
@@ -162,6 +208,12 @@ export interface KitEnv {
|
|
|
162
208
|
urlPrefix?: string;
|
|
163
209
|
/** The document has been published (slug changes warn about the old address). */
|
|
164
210
|
isPublished?: boolean;
|
|
211
|
+
/**
|
|
212
|
+
* The form's slug is the document's ADDRESS (a page's or an entry's URL). Only then does a changed slug on a published
|
|
213
|
+
* document say the old address will stop working and offer the redirect. A slug prop or a key is not an address, so
|
|
214
|
+
* it gets no such box (V2 draws it on document hosts only: its component-prop forms pass no published state).
|
|
215
|
+
*/
|
|
216
|
+
slugIsAddress?: boolean;
|
|
165
217
|
palette: Swatch[];
|
|
166
218
|
/** The whole form is read-only for the lens (the host's content.edit rule, a generated twin…). */
|
|
167
219
|
readOnly: boolean;
|
|
@@ -176,7 +228,8 @@ export interface KitEnv {
|
|
|
176
228
|
/** pathKey → open comment threads */
|
|
177
229
|
comments: Record<string, number>;
|
|
178
230
|
/** Host comment panel. When absent, field comments live in the in-place popover only. */
|
|
179
|
-
|
|
231
|
+
/** `quote`: the words selected in a rich text field when the comment came from its toolbar */
|
|
232
|
+
onComment?: (path: FieldPath, field: FieldSchema, quote?: string) => void;
|
|
180
233
|
/** The whole form is a global block ("Navigation") — every field is synced. */
|
|
181
234
|
syncedFrom?: string;
|
|
182
235
|
/** "Open {title}" on a reference card: the host edits the referenced entry in place (stacked panel). */
|
|
@@ -187,7 +240,44 @@ export interface KitEnv {
|
|
|
187
240
|
}) => void;
|
|
188
241
|
/** CPO D39: "inline" (default) shows help under the label; "tooltip" moves it behind the ⓘ — for dense hosts (grid cells, popovers). */
|
|
189
242
|
helpDisplay?: "inline" | "tooltip";
|
|
243
|
+
/** D61 Review changes: the host's change markers, present only while its History panel is open. */
|
|
244
|
+
review?: KitReview;
|
|
245
|
+
/**
|
|
246
|
+
* "quiet": a meta-form, like the schema editor's field settings (founder call, 2026-10-05). No comment, ⋯ or per-field
|
|
247
|
+
* undo on the fields, and an on/off field is a label-left row with its switch on the right (the inspector's PRow), not a
|
|
248
|
+
* switch card. "preview": the same chrome-free fields, controls exactly as editors see them (a schema preview, where a
|
|
249
|
+
* comment would land on a sample, never a real document). Default "full".
|
|
250
|
+
*/
|
|
251
|
+
fieldChrome?: "full" | "preview" | "quiet";
|
|
252
|
+
/**
|
|
253
|
+
* A host's own control for one field, by its path key ("type", "options"), drawn inside the usual shell. The schema
|
|
254
|
+
* editor's field settings plug their Type, Options, Key and Show this field controls in here. Absent = kit controls only.
|
|
255
|
+
*/
|
|
256
|
+
controls?: Record<string, React.ComponentType<ControlProps>>;
|
|
257
|
+
/**
|
|
258
|
+
* A collapsed fieldset's summary as chips, from the host (the schema editor's field settings: "Required", "3 options").
|
|
259
|
+
* `undefined` falls back to the kit's own one-line summary. Keep it stable (a new function re-renders the form).
|
|
260
|
+
*/
|
|
261
|
+
sectionSummary?: (set: Fieldset, value: Record<string, unknown>) => string[] | undefined;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* D61 Review changes, as the kit sees it. The host owns the history model; the kit only asks, per field path, whether
|
|
265
|
+
* it changed in the range, and renders the host's marker (a 2px bar in the author's colour at the field's left edge,
|
|
266
|
+
* with its hover card) where the at-rest "changed" dot would be.
|
|
267
|
+
*/
|
|
268
|
+
export interface KitReview {
|
|
269
|
+
/** changes at or inside this field in the range (0 = unchanged) */
|
|
270
|
+
count: (path: FieldPath) => number;
|
|
271
|
+
/** the presence colour of whoever changed it last (list rows draw their own bar) */
|
|
272
|
+
color: (path: FieldPath) => string | undefined;
|
|
273
|
+
/** the host's change bar and hover card for a changed field (null when unchanged) */
|
|
274
|
+
bar: (path: FieldPath, field: FieldSchema) => React.ReactNode;
|
|
275
|
+
/** Show only changes: unchanged fields fold into one quiet line each run */
|
|
276
|
+
onlyChanges: boolean;
|
|
190
277
|
}
|
|
278
|
+
/** The title of the fieldset a field sits in (null outside one). A quiet meta-form drops a field label that only repeats
|
|
279
|
+
* its section's title ("Options" › "Options"): the section heading names it. */
|
|
280
|
+
export declare const KitSectionTitle: React.Context<string | null>;
|
|
191
281
|
export declare const DEFAULT_ENV: KitEnv;
|
|
192
282
|
/** D58 field access: fields in the `seo` group default to `{ edit: "seo.edit" }`. */
|
|
193
283
|
export declare const fieldAccessOf: (field: FieldSchema) => FieldAccess | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/context.tsx
|
|
4
4
|
/**
|
|
5
5
|
* Kit runtime contexts (V2 HEAD 9829bf1 kit/context.tsx).
|
|
6
6
|
*
|
|
@@ -120,6 +120,9 @@ var SITE_PALETTE = [
|
|
|
120
120
|
token: "neutral.50"
|
|
121
121
|
}
|
|
122
122
|
];
|
|
123
|
+
/** The title of the fieldset a field sits in (null outside one). A quiet meta-form drops a field label that only repeats
|
|
124
|
+
* its section's title ("Options" › "Options"): the section heading names it. */
|
|
125
|
+
var KitSectionTitle = React.createContext(null);
|
|
123
126
|
var DEFAULT_ENV = {
|
|
124
127
|
variant: "panel",
|
|
125
128
|
docId: "kit",
|
|
@@ -209,6 +212,6 @@ var FormCtx = React.createContext(null);
|
|
|
209
212
|
var FormProvider = FormCtx.Provider;
|
|
210
213
|
var useForm = () => React.useContext(FormCtx);
|
|
211
214
|
//#endregion
|
|
212
|
-
export { AI_PRESETS, DEFAULT_ENV, FieldHeaderSlot, FormProvider, KitEnvProvider, KitServicesProvider, SITE_PALETTE, fieldAccessOf, registerKitServices, resolveFieldAccess, seesDevSurfaces, useForm, useKitEnv, useKitServices, visibleFields, visibleSchema };
|
|
215
|
+
export { AI_PRESETS, DEFAULT_ENV, FieldHeaderSlot, FormProvider, KitEnvProvider, KitSectionTitle, KitServicesProvider, SITE_PALETTE, fieldAccessOf, registerKitServices, resolveFieldAccess, seesDevSurfaces, useForm, useKitEnv, useKitServices, visibleFields, visibleSchema };
|
|
213
216
|
|
|
214
217
|
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../src/context.tsx"],"sourcesContent":["/**\n * Kit runtime contexts (V2 HEAD 9829bf1 kit/context.tsx).\n *\n * - KitServices — pluggable app services (media library picker, upload sink, toast, AI rewrite, comment threads).\n * Hosts register theirs once (`registerKitServices`) or provide them (`KitServicesProvider`); the kit\n * never imports a feature. A service that is absent hides the surface that needs it.\n * - KitEnv — the editing environment a control renders in: variant (panel | document), doc identity, site\n * palette, permissions, presence, comments. Has safe defaults so a control can render alone.\n * - FormApi — present only inside <SchemaForm>: value, writes, navigation, issues, baselines, history.\n */\nimport * as React from \"react\";\nimport type { Cap } from \"./schema/sources\";\nimport type { FieldAccess, FieldPath, FieldSchema, Fieldset, TypeSchema } from \"./schema/types\";\nimport type { KitIssue } from \"./lib/validate\";\nimport type { ControlProps } from \"./types\";\nimport type { LinkTarget } from \"./controls/link\";\n\n/* ── Services ─────────────────────────────────────────────────────────── */\n/** The media asset a picker hands back (the host's media library row, narrowed to what the kit reads). */\nexport interface KitMediaAsset {\n id: string;\n url: string;\n name?: string;\n alt?: string;\n kind?: \"image\" | \"video\" | \"file\" | \"svg\";\n width?: number;\n height?: number;\n size?: number;\n}\nexport interface KitMediaPickerProps {\n open: boolean;\n onOpenChange: (v: boolean) => void;\n onPick: (assets: KitMediaAsset[]) => void;\n multiple?: boolean;\n accept?: (\"image\" | \"video\" | \"file\" | \"svg\")[];\n /** What the dialog is for, in the author's words (\"Replace icon\"). Absent: the host's own title. */\n title?: string;\n /** An icon's Remove, in the dialog's footer (its row has no room for one). Absent: no Remove. */\n onRemove?: () => void;\n /**\n * An icon's first tab: the icons already on this site, each with the value it is stored as. The field's own icon\n * leads, marked `current`: picking it closes the dialog with no write. Absent: no such tab.\n */\n icons?: KitSiteIcon[];\n onPickIcon?: (value: unknown) => void;\n}\n/** One icon already on the site (KitServices.useSiteIcons), as the picker's first tab draws it. */\nexport interface KitSiteIcon {\n url: string;\n value: unknown;\n assetId?: string;\n current?: boolean;\n}\nexport interface KitToastOptions {\n /** the second line under the message (V2 sonner `description`) */\n description?: string;\n action?: { label: string; onClick: () => void };\n duration?: number;\n icon?: React.ReactNode;\n}\n/** The host's toaster. The kit has no toast dependency (V2 re-exported sonner's). */\nexport interface KitToast {\n (message: string, opts?: KitToastOptions): void;\n success: (message: string, opts?: KitToastOptions) => void;\n}\n/** Rewrite with AI presets (V2 lib/ai.ts). The host's `aiRewrite` service produces the text. */\nexport type AiPreset = \"improve\" | \"shorter\" | \"longer\" | \"simplify\" | \"grammar\" | \"translate\";\nexport const AI_PRESETS: { id: AiPreset; label: string }[] = [\n { id: \"improve\", label: \"Improve\" },\n { id: \"shorter\", label: \"Shorter\" },\n { id: \"longer\", label: \"Longer\" },\n { id: \"simplify\", label: \"Simplify\" },\n { id: \"grammar\", label: \"Fix spelling & grammar\" },\n { id: \"translate\", label: \"Translate to Spanish\" },\n];\n/** The in-place field comments popover (V2 FieldThreads over the comments store), drawn by the host. */\nexport interface KitFieldCommentsProps {\n docId: string;\n /** pathKey of the field (\"items.1.answer\") */\n fieldKey: string;\n label: string;\n /** the field's text, first 80 characters */\n quote?: string;\n onClose: () => void;\n /** \"Open in panel\": set when the host has a comments panel (`env.onComment`) */\n onOpenPanel?: () => void;\n}\n/** One field's ⋯ menu, as the host's extra items see it (KitServices.FieldMenuExtras). */\nexport interface KitFieldMenuExtrasProps {\n field: FieldSchema;\n path: FieldPath;\n /** the field is read-only for the lens: a host offers nothing that edits */\n readOnly: boolean;\n}\n/* The popover around FieldComments keeps itself open on Escape while focus is on an element marked `data-esc-owner`\n (V2 guardEscape): the composer marks its input so Escape clears or blurs the draft instead of losing it. */\nexport interface KitServices {\n /** The media library picker. */\n MediaPicker?: React.ComponentType<KitMediaPickerProps>;\n /** Called after an upload so the host can file the assets into its media library. */\n onUploaded?: (assets: KitMediaAsset[]) => void;\n /**\n * Image placements keep their edits BESIDE the url (`${name}Alt` · `${name}Focal` · `${name}Crop` ·\n * `${name}Decorative`) instead of turning the value into an object — the Visuals block model.\n */\n imageSiblings?: boolean;\n /** Real metadata for an image url (the host's media library), so captions never show placeholders. */\n resolveImage?: (url: string) => { name?: string; width?: number; height?: number; size?: number } | undefined;\n /** The host's full image editor (crop, rotate, focal, alt…), opened in place. */\n editImage?: (req: { docId: string; path: FieldPath; title: string }) => void;\n /** The project's forms for `reference: { to: [\"form\"] }` (the host's Forms store). */\n forms?: () => { id: string; title: string; subtitle: string }[];\n /** Toasts for Copy / Paste / Reset / AI (each with Undo). Absent → the action still runs, silently. */\n toast?: KitToast;\n /**\n * A slug's \"Save new address\" with \"Redirect it to the new address\" ticked (V2 SlugControl): the host files the\n * redirect from the old slug to the new one. Absent → no checkbox is offered, and the toast says the old address\n * will return \"Not found\", which is what happens. A rejection is named in a toast (the new slug is already saved).\n */\n redirectSlug?: (from: string, to: string) => void | Promise<void>;\n /**\n * A slug's \"Save new address\": the host writes the new address before any redirect is filed. Absent → the form's\n * value is the save (V2). A rejection is named in a toast and the old-address box stays for another try.\n */\n saveSlug?: (to: string) => Promise<void>;\n /** Rewrite with AI. Absent → the ⋯ menu offers no rewrite. `attempt` counts \"Try again\" presses. */\n aiRewrite?: (text: string, preset: AiPreset, attempt: number) => string | Promise<string>;\n /** In-place field comments. Absent and no `env.onComment` → the field shows no add-comment control. */\n FieldComments?: React.ComponentType<KitFieldCommentsProps>;\n /**\n * A React hook: open (unresolved) threads on one field, read from the same store FieldComments draws (V2 counted\n * `useBlockThreads(docId, key)`). Used while the host has no `env.onComment`; absent → SchemaForm `comments` counts.\n */\n useFieldCommentCount?: (docId: string, fieldKey: string) => number;\n /**\n * The host's own control for a type (a FieldRenderer arm in the dashboard), drawn for a stored value a kit control\n * hands off because it cannot carry it unchanged (rich text, LegacyFallback). Bare inside the kit FieldShell, which\n * owns the label row and the help; the box is tagged `data-kit-legacy`. Absent → the field says why in words.\n */\n LegacyControl?: React.ComponentType<ControlProps>;\n /**\n * The host's own items for a field's ⋯ menu (the entry editor's Move up · Move down · Move to panel), drawn after\n * History and before Rewrite with AI. It renders kit `MenuItem`s, with its own leading `MenuSeparator`, or null.\n * Absent → the menu is exactly V2's.\n */\n FieldMenuExtras?: React.ComponentType<KitFieldMenuExtrasProps>;\n /**\n * A React HOOK: the project's pages and CMS items a link can point at (controls/link.tsx). The host passes the same\n * function for the life of the form (it is called on every render of a link control). Absent → the link picker says\n * page search isn't available and takes a typed path. `error` is a whole sentence naming what failed (\"Pages couldn't\n * be loaded: …\", \"Items from Blog couldn't be loaded: …\"); the picker shows it under whatever did load.\n */\n useLinkTargets?: () => { targets: LinkTarget[]; loading?: boolean; error?: string };\n /**\n * A React HOOK: every SVG the site already uses (its pages, header and footer, the library's SVGs), for an icon's\n * picker. The host passes the same function for the life of the form. Absent → the picker has no site tab.\n */\n useSiteIcons?: () => KitSiteIcon[];\n}\nlet registry: KitServices = {};\nconst listeners = new Set<() => void>();\n/** Register app services once at module load (e.g. the Content feature registers its media library). */\nexport function registerKitServices(s: KitServices) {\n registry = { ...registry, ...s };\n listeners.forEach((l) => l());\n}\nconst ServicesCtx = React.createContext<KitServices | null>(null);\nexport function KitServicesProvider({ value, children }: { value: KitServices; children: React.ReactNode }) {\n return <ServicesCtx.Provider value={value}>{children}</ServicesCtx.Provider>;\n}\nexport function useKitServices(): KitServices {\n const local = React.useContext(ServicesCtx);\n const global = React.useSyncExternalStore(\n (cb) => {\n listeners.add(cb);\n return () => listeners.delete(cb);\n },\n () => registry,\n () => registry,\n );\n return local ? { ...global, ...local } : global;\n}\n\n/** A host header element a top-level field (by path key) renders its actions into, instead of a label row. */\nexport const FieldHeaderSlot = React.createContext<{ key: string; el: HTMLElement } | null>(null);\n\n/* ── Environment ──────────────────────────────────────────────────────── */\nexport type KitVariant = \"panel\" | \"document\";\nexport interface KitPeer {\n id?: string;\n name: string;\n avatar?: string;\n /** presence colour (avatar ring, field border, caret flag) */\n color?: string;\n /** \"editing\" (soft lock + border) or \"viewing\" */\n status?: \"editing\" | \"viewing\";\n}\nexport interface Swatch {\n name: string;\n value: string;\n token?: string;\n}\n\n/** V2's demo site palette (Caldera). Hosts pass the project's brand palette through `env.palette`. */\nexport const SITE_PALETTE: Swatch[] = [\n { name: \"Ember\", value: \"#E0663B\", token: \"brand.ember\" },\n { name: \"Ochre\", value: \"#D97706\", token: \"brand.ochre\" },\n { name: \"Moss\", value: \"#4F6B4A\", token: \"brand.moss\" },\n { name: \"Lake\", value: \"#2563EB\", token: \"accent.lake\" },\n { name: \"Dusk\", value: \"#7C3AED\", token: \"accent.dusk\" },\n { name: \"Berry\", value: \"#DB2777\", token: \"accent.berry\" },\n { name: \"Char\", value: \"#1E1B18\", token: \"neutral.900\" },\n { name: \"Slate\", value: \"#4B5563\", token: \"neutral.600\" },\n { name: \"Bone\", value: \"#E7E0D6\", token: \"neutral.200\" },\n { name: \"Paper\", value: \"#F6F1EA\", token: \"neutral.50\" },\n];\n\nexport interface KitEnv {\n variant: KitVariant;\n /** Identity of the document/block being edited (rich-text sync, comments, history). */\n docId: string;\n /** The document's title — slug generation. */\n docTitle?: string;\n /** Public URL prefix for slug previews, e.g. \"caldera.bettercms.site/journal/\". */\n urlPrefix?: string;\n /** The document has been published (slug changes warn about the old address). */\n isPublished?: boolean;\n /**\n * The form's slug is the document's ADDRESS (a page's or an entry's URL). Only then does a changed slug on a published\n * document say the old address will stop working and offer the redirect. A slug prop or a key is not an address, so\n * it gets no such box (V2 draws it on document hosts only: its component-prop forms pass no published state).\n */\n slugIsAddress?: boolean;\n palette: Swatch[];\n /** The whole form is read-only for the lens (the host's content.edit rule, a generated twin…). */\n readOnly: boolean;\n /**\n * D58: the host's access check for the lens (`useCan` at the host). The kit never imports the store; it asks this for\n * field-level `access` and for developer surfaces (field keys, IDs, API names: `schema.view` or `api.view`).\n * Hosts that omit it (staff tools, demos) get allow-all.\n */\n can: (cap: Cap) => boolean;\n /** pathKey → teammates in that field */\n presence: Record<string, KitPeer[]>;\n /** pathKey → open comment threads */\n comments: Record<string, number>;\n /** Host comment panel. When absent, field comments live in the in-place popover only. */\n /** `quote`: the words selected in a rich text field when the comment came from its toolbar */\n onComment?: (path: FieldPath, field: FieldSchema, quote?: string) => void;\n /** The whole form is a global block (\"Navigation\") — every field is synced. */\n syncedFrom?: string;\n /** \"Open {title}\" on a reference card: the host edits the referenced entry in place (stacked panel). */\n onOpenReference?: (ref: { collectionId: string; entryId: string; title: string }) => void;\n /** CPO D39: \"inline\" (default) shows help under the label; \"tooltip\" moves it behind the ⓘ — for dense hosts (grid cells, popovers). */\n helpDisplay?: \"inline\" | \"tooltip\";\n /** D61 Review changes: the host's change markers, present only while its History panel is open. */\n review?: KitReview;\n /**\n * \"quiet\": a meta-form, like the schema editor's field settings (founder call, 2026-10-05). No comment, ⋯ or per-field\n * undo on the fields, and an on/off field is a label-left row with its switch on the right (the inspector's PRow), not a\n * switch card. \"preview\": the same chrome-free fields, controls exactly as editors see them (a schema preview, where a\n * comment would land on a sample, never a real document). Default \"full\".\n */\n fieldChrome?: \"full\" | \"preview\" | \"quiet\";\n /**\n * A host's own control for one field, by its path key (\"type\", \"options\"), drawn inside the usual shell. The schema\n * editor's field settings plug their Type, Options, Key and Show this field controls in here. Absent = kit controls only.\n */\n controls?: Record<string, React.ComponentType<ControlProps>>;\n /**\n * A collapsed fieldset's summary as chips, from the host (the schema editor's field settings: \"Required\", \"3 options\").\n * `undefined` falls back to the kit's own one-line summary. Keep it stable (a new function re-renders the form).\n */\n sectionSummary?: (set: Fieldset, value: Record<string, unknown>) => string[] | undefined;\n}\n\n/**\n * D61 Review changes, as the kit sees it. The host owns the history model; the kit only asks, per field path, whether\n * it changed in the range, and renders the host's marker (a 2px bar in the author's colour at the field's left edge,\n * with its hover card) where the at-rest \"changed\" dot would be.\n */\nexport interface KitReview {\n /** changes at or inside this field in the range (0 = unchanged) */\n count: (path: FieldPath) => number;\n /** the presence colour of whoever changed it last (list rows draw their own bar) */\n color: (path: FieldPath) => string | undefined;\n /** the host's change bar and hover card for a changed field (null when unchanged) */\n bar: (path: FieldPath, field: FieldSchema) => React.ReactNode;\n /** Show only changes: unchanged fields fold into one quiet line each run */\n onlyChanges: boolean;\n}\n\n/** The title of the fieldset a field sits in (null outside one). A quiet meta-form drops a field label that only repeats\n * its section's title (\"Options\" › \"Options\"): the section heading names it. */\nexport const KitSectionTitle = React.createContext<string | null>(null);\nexport const DEFAULT_ENV: KitEnv = {\n variant: \"panel\",\n docId: \"kit\",\n palette: [],\n readOnly: false,\n can: () => true,\n presence: {},\n comments: {},\n};\nconst EnvCtx = React.createContext<KitEnv>(DEFAULT_ENV);\n\n/** D58 field access: fields in the `seo` group default to `{ edit: \"seo.edit\" }`. */\nexport const fieldAccessOf = (field: FieldSchema): FieldAccess | undefined => field.access ?? (field.group === \"seo\" ? { edit: \"seo.edit\" } : undefined);\n\n/**\n * One field for the lens: hidden (no `view`), read-only (plain text: no `edit`, the field is `readOnly`, or the whole form\n * is read-only and the field has no edit cap of its own), or editable. An explicit `edit` cap wins over the form's\n * read-only rule, so an SEO specialist edits SEO fields inside a form they can't otherwise change.\n */\nexport function resolveFieldAccess(field: FieldSchema, env: Pick<KitEnv, \"can\" | \"readOnly\">): { hidden: boolean; readOnly: boolean } {\n const a = fieldAccessOf(field);\n if (a?.view && !env.can(a.view)) return { hidden: true, readOnly: true };\n if (field.readOnly === true) return { hidden: false, readOnly: true };\n if (a?.edit) return { hidden: false, readOnly: !env.can(a.edit) };\n return { hidden: false, readOnly: env.readOnly };\n}\n/** Drop the fields the lens can't `view` (recursively), so they are neither rendered nor validated. Same object back when\n * nothing is hidden. Values of dropped fields stay in the document untouched. */\nexport function visibleFields(fields: FieldSchema[], can: KitEnv[\"can\"]): FieldSchema[] {\n let changed = false;\n const out: FieldSchema[] = [];\n for (const f of fields) {\n const a = fieldAccessOf(f);\n if (a?.view && !can(a.view)) {\n changed = true;\n continue;\n }\n let g = f;\n if (f.fields) {\n const n = visibleFields(f.fields, can);\n if (n !== f.fields) g = { ...g, fields: n };\n }\n if (Array.isArray(f.of)) {\n const n = visibleFields(f.of, can);\n if (n !== f.of) g = { ...g, of: n };\n }\n if (f.slotSettings) {\n const n = visibleFields(f.slotSettings, can);\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}\nexport function visibleSchema(schema: TypeSchema, can: KitEnv[\"can\"]): TypeSchema {\n const fields = visibleFields(schema.fields, can);\n return fields === schema.fields ? schema : { ...schema, fields };\n}\n\n/** Developer surfaces (field keys, API names, IDs): `schema.view` or `api.view`. */\nexport const seesDevSurfaces = (env: Pick<KitEnv, \"can\">) => env.can(\"schema.view\") || env.can(\"api.view\");\nexport const KitEnvProvider = EnvCtx.Provider;\nexport const useKitEnv = () => React.useContext(EnvCtx);\n\n/* ── Form runtime (inside <SchemaForm>) ──────────────────────────────── */\nexport interface HistoryEntry {\n value: unknown;\n at: number;\n by: string;\n label?: string;\n}\nexport interface FormApi {\n schema: TypeSchema;\n value: Record<string, unknown>;\n /** write a value; `record: false` skips the field undo/history stack (e.g. programmatic sync) */\n setAt: (path: FieldPath, v: unknown, opts?: { record?: boolean; label?: string }) => void;\n getAt: (path: FieldPath) => unknown;\n /** value when the form mounted (field undo baseline) */\n baselineAt: (path: FieldPath) => unknown;\n /** published value (changed dot, Reset to published); undefined when never published */\n publishedAt: (path: FieldPath) => unknown;\n hasPublished: boolean;\n /** component instances (CPO D28): top-level fields inherit from a component unless overridden */\n inherited?: { from: string; isOverridden: (key: string) => boolean; reset: (key: string) => void };\n /** the current navigation path (drill-in stack) */\n path: FieldPath;\n navigate: (path: FieldPath) => void;\n /** the form draws frames for a non-root path. False while SchemaForm renders only the root frame: History and\n * drill-in rows hide or go inert instead of navigating to a path nothing shows (no silent no-op). */\n canNavigate: boolean;\n resolveSchema?: (blockType: string) => TypeSchema | undefined;\n /** blocks offered by \"+ Add block\" in slots (filtered by each slot's allow list) */\n blockLibrary?: TypeSchema[];\n /** all issues by pathKey */\n issues: Map<string, KitIssue>;\n /** the issue shown for a key (rules on blur, required after blur or a publish attempt) */\n visibleIssue: (key: string) => KitIssue | undefined;\n /** visible issues under a path prefix (rollup dots on rows, crumbs and tabs) */\n rollup: (prefix: FieldPath) => { errors: number; warnings: number };\n touch: (key: string) => void;\n showAllErrors: boolean;\n /** per-field undo (Undo last change to {label}) */\n canUndo: (key: string) => boolean;\n undo: (key: string) => void;\n /** versions of a field this session (newest first) */\n history: (key: string) => HistoryEntry[];\n /** the last change to this field came from AI (⋯ shows \"Undo AI change\") */\n aiKeys: Set<string>;\n markAi: (key: string, on: boolean) => void;\n /** remembered UI state per frame (selected group tab, open fieldsets) */\n memory: Map<string, unknown>;\n}\nconst FormCtx = React.createContext<FormApi | null>(null);\nexport const FormProvider = FormCtx.Provider;\nexport const useForm = () => React.useContext(FormCtx);\n"],"mappings":";;;;;;;;;;;;;AAmEA,IAAa,aAAgD;CAC3D;EAAE,IAAI;EAAW,OAAO;CAAU;CAClC;EAAE,IAAI;EAAW,OAAO;CAAU;CAClC;EAAE,IAAI;EAAU,OAAO;CAAS;CAChC;EAAE,IAAI;EAAY,OAAO;CAAW;CACpC;EAAE,IAAI;EAAW,OAAO;CAAyB;CACjD;EAAE,IAAI;EAAa,OAAO;CAAuB;AACnD;AAqFA,IAAI,WAAwB,CAAC;AAC7B,IAAM,4BAAY,IAAI,IAAgB;;AAEtC,SAAgB,oBAAoB,GAAgB;CAClD,WAAW;EAAE,GAAG;EAAU,GAAG;CAAE;CAC/B,UAAU,SAAS,MAAM,EAAE,CAAC;AAC9B;AACA,IAAM,cAAc,MAAM,cAAkC,IAAI;AAChE,SAAgB,oBAAoB,EAAE,OAAO,YAA+D;CAC1G,OAAO,oBAAC,YAAY,UAAb;EAA6B;EAAQ;CAA+B,CAAA;AAC7E;AACA,SAAgB,iBAA8B;CAC5C,MAAM,QAAQ,MAAM,WAAW,WAAW;CAC1C,MAAM,SAAS,MAAM,sBAClB,OAAO;EACN,UAAU,IAAI,EAAE;EAChB,aAAa,UAAU,OAAO,EAAE;CAClC,SACM,gBACA,QACR;CACA,OAAO,QAAQ;EAAE,GAAG;EAAQ,GAAG;CAAM,IAAI;AAC3C;;AAGA,IAAa,kBAAkB,MAAM,cAAuD,IAAI;;AAoBhG,IAAa,eAAyB;CACpC;EAAE,MAAM;EAAS,OAAO;EAAW,OAAO;CAAc;CACxD;EAAE,MAAM;EAAS,OAAO;EAAW,OAAO;CAAc;CACxD;EAAE,MAAM;EAAQ,OAAO;EAAW,OAAO;CAAa;CACtD;EAAE,MAAM;EAAQ,OAAO;EAAW,OAAO;CAAc;CACvD;EAAE,MAAM;EAAQ,OAAO;EAAW,OAAO;CAAc;CACvD;EAAE,MAAM;EAAS,OAAO;EAAW,OAAO;CAAe;CACzD;EAAE,MAAM;EAAQ,OAAO;EAAW,OAAO;CAAc;CACvD;EAAE,MAAM;EAAS,OAAO;EAAW,OAAO;CAAc;CACxD;EAAE,MAAM;EAAQ,OAAO;EAAW,OAAO;CAAc;CACvD;EAAE,MAAM;EAAS,OAAO;EAAW,OAAO;CAAa;AACzD;;;AA+EA,IAAa,kBAAkB,MAAM,cAA6B,IAAI;AACtE,IAAa,cAAsB;CACjC,SAAS;CACT,OAAO;CACP,SAAS,CAAC;CACV,UAAU;CACV,WAAW;CACX,UAAU,CAAC;CACX,UAAU,CAAC;AACb;AACA,IAAM,SAAS,MAAM,cAAsB,WAAW;;AAGtD,IAAa,iBAAiB,UAAgD,MAAM,WAAW,MAAM,UAAU,QAAQ,EAAE,MAAM,WAAW,IAAI,KAAA;;;;;;AAO9I,SAAgB,mBAAmB,OAAoB,KAA+E;CACpI,MAAM,IAAI,cAAc,KAAK;CAC7B,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,IAAI,GAAG,OAAO;EAAE,QAAQ;EAAM,UAAU;CAAK;CACvE,IAAI,MAAM,aAAa,MAAM,OAAO;EAAE,QAAQ;EAAO,UAAU;CAAK;CACpE,IAAI,GAAG,MAAM,OAAO;EAAE,QAAQ;EAAO,UAAU,CAAC,IAAI,IAAI,EAAE,IAAI;CAAE;CAChE,OAAO;EAAE,QAAQ;EAAO,UAAU,IAAI;CAAS;AACjD;;;AAGA,SAAgB,cAAc,QAAuB,KAAmC;CACtF,IAAI,UAAU;CACd,MAAM,MAAqB,CAAC;CAC5B,KAAK,MAAM,KAAK,QAAQ;EACtB,MAAM,IAAI,cAAc,CAAC;EACzB,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG;GAC3B,UAAU;GACV;EACF;EACA,IAAI,IAAI;EACR,IAAI,EAAE,QAAQ;GACZ,MAAM,IAAI,cAAc,EAAE,QAAQ,GAAG;GACrC,IAAI,MAAM,EAAE,QAAQ,IAAI;IAAE,GAAG;IAAG,QAAQ;GAAE;EAC5C;EACA,IAAI,MAAM,QAAQ,EAAE,EAAE,GAAG;GACvB,MAAM,IAAI,cAAc,EAAE,IAAI,GAAG;GACjC,IAAI,MAAM,EAAE,IAAI,IAAI;IAAE,GAAG;IAAG,IAAI;GAAE;EACpC;EACA,IAAI,EAAE,cAAc;GAClB,MAAM,IAAI,cAAc,EAAE,cAAc,GAAG;GAC3C,IAAI,MAAM,EAAE,cAAc,IAAI;IAAE,GAAG;IAAG,cAAc;GAAE;EACxD;EACA,IAAI,MAAM,GAAG,UAAU;EACvB,IAAI,KAAK,CAAC;CACZ;CACA,OAAO,UAAU,MAAM;AACzB;AACA,SAAgB,cAAc,QAAoB,KAAgC;CAChF,MAAM,SAAS,cAAc,OAAO,QAAQ,GAAG;CAC/C,OAAO,WAAW,OAAO,SAAS,SAAS;EAAE,GAAG;EAAQ;CAAO;AACjE;;AAGA,IAAa,mBAAmB,QAA6B,IAAI,IAAI,aAAa,KAAK,IAAI,IAAI,UAAU;AACzG,IAAa,iBAAiB,OAAO;AACrC,IAAa,kBAAkB,MAAM,WAAW,MAAM;AAkDtD,IAAM,UAAU,MAAM,cAA8B,IAAI;AACxD,IAAa,eAAe,QAAQ;AACpC,IAAa,gBAAgB,MAAM,WAAW,OAAO"}
|
|
@@ -24,21 +24,24 @@ export declare function ButtonStyleGrid({ v, onPick, "aria-label": ariaLabel, si
|
|
|
24
24
|
size?: "sm" | "md";
|
|
25
25
|
}): import("react/jsx-runtime").JSX.Element;
|
|
26
26
|
/**
|
|
27
|
-
* The button as
|
|
28
|
-
* site
|
|
27
|
+
* The site's button as the site draws it (V2 link.tsx ButtonPreview: the site palette, not app tokens). On the preview
|
|
28
|
+
* paper it keeps the site's own colours in both themes; `chrome` = drawn on app chrome (the style grid), where the
|
|
29
|
+
* dark-ink styles flip so they still read on a dark panel. Prod looks beyond the four: brand as primary, dark as
|
|
30
|
+
* secondary, any other in the muted kit fill.
|
|
29
31
|
*/
|
|
30
|
-
export declare function ButtonPreview({ v, className, small,
|
|
32
|
+
export declare function ButtonPreview({ v, className, small, chrome }: {
|
|
31
33
|
v: LinkValue;
|
|
32
34
|
className?: string;
|
|
33
35
|
small?: boolean;
|
|
34
|
-
|
|
36
|
+
chrome?: boolean;
|
|
35
37
|
}): import("react/jsx-runtime").JSX.Element;
|
|
36
38
|
/** A 16px neutral glyph of the style (filled · outlined · underlined) — brand-free, so the field stays calm. */
|
|
37
39
|
export declare function StyleGlyph({ style, className }: {
|
|
38
40
|
style?: string;
|
|
39
41
|
className?: string;
|
|
40
42
|
}): import("react/jsx-runtime").JSX.Element;
|
|
41
|
-
/** The leading-icon picker
|
|
43
|
+
/** The leading-icon picker over BUTTON_ICONS, "No icon" first: V2's IconPickerGrid (icon.tsx) — search box, 8-column
|
|
44
|
+
* grid in a 224px scroll. The tiles stay one radiogroup (the dash's semantics; V2 draws a listbox). */
|
|
42
45
|
export declare function ButtonIconPicker({ value, onPick }: {
|
|
43
46
|
value?: string;
|
|
44
47
|
onPick: (icon: string | undefined) => void;
|
|
@@ -56,3 +59,14 @@ export declare function ButtonScreen({ value, onChange, readOnly, title }: {
|
|
|
56
59
|
* [page icon] Title /path → edits the link in place
|
|
57
60
|
*/
|
|
58
61
|
export declare function ButtonControl({ value, onChange, readOnly, id, path, field }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
62
|
+
export declare function ButtonLinkEditor({ value, onChange, onSubmit, styles, labelFirst, }: {
|
|
63
|
+
value: LinkValue;
|
|
64
|
+
onChange: (v: LinkValue) => void;
|
|
65
|
+
onSubmit?: () => void;
|
|
66
|
+
/** null = a plain text link (nav, footer and legal links): no style row. */
|
|
67
|
+
styles?: {
|
|
68
|
+
value: ButtonStyle;
|
|
69
|
+
label: string;
|
|
70
|
+
}[] | null;
|
|
71
|
+
labelFirst?: boolean;
|
|
72
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
import { BUTTON_VARIANTS, DOCK_ICON_NAME_SET } from "../adapters/prod-types.js";
|
|
1
2
|
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { useForm, useKitEnv } from "../context.js";
|
|
2
4
|
import { isObj } from "../lib/path.js";
|
|
3
5
|
import { KIT_ICONS, KitIcon, iconLabel } from "../lib/icons.js";
|
|
4
|
-
import { BUTTON_VARIANTS, DOCK_ICON_NAME_SET } from "../adapters/prod-types.js";
|
|
5
|
-
import { useForm, useKitEnv } from "../context.js";
|
|
6
6
|
import { Segmented, Switch } from "../ui/controls.js";
|
|
7
7
|
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from "../ui/overlay.js";
|
|
8
|
-
import { Input } from "../ui/input.js";
|
|
9
8
|
import { FieldUnit } from "../engine/grouping.js";
|
|
10
|
-
import {
|
|
9
|
+
import { Input } from "../ui/input.js";
|
|
10
|
+
import { LinkForm, LinkLine, LinkQuickEdit, TARGET_KEYS, finalizeLink, findTarget, hasLink, linkText, normLink, storedLink, useLinkTargets } from "./link.js";
|
|
11
11
|
import * as React from "react";
|
|
12
|
-
import { IconArrowRight, IconChevronDown, IconChevronRight, IconSearch } from "@tabler/icons-react";
|
|
13
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
-
|
|
13
|
+
import { IconArrowRight, IconChevronDown, IconChevronRight, IconSearch, IconX } from "@tabler/icons-react";
|
|
14
|
+
//#region src/controls/button.tsx
|
|
15
15
|
/**
|
|
16
16
|
* BUTTON — label + link + look as ONE unit (V2 HEAD kit/controls/link.tsx "Button", DESIGN §8.8, CPO D43 · D45 · D46).
|
|
17
17
|
*
|
|
@@ -32,10 +32,10 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
32
32
|
* "Full width" writes `fullWidth: true`, and off writes `false` only where the stored value had the key (as Show arrow);
|
|
33
33
|
* every renderer draws it (hosted `bcms-btn-full`, the SDKs' and in-place publishing's `data-full-width`).
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
35
|
+
* Deviation from V2, because prod has nothing behind it: an unset look reads "Default" (V2 drew Primary, and guessed
|
|
36
|
+
* Outline for a field named "secondary"). The preview is V2's: the site palette (--kit-preview-paper / -ink / -primary /
|
|
37
|
+
* -primary-on / -contrast / -contrast-on / -outline, which a host may set to the project's colours) on the paper, and the
|
|
38
|
+
* chrome swatches in the style grid.
|
|
39
39
|
*/
|
|
40
40
|
var STYLE_ITEMS = [
|
|
41
41
|
{
|
|
@@ -134,7 +134,8 @@ function ButtonStyleGrid({ v, onPick, "aria-label": ariaLabel, size = "md" }) {
|
|
|
134
134
|
icon: void 0,
|
|
135
135
|
arrow: false
|
|
136
136
|
},
|
|
137
|
-
small: true
|
|
137
|
+
small: true,
|
|
138
|
+
chrome: true
|
|
138
139
|
}), /* @__PURE__ */ jsx("span", {
|
|
139
140
|
className: "truncate",
|
|
140
141
|
children: s.label
|
|
@@ -144,14 +145,17 @@ function ButtonStyleGrid({ v, onPick, "aria-label": ariaLabel, size = "md" }) {
|
|
|
144
145
|
});
|
|
145
146
|
}
|
|
146
147
|
/**
|
|
147
|
-
* The button as
|
|
148
|
-
* site
|
|
148
|
+
* The site's button as the site draws it (V2 link.tsx ButtonPreview: the site palette, not app tokens). On the preview
|
|
149
|
+
* paper it keeps the site's own colours in both themes; `chrome` = drawn on app chrome (the style grid), where the
|
|
150
|
+
* dark-ink styles flip so they still read on a dark panel. Prod looks beyond the four: brand as primary, dark as
|
|
151
|
+
* secondary, any other in the muted kit fill.
|
|
149
152
|
*/
|
|
150
|
-
function ButtonPreview({ v, className, small,
|
|
151
|
-
const
|
|
153
|
+
function ButtonPreview({ v, className, small, chrome }) {
|
|
154
|
+
const look = lookOf(v) ?? "primary";
|
|
155
|
+
const style = look === "brand" ? "primary" : look === "dark" ? "secondary" : look;
|
|
152
156
|
const size = small ? "sm" : v.size ?? "md";
|
|
153
157
|
return /* @__PURE__ */ jsxs("span", {
|
|
154
|
-
className: cn("inline-flex max-w-full items-center justify-center gap-1.5 truncate font-medium transition-colors", size === "sm" ? "h-6 rounded-kit-md px-2 text-kit-xs" : size === "lg" ? "h-10 rounded-kit-lg px-4 text-kit-base" : "h-8 rounded-kit-lg px-3 text-kit-sm",
|
|
158
|
+
className: cn("inline-flex max-w-full items-center justify-center gap-1.5 truncate font-medium transition-colors", size === "sm" ? "h-6 rounded-kit-md px-2 text-kit-xs" : size === "lg" ? "h-10 rounded-kit-lg px-4 text-kit-base" : "h-8 rounded-kit-lg px-3 text-kit-sm", style === "primary" && "bg-kit-preview-primary text-kit-preview-primary-on", style === "secondary" && (chrome ? "bg-kit-preview-contrast text-kit-preview-contrast-on" : "bg-kit-preview-ink text-kit-preview-paper"), style === "outline" && (chrome ? "border border-kit-preview-outline text-kit-fg" : "border border-kit-preview-ink/25 text-kit-preview-ink"), style === "link" && "h-auto px-0 text-kit-preview-primary underline underline-offset-4", !STYLE_ITEMS.some((x) => x.value === style) && "bg-kit-muted text-kit-fg", v.fullWidth && !small && "w-full", className),
|
|
155
159
|
children: [
|
|
156
160
|
v.icon ? /* @__PURE__ */ jsx(KitIcon, {
|
|
157
161
|
name: v.icon,
|
|
@@ -168,14 +172,6 @@ function ButtonPreview({ v, className, small, site }) {
|
|
|
168
172
|
]
|
|
169
173
|
});
|
|
170
174
|
}
|
|
171
|
-
/** V2's site preview: primary in the brand colour, secondary / dark as ink on paper, outline as an ink hairline. */
|
|
172
|
-
function siteLook(style) {
|
|
173
|
-
if (style === "link") return "h-auto px-0 text-[color:var(--kit-preview-primary,var(--kit-fg))] underline underline-offset-4";
|
|
174
|
-
if (style === "outline") return "border border-[color:var(--kit-preview-line,var(--kit-line-strong))] text-[color:var(--kit-preview-ink,var(--kit-fg))]";
|
|
175
|
-
if (style === "primary" || style === "brand") return "bg-[color:var(--kit-preview-primary,var(--kit-inverse))] text-[color:var(--kit-preview-primary-on,var(--kit-fg-inverse))]";
|
|
176
|
-
if (style === "dark") return "bg-[color:var(--kit-preview-ink,var(--kit-inverse))] text-[color:var(--kit-preview-paper,var(--kit-fg-inverse))]";
|
|
177
|
-
return "bg-[color:var(--kit-preview-ink,var(--kit-muted))] text-[color:var(--kit-preview-paper,var(--kit-fg))]";
|
|
178
|
-
}
|
|
179
175
|
/** A 16px neutral glyph of the style (filled · outlined · underlined) — brand-free, so the field stays calm. */
|
|
180
176
|
function StyleGlyph({ style, className }) {
|
|
181
177
|
return /* @__PURE__ */ jsx("span", {
|
|
@@ -184,57 +180,70 @@ function StyleGlyph({ style, className }) {
|
|
|
184
180
|
children: style === "link" ? /* @__PURE__ */ jsx("span", { className: "h-[2px] w-3.5 rounded-full bg-kit-fg-2" }) : /* @__PURE__ */ jsx("span", { className: cn("h-2.5 w-4 rounded-[3px]", style === "outline" ? "border-[1.5px] border-kit-fg-2" : style === "secondary" || style === "light" || style === "tertiary" ? "bg-kit-fg-3" : "bg-kit-fg") })
|
|
185
181
|
});
|
|
186
182
|
}
|
|
187
|
-
/** The leading-icon picker
|
|
183
|
+
/** The leading-icon picker over BUTTON_ICONS, "No icon" first: V2's IconPickerGrid (icon.tsx) — search box, 8-column
|
|
184
|
+
* grid in a 224px scroll. The tiles stay one radiogroup (the dash's semantics; V2 draws a listbox). */
|
|
188
185
|
function ButtonIconPicker({ value, onPick }) {
|
|
189
186
|
const [q, setQ] = React.useState("");
|
|
190
187
|
const query = q.trim().toLowerCase();
|
|
191
188
|
const shown = query ? BUTTON_ICONS.filter((n) => n.includes(query.replace(/\s+/g, "-"))) : BUTTON_ICONS;
|
|
189
|
+
const tile = (on) => cn("flex aspect-square items-center justify-center rounded-kit-md text-kit-fg-2 transition-colors hover:bg-kit-hover hover:text-kit-fg", on && "bg-kit-selected text-kit-fg ring-1 ring-inset ring-kit-line-strong");
|
|
192
190
|
return /* @__PURE__ */ jsxs("div", {
|
|
191
|
+
"data-icon-picker": true,
|
|
193
192
|
className: "flex flex-col gap-2",
|
|
194
|
-
children: [
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
193
|
+
children: [/* @__PURE__ */ jsxs("label", {
|
|
194
|
+
className: "flex h-8 items-center gap-2 rounded-kit-md bg-kit-muted px-2.5 text-kit-fg-3 focus-within:bg-kit-field-bg focus-within:ring-1 focus-within:ring-kit-line-strong",
|
|
195
|
+
children: [/* @__PURE__ */ jsx(IconSearch, {
|
|
196
|
+
className: "size-4 shrink-0",
|
|
197
|
+
stroke: 1.5,
|
|
198
|
+
"aria-hidden": true
|
|
199
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
200
|
+
autoFocus: true,
|
|
199
201
|
value: q,
|
|
200
202
|
onChange: (e) => setQ(e.target.value),
|
|
201
203
|
placeholder: "Search icons",
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
204
|
+
"aria-label": "Search icons",
|
|
205
|
+
className: "h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-3"
|
|
206
|
+
})]
|
|
207
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
208
|
+
className: "max-h-56 overflow-y-auto pr-0.5",
|
|
209
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
205
210
|
role: "radiogroup",
|
|
206
211
|
"aria-label": "Leading icon",
|
|
207
|
-
className: "grid
|
|
212
|
+
className: "grid gap-0.5",
|
|
213
|
+
style: { gridTemplateColumns: "repeat(8, minmax(0, 1fr))" },
|
|
208
214
|
children: [query ? null : /* @__PURE__ */ jsx("button", {
|
|
209
215
|
type: "button",
|
|
210
216
|
role: "radio",
|
|
211
217
|
"aria-checked": !value,
|
|
212
218
|
"aria-label": "No icon",
|
|
213
219
|
onClick: () => onPick(void 0),
|
|
214
|
-
className:
|
|
215
|
-
children: /* @__PURE__ */ jsx(
|
|
220
|
+
className: tile(!value),
|
|
221
|
+
children: /* @__PURE__ */ jsx(IconX, {
|
|
222
|
+
className: "size-4",
|
|
223
|
+
stroke: 1.5,
|
|
224
|
+
"aria-hidden": true
|
|
225
|
+
})
|
|
216
226
|
}), shown.map((n) => /* @__PURE__ */ jsx("button", {
|
|
217
227
|
type: "button",
|
|
218
228
|
role: "radio",
|
|
219
229
|
"aria-checked": value === n,
|
|
220
230
|
"aria-label": iconLabel(n),
|
|
221
231
|
onClick: () => onPick(n),
|
|
222
|
-
className:
|
|
232
|
+
className: tile(value === n),
|
|
223
233
|
children: /* @__PURE__ */ jsx(KitIcon, {
|
|
224
234
|
name: n,
|
|
225
|
-
className: "size-
|
|
235
|
+
className: "size-[18px]"
|
|
226
236
|
})
|
|
227
237
|
}, n))]
|
|
228
|
-
}),
|
|
229
|
-
|
|
230
|
-
className: "px-1 text-kit-xs text-kit-fg-3",
|
|
238
|
+
}), shown.length === 0 ? /* @__PURE__ */ jsxs("p", {
|
|
239
|
+
className: "py-6 text-center text-kit-sm text-kit-fg-3",
|
|
231
240
|
children: [
|
|
232
|
-
"No
|
|
233
|
-
q
|
|
234
|
-
"
|
|
241
|
+
"No icons match “",
|
|
242
|
+
q,
|
|
243
|
+
"”"
|
|
235
244
|
]
|
|
236
|
-
}) : null
|
|
237
|
-
]
|
|
245
|
+
}) : null]
|
|
246
|
+
})]
|
|
238
247
|
});
|
|
239
248
|
}
|
|
240
249
|
/** The ONE button screen: preview · label · link (+ new tab, rel) · appearance (style, size, icon, arrow). */
|
|
@@ -251,11 +260,8 @@ function ButtonScreen({ value, onChange, readOnly, title = "Button" }) {
|
|
|
251
260
|
children: [
|
|
252
261
|
/* @__PURE__ */ jsx("div", {
|
|
253
262
|
"data-button-preview": "",
|
|
254
|
-
className: "flex min-h-20 items-center justify-center rounded-kit-lg bg-
|
|
255
|
-
children: /* @__PURE__ */ jsx(ButtonPreview, {
|
|
256
|
-
v,
|
|
257
|
-
site: true
|
|
258
|
-
})
|
|
263
|
+
className: "flex min-h-20 items-center justify-center rounded-kit-lg bg-kit-preview-paper px-4 py-5 [filter:var(--kit-paper-filter)]",
|
|
264
|
+
children: /* @__PURE__ */ jsx(ButtonPreview, { v })
|
|
259
265
|
}),
|
|
260
266
|
/* @__PURE__ */ jsx(Row, {
|
|
261
267
|
label: "Label",
|
|
@@ -329,7 +335,7 @@ function ButtonScreen({ value, onChange, readOnly, title = "Button" }) {
|
|
|
329
335
|
children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
|
|
330
336
|
render: /* @__PURE__ */ jsx("button", {
|
|
331
337
|
type: "button",
|
|
332
|
-
className: "flex h-8 w-full items-center gap-2 rounded-kit-md border border-kit-field-border bg-kit-field-bg px-2.5 text-left text-kit-sm text-kit-fg
|
|
338
|
+
className: "flex h-8 w-full items-center gap-2 rounded-kit-md border border-kit-field-border bg-kit-field-bg px-2.5 text-left text-kit-sm text-kit-fg hover:border-kit-field-border-hover"
|
|
333
339
|
}),
|
|
334
340
|
children: [
|
|
335
341
|
v.icon ? /* @__PURE__ */ jsx(KitIcon, {
|
|
@@ -472,7 +478,7 @@ function ButtonControl({ value, onChange, readOnly, id, path, field }) {
|
|
|
472
478
|
type: "button",
|
|
473
479
|
disabled: readOnly,
|
|
474
480
|
onClick: () => setEditingLink(true),
|
|
475
|
-
"aria-label": hasLink(v) ? `${field.title} link: ${
|
|
481
|
+
"aria-label": hasLink(v) ? `${field.title} link: ${linkText(v)}. Edit link` : `Add a link to ${field.title.toLowerCase()}`,
|
|
476
482
|
className: cn("flex w-full min-w-0 items-center px-2.5 text-left outline-none transition-colors hover:bg-kit-hover focus-visible:bg-kit-hover disabled:cursor-default disabled:hover:bg-transparent", h),
|
|
477
483
|
children: /* @__PURE__ */ jsx(LinkLine, {
|
|
478
484
|
v,
|
|
@@ -501,7 +507,72 @@ function ButtonControl({ value, onChange, readOnly, id, path, field }) {
|
|
|
501
507
|
})]
|
|
502
508
|
});
|
|
503
509
|
}
|
|
510
|
+
function ButtonLinkEditor({ value, onChange, onSubmit, styles = STYLE_ITEMS, labelFirst = true }) {
|
|
511
|
+
const v = normLink(value);
|
|
512
|
+
const labelId = React.useId();
|
|
513
|
+
const setStyle = (s) => onChange({
|
|
514
|
+
...v,
|
|
515
|
+
style: s,
|
|
516
|
+
variant: s
|
|
517
|
+
});
|
|
518
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
519
|
+
className: "flex flex-col gap-3",
|
|
520
|
+
children: [
|
|
521
|
+
labelFirst ? /* @__PURE__ */ jsxs("div", {
|
|
522
|
+
className: "flex flex-col gap-1.5",
|
|
523
|
+
children: [/* @__PURE__ */ jsx("label", {
|
|
524
|
+
htmlFor: labelId,
|
|
525
|
+
className: "text-kit-xs font-medium text-kit-fg-2",
|
|
526
|
+
children: "Label"
|
|
527
|
+
}), /* @__PURE__ */ jsx(Input, {
|
|
528
|
+
id: labelId,
|
|
529
|
+
size: "sm",
|
|
530
|
+
autoFocus: true,
|
|
531
|
+
value: v.label ?? "",
|
|
532
|
+
onChange: (e) => onChange({
|
|
533
|
+
...v,
|
|
534
|
+
label: e.target.value
|
|
535
|
+
}),
|
|
536
|
+
onKeyDown: (e) => e.key === "Enter" && (e.preventDefault(), onSubmit?.()),
|
|
537
|
+
placeholder: "Shop cookware"
|
|
538
|
+
})]
|
|
539
|
+
}) : null,
|
|
540
|
+
/* @__PURE__ */ jsxs("div", {
|
|
541
|
+
className: "flex flex-col gap-2.5",
|
|
542
|
+
role: "group",
|
|
543
|
+
"aria-label": "Link",
|
|
544
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
545
|
+
className: "text-kit-xs font-medium text-kit-fg-2",
|
|
546
|
+
children: "Link"
|
|
547
|
+
}), /* @__PURE__ */ jsx(LinkForm, {
|
|
548
|
+
value: v,
|
|
549
|
+
onChange: (n) => onChange({
|
|
550
|
+
...v,
|
|
551
|
+
...n,
|
|
552
|
+
label: v.label,
|
|
553
|
+
style: v.style,
|
|
554
|
+
variant: v.variant
|
|
555
|
+
}),
|
|
556
|
+
onEnter: () => onSubmit?.()
|
|
557
|
+
})]
|
|
558
|
+
}),
|
|
559
|
+
styles ? /* @__PURE__ */ jsxs("div", {
|
|
560
|
+
className: "flex items-center justify-between gap-3 border-t border-kit-line pt-2.5",
|
|
561
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
562
|
+
className: "text-kit-xs text-kit-fg-2",
|
|
563
|
+
children: "Style"
|
|
564
|
+
}), /* @__PURE__ */ jsx(Segmented, {
|
|
565
|
+
size: "sm",
|
|
566
|
+
"aria-label": "Button style",
|
|
567
|
+
value: v.style ?? "primary",
|
|
568
|
+
onChange: (s) => setStyle(s),
|
|
569
|
+
items: styles
|
|
570
|
+
})]
|
|
571
|
+
}) : null
|
|
572
|
+
]
|
|
573
|
+
});
|
|
574
|
+
}
|
|
504
575
|
//#endregion
|
|
505
|
-
export { ButtonControl, ButtonScreen };
|
|
576
|
+
export { BUTTON_ICONS, ButtonControl, ButtonIconPicker, ButtonLinkEditor, ButtonPreview, ButtonScreen, ButtonStyleGrid, STYLE_ITEMS, StyleGlyph, lookLabel, lookOf, nextButton };
|
|
506
577
|
|
|
507
578
|
//# sourceMappingURL=button.js.map
|