@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,11 +1,14 @@
|
|
|
1
1
|
import { cn } from "../../lib/cn.js";
|
|
2
2
|
import { useKitServices } from "../../context.js";
|
|
3
3
|
import { Button, IconButton } from "../../ui/button.js";
|
|
4
|
-
import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Tooltip } from "../../ui/overlay.js";
|
|
4
|
+
import { Menu, MenuContent, MenuItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Tooltip } from "../../ui/overlay.js";
|
|
5
|
+
import { eventKey } from "../../lib/key-event.js";
|
|
6
|
+
import { useCatalogComponents } from "./catalog.js";
|
|
7
|
+
import { ComponentPanel, closeComponentPanel, openComponentPanel, useComponentPanel } from "./component-panel.js";
|
|
5
8
|
import * as React from "react";
|
|
6
|
-
import { IconAlertTriangle, IconArrowDown, IconArrowUp, IconComponents, IconCopy, IconDots, IconLayoutNavbarCollapse, IconLayoutNavbarExpand, IconLink, IconRefresh, IconTrash, IconUnlink } from "@tabler/icons-react";
|
|
7
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
-
|
|
10
|
+
import { IconAdjustmentsHorizontal, IconAlertTriangle, IconArrowBarToDown, IconArrowBarToUp, IconArrowUpRight, IconCheck, IconComponents, IconCopy, IconDots, IconGripVertical, IconLayoutNavbarCollapse, IconLayoutNavbarExpand, IconLink, IconRefresh, IconReplace, IconRestore, IconTrash, IconUnlink } from "@tabler/icons-react";
|
|
11
|
+
//#region src/controls/rich-text/component-card.tsx
|
|
9
12
|
/**
|
|
10
13
|
* The embedded component card (V2 features/blocks/instance-card.tsx + instance-ui.tsx StateChip / MissingNote / dialogs),
|
|
11
14
|
* drawn when the host can look the component up (KitServices.useComponentInfo, component-services.ts):
|
|
@@ -50,10 +53,13 @@ function useWidth(ref) {
|
|
|
50
53
|
/** A stored value as one line of reading text, or null when it has none (lists, empty values, flags). */
|
|
51
54
|
function readable(v) {
|
|
52
55
|
if (typeof v === "number") return String(v);
|
|
53
|
-
if (typeof v === "string")
|
|
56
|
+
if (typeof v === "string") {
|
|
57
|
+
if (v.startsWith("data:image/")) return "Image";
|
|
58
|
+
return (new DOMParser().parseFromString(v.replace(/<[^>]+>/g, " "), "text/html").body.textContent ?? "").replace(/\s+/g, " ").trim() || null;
|
|
59
|
+
}
|
|
54
60
|
if (v && typeof v === "object" && !Array.isArray(v)) {
|
|
55
61
|
const o = v;
|
|
56
|
-
return readable(o.label
|
|
62
|
+
return readable(o.label || o.text || o.title || o.altText || o.href || o.url || o.html);
|
|
57
63
|
}
|
|
58
64
|
return null;
|
|
59
65
|
}
|
|
@@ -72,27 +78,54 @@ var laterThan = (a, b) => {
|
|
|
72
78
|
return Number.isFinite(x) && Number.isFinite(y) && x > y;
|
|
73
79
|
};
|
|
74
80
|
var same = (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b);
|
|
81
|
+
/**
|
|
82
|
+
* "Collapse preview", remembered per component (V2 instance-card): read before the first render, so a reload never
|
|
83
|
+
* draws the preview and then folds it away. Storage that is absent or throws reads as expanded.
|
|
84
|
+
*/
|
|
85
|
+
function useCollapsed(ref) {
|
|
86
|
+
const key = ref ? `bcms:card-collapsed:${ref}` : null;
|
|
87
|
+
const [collapsed, setState] = React.useState(() => {
|
|
88
|
+
try {
|
|
89
|
+
return !!key && globalThis.localStorage?.getItem(key) === "1";
|
|
90
|
+
} catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return [collapsed, React.useCallback((next) => {
|
|
95
|
+
setState(next);
|
|
96
|
+
if (!key) return;
|
|
97
|
+
try {
|
|
98
|
+
if (next) globalThis.localStorage?.setItem(key, "1");
|
|
99
|
+
else globalThis.localStorage?.removeItem(key);
|
|
100
|
+
} catch {}
|
|
101
|
+
}, [key])];
|
|
102
|
+
}
|
|
75
103
|
function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
76
|
-
const { copyComponent, toast, ComponentPreview } = useKitServices();
|
|
77
|
-
const
|
|
104
|
+
const { copyComponent, toast, ComponentPreview, IconGlyph, componentVariantMember, ComponentSettings, openComponent, componentHref } = useKitServices();
|
|
105
|
+
const member = !m.detached && m.ref && m.variant ? componentVariantMember?.(m.ref, m.variant) : void 0;
|
|
106
|
+
const ref = member ?? m.ref;
|
|
107
|
+
const variant = member ? void 0 : m.variant;
|
|
108
|
+
const { info, loading, error } = use(ref ?? "");
|
|
78
109
|
const card = React.useRef(null);
|
|
79
110
|
const width = useWidth(card);
|
|
80
111
|
const narrow = !!width && width <= NARROW;
|
|
81
|
-
const [collapsed, setCollapsed] =
|
|
112
|
+
const [collapsed, setCollapsed] = useCollapsed(m.ref);
|
|
82
113
|
const [dialog, setDialog] = React.useState(null);
|
|
83
114
|
const [busy, setBusy] = React.useState(false);
|
|
84
115
|
const detached = !!m.detached;
|
|
85
116
|
const own = React.useMemo(() => parseObj(m.props), [m.props]);
|
|
86
|
-
const missing = !
|
|
87
|
-
const name = info && !info.missing ? info.name : m.name || info?.name || "
|
|
117
|
+
const missing = !ref || !!info?.missing;
|
|
118
|
+
const name = info && !info.missing ? info.name : m.name || info?.name || "Block";
|
|
88
119
|
const fieldKeys = new Set((info?.fields ?? []).map((f) => f.key));
|
|
89
120
|
const edited = missing || detached ? 0 : Object.keys(overrides).filter((k) => fieldKeys.has(k)).length;
|
|
90
121
|
const places = info?.places;
|
|
91
122
|
const known = !!info || missing;
|
|
92
123
|
const changed = detached && !missing && laterThan(info?.publishedAt, m.sourcePublishedAt);
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
const
|
|
124
|
+
const state = detached ? `Detached${changed ? ", Shared version changed" : ""}` : missing ? "Missing block" : edited || m.variant ? "Edited here" : "Shared";
|
|
125
|
+
const requiredEmpty = !missing && !detached && (info?.fields ?? []).some((f) => f.required && blank(f.key in overrides ? overrides[f.key] : f.value));
|
|
126
|
+
const label = `${name} block${known ? `, ${state}` : ""}${known && !missing && !detached && places != null ? `, ${placesShort(places)}` : ""}${requiredEmpty ? `. ${REQUIRED_EMPTY}` : ""}`;
|
|
127
|
+
const rows = detached ? copyRows(own, info?.fields, m.variant) : previewRows(missing, info?.fields, overrides, variant);
|
|
128
|
+
const image = missing || detached || edited || variant ? null : info?.image || null;
|
|
96
129
|
const liveProps = React.useMemo(() => detached ? own : {
|
|
97
130
|
...Object.fromEntries((info?.fields ?? []).flatMap((f) => f.value !== void 0 ? [[f.key, f.value]] : [])),
|
|
98
131
|
...overrides
|
|
@@ -102,9 +135,9 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
102
135
|
info?.fields,
|
|
103
136
|
overrides
|
|
104
137
|
]);
|
|
105
|
-
const live = ComponentPreview &&
|
|
138
|
+
const live = ComponentPreview && ref && info && !missing && !variant ? {
|
|
106
139
|
Preview: ComponentPreview,
|
|
107
|
-
ref
|
|
140
|
+
ref
|
|
108
141
|
} : null;
|
|
109
142
|
const preview = live ? /* @__PURE__ */ jsx(LivePreview, {
|
|
110
143
|
Preview: live.Preview,
|
|
@@ -117,6 +150,27 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
117
150
|
rows
|
|
118
151
|
}) : null;
|
|
119
152
|
const canCopy = !!copyComponent && !!m.ref && !ctx.readOnly;
|
|
153
|
+
const ro = !!ctx.readOnly;
|
|
154
|
+
const linked = !missing && !detached;
|
|
155
|
+
const open = useComponentPanel(el);
|
|
156
|
+
const editing = !!open;
|
|
157
|
+
const [cardEl, setCardEl] = React.useState(null);
|
|
158
|
+
const cardRef = React.useCallback((n) => {
|
|
159
|
+
card.current = n;
|
|
160
|
+
if (n) setCardEl(n);
|
|
161
|
+
}, []);
|
|
162
|
+
const openPanel = React.useCallback((focusKey) => openComponentPanel(el, focusKey ?? null), [el]);
|
|
163
|
+
const closePanel = React.useCallback(() => closeComponentPanel(el), [el]);
|
|
164
|
+
const focusCard = React.useCallback(() => requestAnimationFrame(() => card.current?.focus({ preventScroll: true })), []);
|
|
165
|
+
React.useEffect(() => () => closeComponentPanel(el), [el]);
|
|
166
|
+
const swappable = useCatalogComponents()?.components ?? [];
|
|
167
|
+
const [swapTo, setSwapTo] = React.useState(null);
|
|
168
|
+
const editAll = openComponent && m.ref && info && linked ? {
|
|
169
|
+
label: places != null && places > 1 ? `Edit for all ${places} places` : "Edit the shared block",
|
|
170
|
+
run: () => openComponent(m.ref)
|
|
171
|
+
} : void 0;
|
|
172
|
+
const href = m.ref ? componentHref?.(m.ref, m.id) : void 0;
|
|
173
|
+
const hasEdits = linked && (Object.keys(overrides).length > 0 || !!m.variant);
|
|
120
174
|
/**
|
|
121
175
|
* The change as ONE undo step (IslandCtx.step: the dock's toolbar Undo, this toast's Undo and ⌘Z in the body are one
|
|
122
176
|
* undo), and the toast that offers it back.
|
|
@@ -154,7 +208,7 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
154
208
|
...copy.blocks !== void 0 ? { blocks: copy.blocks } : {},
|
|
155
209
|
...copy.sourcePublishedAt ? { sourcePublishedAt: copy.sourcePublishedAt } : {},
|
|
156
210
|
...cur.extra !== void 0 ? { extra: cur.extra } : {}
|
|
157
|
-
}), "Make a separate copy", title, "It keeps its content and no longer follows the shared
|
|
211
|
+
}), "Make a separate copy", title, "It keeps its content and no longer follows the shared block.");
|
|
158
212
|
} catch (e) {
|
|
159
213
|
ctx.notify("This place couldn't keep its own copy", e instanceof Error ? e.message : String(e));
|
|
160
214
|
} finally {
|
|
@@ -172,24 +226,143 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
172
226
|
...mode === "keep" && Object.keys(kept).length ? { overrides: JSON.stringify(kept) } : {},
|
|
173
227
|
...mode === "keep" && cur.variant !== void 0 ? { variant: cur.variant } : {},
|
|
174
228
|
...cur.extra !== void 0 ? { extra: cur.extra } : {}
|
|
175
|
-
}), "Use shared version again", `${name} is shared again`, mode === "keep" && n ? `${n} ${n === 1 ? "edit" : "edits"} kept here.` : "It shows the
|
|
229
|
+
}), "Use shared version again", `${name} is shared again`, mode === "keep" && n ? `${n} ${n === 1 ? "edit" : "edits"} kept here.` : "It shows the block's content.");
|
|
230
|
+
};
|
|
231
|
+
/** V2 instanceOps.resetAll: this place's overrides and its layout go, as one undo step. */
|
|
232
|
+
const resetAll = () => commit((cur) => {
|
|
233
|
+
const { variant: _v, ...rest } = cur;
|
|
234
|
+
return {
|
|
235
|
+
...rest,
|
|
236
|
+
overrides: "{}"
|
|
237
|
+
};
|
|
238
|
+
}, "Reset all edits here", `Back to the shared ${name}`, "This place shows the block's content again.");
|
|
239
|
+
/**
|
|
240
|
+
* V2 instanceOps.swap, once the new component's fields are known (SwapResolver): this place's edits stay only where the
|
|
241
|
+
* new component declares a field with that key; everything else is the new component's own content. One undo step.
|
|
242
|
+
*/
|
|
243
|
+
const swap = (to, next) => {
|
|
244
|
+
const keys = new Set((next.fields ?? []).map((f) => f.key));
|
|
245
|
+
const kept = Object.fromEntries(Object.entries(detached ? own : overrides).filter(([k]) => keys.has(k)));
|
|
246
|
+
const n = Object.keys(kept).length;
|
|
247
|
+
commit((cur) => ({
|
|
248
|
+
id: cur.id,
|
|
249
|
+
ref: to.id,
|
|
250
|
+
name: next.name || to.name,
|
|
251
|
+
overrides: JSON.stringify(kept),
|
|
252
|
+
...cur.extra !== void 0 ? { extra: cur.extra } : {}
|
|
253
|
+
}), `Swap to ${to.name}`, `Swapped to ${to.name}`, n ? `Kept ${n} ${n === 1 ? "edit" : "edits"} made here.` : "It shows the block's own content.");
|
|
254
|
+
};
|
|
255
|
+
const copyLink = () => {
|
|
256
|
+
if (!href) return;
|
|
257
|
+
navigator.clipboard?.writeText(href).catch(() => {});
|
|
258
|
+
toast?.success("Link copied", { description: `Opens this page scrolled to the ${name}.` });
|
|
259
|
+
};
|
|
260
|
+
/** The panel's form writes this place: overrides (or the layout) as one undo step each, through the island's model. */
|
|
261
|
+
const onOverrides = (next) => {
|
|
262
|
+
const changed = [.../* @__PURE__ */ new Set([...Object.keys(next), ...Object.keys(overrides)])].find((k) => !same(next[k], overrides[k]));
|
|
263
|
+
set({ overrides: JSON.stringify(next) }, changed ? `Edit ${changed}` : "Edit block properties");
|
|
264
|
+
};
|
|
265
|
+
const onVariant = (variant) => set((cur) => {
|
|
266
|
+
const { variant: _v, ...rest } = cur;
|
|
267
|
+
return variant ? {
|
|
268
|
+
...rest,
|
|
269
|
+
variant
|
|
270
|
+
} : rest;
|
|
271
|
+
}, "Change layout");
|
|
272
|
+
/** V2 instance card keys, on the focused card itself (fields and the portalled panel keep their own). */
|
|
273
|
+
const onKeyDown = (e) => {
|
|
274
|
+
if (e.defaultPrevented || e.target !== card.current) return;
|
|
275
|
+
const mod = e.metaKey || e.ctrlKey;
|
|
276
|
+
const k = eventKey(e);
|
|
277
|
+
if (mod && k === "z") {
|
|
278
|
+
e.preventDefault();
|
|
279
|
+
e.stopPropagation();
|
|
280
|
+
if (e.shiftKey) ctx.redo?.();
|
|
281
|
+
else ctx.undo?.();
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
285
|
+
e.preventDefault();
|
|
286
|
+
openPanel();
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
if (e.key === "Escape") {
|
|
290
|
+
e.preventDefault();
|
|
291
|
+
e.stopPropagation();
|
|
292
|
+
if (editing) closePanel();
|
|
293
|
+
else ctx.exit(el);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (ro) return;
|
|
297
|
+
if (mod && k === "d" && ctx.duplicate) {
|
|
298
|
+
e.preventDefault();
|
|
299
|
+
e.stopPropagation();
|
|
300
|
+
ctx.duplicate(el);
|
|
301
|
+
} else if (e.altKey && (e.key === "ArrowUp" || e.key === "ArrowDown") && ctx.move) {
|
|
302
|
+
e.preventDefault();
|
|
303
|
+
ctx.move(el, e.key === "ArrowUp" ? -1 : 1);
|
|
304
|
+
focusCard();
|
|
305
|
+
} else if (e.key === "Backspace" || e.key === "Delete") {
|
|
306
|
+
e.preventDefault();
|
|
307
|
+
ctx.remove(el);
|
|
308
|
+
}
|
|
176
309
|
};
|
|
310
|
+
const chip = (compact) => detached ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DetachedChip, {
|
|
311
|
+
name,
|
|
312
|
+
compact
|
|
313
|
+
}), changed ? /* @__PURE__ */ jsx(ChangedChip, {
|
|
314
|
+
name,
|
|
315
|
+
compact,
|
|
316
|
+
onReview: canCopy ? () => setDialog("relink") : void 0
|
|
317
|
+
}) : null] }) : known ? /* @__PURE__ */ jsx(StateChip, {
|
|
318
|
+
missing,
|
|
319
|
+
places,
|
|
320
|
+
edited,
|
|
321
|
+
layout: !!m.variant,
|
|
322
|
+
requiredEmpty,
|
|
323
|
+
compact
|
|
324
|
+
}) : null;
|
|
177
325
|
return /* @__PURE__ */ jsxs("div", {
|
|
178
|
-
ref:
|
|
326
|
+
ref: cardRef,
|
|
179
327
|
role: "group",
|
|
328
|
+
tabIndex: 0,
|
|
180
329
|
"aria-label": label,
|
|
181
330
|
"aria-roledescription": "component",
|
|
331
|
+
"aria-haspopup": "dialog",
|
|
332
|
+
"aria-expanded": editing,
|
|
182
333
|
"aria-busy": busy || void 0,
|
|
183
334
|
"data-instance-card": "",
|
|
184
335
|
"data-rt-isolate": "",
|
|
185
336
|
"data-state": detached ? "detached" : missing ? "missing" : known ? "linked" : void 0,
|
|
186
|
-
|
|
337
|
+
onKeyDown,
|
|
338
|
+
onClick: (e) => {
|
|
339
|
+
if (!e.currentTarget.contains(e.target) || e.target.closest("button,a,[role=menuitem],[role=note],[role=alert]")) return;
|
|
340
|
+
openPanel(propKeyAt(e.currentTarget, e.clientX, e.clientY));
|
|
341
|
+
},
|
|
342
|
+
className: cn("group/inst relative cursor-pointer rounded-kit-lg border bg-kit-control-bg text-left focus-visible:outline-offset-2 transition-colors duration-150 motion-reduce:transition-none", editing ? "border-transparent shadow-[0_0_0_2px_var(--kit-accent)]" : missing && !detached ? "border-kit-warning-line" : "border-kit-line hover:border-kit-line-strong"),
|
|
187
343
|
children: [
|
|
188
344
|
/* @__PURE__ */ jsxs("div", {
|
|
189
345
|
className: "flex h-9 select-none items-center gap-1.5 pl-1 pr-1",
|
|
190
346
|
children: [
|
|
191
|
-
/* @__PURE__ */ jsx("span", { className: "w-1" }),
|
|
192
|
-
|
|
347
|
+
ro || !ctx.drag ? /* @__PURE__ */ jsx("span", { className: "w-1" }) : /* @__PURE__ */ jsx(Tooltip, {
|
|
348
|
+
content: "Drag to move",
|
|
349
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
350
|
+
type: "button",
|
|
351
|
+
"aria-label": `Move ${name}`,
|
|
352
|
+
tabIndex: -1,
|
|
353
|
+
onPointerDown: (e) => ctx.drag?.(el, e),
|
|
354
|
+
className: "flex h-7 w-4 shrink-0 cursor-grab touch-none pointer-coarse:size-11 items-center justify-center rounded-kit-sm text-kit-fg-4 opacity-0 transition-opacity duration-150 hover:text-kit-fg-2 active:cursor-grabbing motion-reduce:transition-none group-hover/inst:opacity-100 group-focus-within/inst:opacity-100 pointer-coarse:opacity-100 [&_svg]:size-3.5",
|
|
355
|
+
children: /* @__PURE__ */ jsx(IconGripVertical, { stroke: 1.5 })
|
|
356
|
+
})
|
|
357
|
+
}),
|
|
358
|
+
info?.icon && IconGlyph ? /* @__PURE__ */ jsx("span", {
|
|
359
|
+
"aria-hidden": true,
|
|
360
|
+
className: "flex size-[15px] shrink-0 text-kit-fg-2 [&_svg]:size-full",
|
|
361
|
+
children: /* @__PURE__ */ jsx(IconGlyph, {
|
|
362
|
+
name: info.icon,
|
|
363
|
+
className: "size-[15px]"
|
|
364
|
+
})
|
|
365
|
+
}) : /* @__PURE__ */ jsx(IconComponents, {
|
|
193
366
|
size: 15,
|
|
194
367
|
stroke: 1.5,
|
|
195
368
|
className: "shrink-0 text-kit-fg-2",
|
|
@@ -199,33 +372,31 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
199
372
|
className: "min-w-0 shrink truncate text-kit-sm font-medium text-kit-fg",
|
|
200
373
|
children: name
|
|
201
374
|
}),
|
|
202
|
-
|
|
203
|
-
name,
|
|
204
|
-
compact: narrow
|
|
205
|
-
}), changed ? /* @__PURE__ */ jsx(ChangedChip, {
|
|
206
|
-
name,
|
|
207
|
-
compact: narrow,
|
|
208
|
-
onReview: canCopy ? () => setDialog("relink") : void 0
|
|
209
|
-
}) : null] }) : known ? /* @__PURE__ */ jsx(StateChip, {
|
|
210
|
-
missing,
|
|
211
|
-
places,
|
|
212
|
-
edited,
|
|
213
|
-
compact: narrow
|
|
214
|
-
}) : null,
|
|
375
|
+
chip(narrow),
|
|
215
376
|
/* @__PURE__ */ jsx("span", { className: "flex-1" }),
|
|
216
|
-
|
|
377
|
+
/* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
|
|
217
378
|
size: "sm",
|
|
218
379
|
className: "shrink-0",
|
|
219
380
|
label: `${name} actions`,
|
|
220
381
|
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
221
382
|
}) }), /* @__PURE__ */ jsxs(MenuContent, {
|
|
222
383
|
align: "end",
|
|
223
|
-
className: "w-
|
|
384
|
+
className: "w-64",
|
|
224
385
|
children: [
|
|
225
|
-
|
|
226
|
-
icon:
|
|
227
|
-
onClick: () =>
|
|
228
|
-
children:
|
|
386
|
+
ComponentSettings ? /* @__PURE__ */ jsx(MenuItem, {
|
|
387
|
+
icon: /* @__PURE__ */ jsx(IconAdjustmentsHorizontal, { stroke: 1.5 }),
|
|
388
|
+
onClick: () => openPanel(),
|
|
389
|
+
children: "Edit properties"
|
|
390
|
+
}) : null,
|
|
391
|
+
editAll ? /* @__PURE__ */ jsx(MenuItem, {
|
|
392
|
+
icon: /* @__PURE__ */ jsx(IconArrowUpRight, { stroke: 1.5 }),
|
|
393
|
+
onClick: editAll.run,
|
|
394
|
+
children: editAll.label
|
|
395
|
+
}) : null,
|
|
396
|
+
!ro && hasEdits ? /* @__PURE__ */ jsx(MenuItem, {
|
|
397
|
+
icon: /* @__PURE__ */ jsx(IconRestore, { stroke: 1.5 }),
|
|
398
|
+
onClick: resetAll,
|
|
399
|
+
children: "Reset all edits here"
|
|
229
400
|
}) : null,
|
|
230
401
|
canCopy && info && !missing && !detached ? /* @__PURE__ */ jsx(MenuItem, {
|
|
231
402
|
icon: /* @__PURE__ */ jsx(IconUnlink, { stroke: 1.5 }),
|
|
@@ -244,29 +415,68 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
244
415
|
onClick: () => setDialog("relink"),
|
|
245
416
|
children: "Use shared version again"
|
|
246
417
|
}) : null,
|
|
247
|
-
|
|
418
|
+
!ro && swappable.length ? /* @__PURE__ */ jsxs(MenuSub, { children: [/* @__PURE__ */ jsx(MenuSubTrigger, {
|
|
419
|
+
icon: /* @__PURE__ */ jsx(IconReplace, { stroke: 1.5 }),
|
|
420
|
+
children: "Swap block"
|
|
421
|
+
}), /* @__PURE__ */ jsx(MenuSubContent, {
|
|
422
|
+
className: "max-h-[320px] w-60 overflow-y-auto",
|
|
423
|
+
children: swappable.map((c) => {
|
|
424
|
+
const on = c.id === m.ref;
|
|
425
|
+
return /* @__PURE__ */ jsx(MenuItem, {
|
|
426
|
+
icon: /* @__PURE__ */ jsx(IconComponents, { stroke: 1.5 }),
|
|
427
|
+
disabled: on || !!swapTo,
|
|
428
|
+
onClick: () => setSwapTo(c),
|
|
429
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
430
|
+
className: "flex w-full items-center justify-between gap-2",
|
|
431
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
432
|
+
className: "truncate",
|
|
433
|
+
children: c.name
|
|
434
|
+
}), on ? /* @__PURE__ */ jsx(IconCheck, {
|
|
435
|
+
className: "size-3.5 shrink-0 text-kit-fg-2",
|
|
436
|
+
stroke: 2,
|
|
437
|
+
"aria-label": "Current"
|
|
438
|
+
}) : null]
|
|
439
|
+
})
|
|
440
|
+
}, c.id);
|
|
441
|
+
})
|
|
442
|
+
})] }) : null,
|
|
443
|
+
preview ? /* @__PURE__ */ jsx(MenuItem, {
|
|
444
|
+
icon: collapsed ? /* @__PURE__ */ jsx(IconLayoutNavbarExpand, { stroke: 1.5 }) : /* @__PURE__ */ jsx(IconLayoutNavbarCollapse, { stroke: 1.5 }),
|
|
445
|
+
onClick: () => setCollapsed(!collapsed),
|
|
446
|
+
children: collapsed ? "Show preview" : "Collapse preview"
|
|
447
|
+
}) : null,
|
|
448
|
+
/* @__PURE__ */ jsx(MenuSeparator, {}),
|
|
449
|
+
!ro && ctx.duplicate ? /* @__PURE__ */ jsx(MenuItem, {
|
|
248
450
|
icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
|
|
451
|
+
shortcut: "⌘D",
|
|
249
452
|
onClick: () => ctx.duplicate?.(el),
|
|
250
453
|
children: "Duplicate"
|
|
251
454
|
}) : null,
|
|
252
|
-
ctx.move ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
|
|
253
|
-
icon: /* @__PURE__ */ jsx(
|
|
455
|
+
!ro && ctx.move ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
|
|
456
|
+
icon: /* @__PURE__ */ jsx(IconArrowBarToUp, { stroke: 1.5 }),
|
|
457
|
+
shortcut: "⌥↑",
|
|
254
458
|
disabled: !el.previousElementSibling,
|
|
255
459
|
onClick: () => ctx.move?.(el, -1),
|
|
256
460
|
children: "Move up"
|
|
257
461
|
}), /* @__PURE__ */ jsx(MenuItem, {
|
|
258
|
-
icon: /* @__PURE__ */ jsx(
|
|
462
|
+
icon: /* @__PURE__ */ jsx(IconArrowBarToDown, { stroke: 1.5 }),
|
|
463
|
+
shortcut: "⌥↓",
|
|
259
464
|
disabled: !el.nextElementSibling,
|
|
260
465
|
onClick: () => ctx.move?.(el, 1),
|
|
261
466
|
children: "Move down"
|
|
262
467
|
})] }) : null,
|
|
263
|
-
/* @__PURE__ */ jsx(
|
|
264
|
-
|
|
468
|
+
href ? /* @__PURE__ */ jsx(MenuItem, {
|
|
469
|
+
icon: /* @__PURE__ */ jsx(IconLink, { stroke: 1.5 }),
|
|
470
|
+
onClick: copyLink,
|
|
471
|
+
children: "Copy link"
|
|
472
|
+
}) : null,
|
|
473
|
+
!ro ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(MenuItem, {
|
|
265
474
|
danger: true,
|
|
266
475
|
icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
|
|
476
|
+
shortcut: "⌫",
|
|
267
477
|
onClick: () => ctx.remove(el),
|
|
268
478
|
children: "Remove"
|
|
269
|
-
})
|
|
479
|
+
})] }) : null
|
|
270
480
|
]
|
|
271
481
|
})] })
|
|
272
482
|
]
|
|
@@ -336,7 +546,37 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
|
|
|
336
546
|
setDialog(null);
|
|
337
547
|
relink(mode);
|
|
338
548
|
}
|
|
339
|
-
})] }) : null
|
|
549
|
+
})] }) : null,
|
|
550
|
+
swapTo ? /* @__PURE__ */ jsx(SwapResolver, {
|
|
551
|
+
use,
|
|
552
|
+
to: swapTo,
|
|
553
|
+
onReady: (next) => {
|
|
554
|
+
setSwapTo(null);
|
|
555
|
+
swap(swapTo, next);
|
|
556
|
+
},
|
|
557
|
+
onFail: (why) => {
|
|
558
|
+
setSwapTo(null);
|
|
559
|
+
ctx.notify(`Couldn't swap to ${swapTo.name}`, why);
|
|
560
|
+
}
|
|
561
|
+
}) : null,
|
|
562
|
+
open ? /* @__PURE__ */ jsx(ComponentPanel, {
|
|
563
|
+
name,
|
|
564
|
+
chip: chip(false),
|
|
565
|
+
anchor: cardEl,
|
|
566
|
+
open,
|
|
567
|
+
editAll,
|
|
568
|
+
onClose: closePanel,
|
|
569
|
+
focusBack: focusCard,
|
|
570
|
+
settings: {
|
|
571
|
+
componentId: m.ref ?? "",
|
|
572
|
+
overrides,
|
|
573
|
+
...m.variant ? { variant: m.variant } : {},
|
|
574
|
+
...detached ? { detached: { props: own } } : {},
|
|
575
|
+
readOnly: ro || detached || missing,
|
|
576
|
+
onOverrides,
|
|
577
|
+
onVariant
|
|
578
|
+
}
|
|
579
|
+
}) : null
|
|
340
580
|
]
|
|
341
581
|
});
|
|
342
582
|
}
|
|
@@ -355,11 +595,14 @@ function copyEdits(m, own, fields) {
|
|
|
355
595
|
for (const f of fields ?? []) if (f.key in own && !same(own[f.key], f.value)) out[f.key] = own[f.key];
|
|
356
596
|
return out;
|
|
357
597
|
}
|
|
598
|
+
var REQUIRED_EMPTY = "Required field empty.";
|
|
599
|
+
/** Nothing an author would call filled in: no value, blank text, an empty list. */
|
|
600
|
+
var blank = (v) => v == null || typeof v === "string" && !v.trim() || Array.isArray(v) && v.length === 0;
|
|
358
601
|
/** V2 StateChip: 13px, neutral, not a pill; the missing chip is the one tinted state. */
|
|
359
|
-
function StateChip({ missing, places, edited, compact }) {
|
|
602
|
+
function StateChip({ missing, places, edited, layout, requiredEmpty, compact }) {
|
|
360
603
|
const base = CHIP;
|
|
361
604
|
if (missing) return /* @__PURE__ */ jsx(Tooltip, {
|
|
362
|
-
content: "The
|
|
605
|
+
content: "The block was deleted. Readers see nothing in this place.",
|
|
363
606
|
children: /* @__PURE__ */ jsxs("span", {
|
|
364
607
|
className: cn(base, "bg-kit-warning-soft px-1.5 text-kit-warning-fg"),
|
|
365
608
|
children: [/* @__PURE__ */ jsx(IconAlertTriangle, {
|
|
@@ -368,17 +611,23 @@ function StateChip({ missing, places, edited, compact }) {
|
|
|
368
611
|
"aria-hidden": true
|
|
369
612
|
}), compact ? /* @__PURE__ */ jsx("span", {
|
|
370
613
|
className: "sr-only",
|
|
371
|
-
children: "Missing
|
|
372
|
-
}) : "Missing
|
|
614
|
+
children: "Missing block"
|
|
615
|
+
}) : "Missing block"]
|
|
373
616
|
})
|
|
374
617
|
});
|
|
375
618
|
const count = places ? placesShort(places) : null;
|
|
619
|
+
const tip = `Changes here apply only to this place. Edit the block to change ${places && places > 1 ? `all ${places}` : "it everywhere"}.${edited ? ` ${edited} ${edited === 1 ? "field" : "fields"} edited here.` : ""}${layout ? " Its layout is set here." : ""}${requiredEmpty ? ` ${REQUIRED_EMPTY}` : ""}`;
|
|
376
620
|
return /* @__PURE__ */ jsx(Tooltip, {
|
|
377
|
-
content:
|
|
621
|
+
content: tip,
|
|
378
622
|
children: /* @__PURE__ */ jsxs("span", {
|
|
379
623
|
className: cn(base, "px-1 text-kit-fg-2"),
|
|
380
624
|
tabIndex: -1,
|
|
381
625
|
children: [
|
|
626
|
+
requiredEmpty ? /* @__PURE__ */ jsx("span", {
|
|
627
|
+
"data-required-empty": true,
|
|
628
|
+
className: "size-1.5 shrink-0 rounded-full bg-kit-danger-fg",
|
|
629
|
+
"aria-hidden": true
|
|
630
|
+
}) : null,
|
|
382
631
|
/* @__PURE__ */ jsx(IconLink, {
|
|
383
632
|
className: "size-3.5 shrink-0",
|
|
384
633
|
stroke: 1.5,
|
|
@@ -392,7 +641,7 @@ function StateChip({ missing, places, edited, compact }) {
|
|
|
392
641
|
className: "sr-only",
|
|
393
642
|
children: ", shared"
|
|
394
643
|
}) : null,
|
|
395
|
-
edited ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
644
|
+
edited || layout ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
396
645
|
className: "ml-1 size-1.5 shrink-0 rounded-full bg-kit-accent",
|
|
397
646
|
"aria-hidden": true
|
|
398
647
|
}), compact ? /* @__PURE__ */ jsx("span", {
|
|
@@ -453,7 +702,7 @@ function DetachDialog({ open, name, places, onClose, onConfirm }) {
|
|
|
453
702
|
children: [
|
|
454
703
|
/* @__PURE__ */ jsx(ModalHeader, {
|
|
455
704
|
title: `Make a separate copy of ${name}?`,
|
|
456
|
-
description: "This place keeps its current content and stops following the shared
|
|
705
|
+
description: "This place keeps its current content and stops following the shared block."
|
|
457
706
|
}),
|
|
458
707
|
others != null ? /* @__PURE__ */ jsx(ModalBody, {
|
|
459
708
|
className: "pt-2 text-kit-sm text-kit-fg-2",
|
|
@@ -496,7 +745,7 @@ function RelinkDialog({ open, name, kept, onClose, onConfirm }) {
|
|
|
496
745
|
children: [
|
|
497
746
|
/* @__PURE__ */ jsx(ModalHeader, {
|
|
498
747
|
title: `Use the shared ${name} again?`,
|
|
499
|
-
description: "This place follows the shared
|
|
748
|
+
description: "This place follows the shared block again."
|
|
500
749
|
}),
|
|
501
750
|
/* @__PURE__ */ jsx(ModalBody, {
|
|
502
751
|
className: "pt-3",
|
|
@@ -558,6 +807,12 @@ function RelinkDialog({ open, name, kept, onClose, onConfirm }) {
|
|
|
558
807
|
* component's own), then the layout this place draws it in. A missing component has only what this place stored: its
|
|
559
808
|
* overrides, named by their keys, and its layout.
|
|
560
809
|
*/
|
|
810
|
+
/** A choice field's value as its option's label (BUG-8: a select whose values are ids listed the id); others as they are. */
|
|
811
|
+
function chosen(f, v) {
|
|
812
|
+
if (!f.options) return v;
|
|
813
|
+
const label = (x) => f.options.find((o) => o.value === x)?.label ?? x;
|
|
814
|
+
return Array.isArray(v) ? v.map(label).join(", ") : label(v);
|
|
815
|
+
}
|
|
561
816
|
function previewRows(missing, fields, overrides, variant) {
|
|
562
817
|
const out = [];
|
|
563
818
|
if (missing || !fields) for (const [key, v] of Object.entries(overrides)) {
|
|
@@ -569,7 +824,7 @@ function previewRows(missing, fields, overrides, variant) {
|
|
|
569
824
|
});
|
|
570
825
|
}
|
|
571
826
|
else for (const f of fields) {
|
|
572
|
-
const text = readable(f.key in overrides ? overrides[f.key] : f.value);
|
|
827
|
+
const text = readable(chosen(f, f.key in overrides ? overrides[f.key] : f.value));
|
|
573
828
|
if (text) out.push({
|
|
574
829
|
key: f.key,
|
|
575
830
|
label: f.label,
|
|
@@ -598,7 +853,7 @@ function copyRows(own, fields, variant) {
|
|
|
598
853
|
text
|
|
599
854
|
});
|
|
600
855
|
};
|
|
601
|
-
for (const f of fields ?? []) push(f.key, f.label, f.key in own ? own[f.key] : f.value);
|
|
856
|
+
for (const f of fields ?? []) push(f.key, f.label, chosen(f, f.key in own ? own[f.key] : f.value));
|
|
602
857
|
for (const [key, v] of Object.entries(own)) if (!fields?.some((f) => f.key === key)) push(key, key, v);
|
|
603
858
|
if (variant) out.push({
|
|
604
859
|
key: "__variant",
|
|
@@ -607,19 +862,65 @@ function copyRows(own, fields, variant) {
|
|
|
607
862
|
});
|
|
608
863
|
return out;
|
|
609
864
|
}
|
|
610
|
-
/**
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
865
|
+
/**
|
|
866
|
+
* The preview's frame: under the card's header, capped at PREVIEW_H (its top border inside, as V2's CappedPreview).
|
|
867
|
+
* The cap lifts instantly on hover: a height animation is layout work every frame (canvas revamp V937).
|
|
868
|
+
*/
|
|
869
|
+
var PREVIEW_CHROME = "group/cap relative max-h-[240px] overflow-hidden rounded-b-kit-lg border-t border-kit-line-subtle";
|
|
870
|
+
/**
|
|
871
|
+
* V2 instance-card CappedPreview: at most 240px, faded at its foot when the content is taller; hover shows its full
|
|
872
|
+
* height. Measured a frame after each resize, so a frame or picture that sizes itself late is read once settled.
|
|
873
|
+
*/
|
|
874
|
+
function CappedPreview({ live, children }) {
|
|
875
|
+
const inner = React.useRef(null);
|
|
876
|
+
const [tall, setTall] = React.useState(false);
|
|
877
|
+
const [site, setSite] = React.useState(false);
|
|
878
|
+
React.useLayoutEffect(() => {
|
|
879
|
+
const el = inner.current;
|
|
880
|
+
if (!el) return;
|
|
881
|
+
let raf = 0;
|
|
882
|
+
const measure = () => {
|
|
883
|
+
cancelAnimationFrame(raf);
|
|
884
|
+
raf = requestAnimationFrame(() => {
|
|
885
|
+
setTall(el.offsetHeight > 241);
|
|
886
|
+
setSite(!!el.querySelector("iframe"));
|
|
887
|
+
});
|
|
888
|
+
};
|
|
889
|
+
measure();
|
|
890
|
+
const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
|
|
891
|
+
ro?.observe(el);
|
|
892
|
+
const mo = typeof MutationObserver === "undefined" ? null : new MutationObserver(measure);
|
|
893
|
+
mo?.observe(el, {
|
|
894
|
+
childList: true,
|
|
895
|
+
subtree: true
|
|
896
|
+
});
|
|
897
|
+
return () => {
|
|
898
|
+
ro?.disconnect();
|
|
899
|
+
mo?.disconnect();
|
|
900
|
+
cancelAnimationFrame(raf);
|
|
901
|
+
};
|
|
902
|
+
}, []);
|
|
903
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
614
904
|
"data-instance-preview": "",
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
905
|
+
"data-live": live ? "" : void 0,
|
|
906
|
+
"data-tall": tall ? "" : void 0,
|
|
907
|
+
"data-site": site ? "" : void 0,
|
|
908
|
+
className: cn(PREVIEW_CHROME, site ? "bg-kit-site-paper" : "bg-kit-subtle", tall && "can-hover:hover:max-h-[2400px]"),
|
|
909
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
910
|
+
ref: inner,
|
|
911
|
+
children
|
|
912
|
+
}), tall ? /* @__PURE__ */ jsx("div", {
|
|
913
|
+
"aria-hidden": true,
|
|
914
|
+
className: cn("pointer-events-none absolute inset-x-0 bottom-0 h-6 bg-gradient-to-b from-transparent transition-opacity duration-150 ease-out can-hover:group-hover/cap:opacity-0 motion-reduce:transition-none", site ? "to-kit-site-paper" : "to-kit-subtle")
|
|
915
|
+
}) : null]
|
|
621
916
|
});
|
|
622
917
|
}
|
|
918
|
+
function PreviewWindow({ image, rows }) {
|
|
919
|
+
return /* @__PURE__ */ jsx(CappedPreview, { children: /* @__PURE__ */ jsx(PreviewBody, {
|
|
920
|
+
image,
|
|
921
|
+
rows
|
|
922
|
+
}) });
|
|
923
|
+
}
|
|
623
924
|
/**
|
|
624
925
|
* The component drawn live by the host (KitServices.ComponentPreview), mounted once the card is on screen. Its height is
|
|
625
926
|
* reserved from the start (PREVIEW_H), so the card never moves while it loads; where the host cannot draw it, the values
|
|
@@ -637,44 +938,30 @@ function LivePreview({ Preview, componentId, title, props, rows }) {
|
|
|
637
938
|
io.observe(el);
|
|
638
939
|
return () => io.disconnect();
|
|
639
940
|
}, [seen]);
|
|
640
|
-
return /* @__PURE__ */ jsx(
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
941
|
+
return /* @__PURE__ */ jsx(CappedPreview, {
|
|
942
|
+
live: true,
|
|
943
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
944
|
+
ref: box,
|
|
945
|
+
children: seen ? /* @__PURE__ */ jsx(Preview, {
|
|
946
|
+
componentId,
|
|
947
|
+
title,
|
|
948
|
+
props,
|
|
949
|
+
fallback: (reason) => /* @__PURE__ */ jsx(PreviewBody, {
|
|
950
|
+
image: null,
|
|
951
|
+
rows,
|
|
952
|
+
note: reason
|
|
953
|
+
})
|
|
954
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
955
|
+
"aria-hidden": true,
|
|
956
|
+
style: { height: PREVIEW_H }
|
|
653
957
|
})
|
|
654
|
-
}) : /* @__PURE__ */ jsx("div", {
|
|
655
|
-
"aria-hidden": true,
|
|
656
|
-
style: { height: PREVIEW_H }
|
|
657
958
|
})
|
|
658
959
|
});
|
|
659
960
|
}
|
|
660
961
|
function PreviewBody({ image, rows, note }) {
|
|
661
|
-
const inner = React.useRef(null);
|
|
662
|
-
const [tall, setTall] = React.useState(false);
|
|
663
962
|
const [loaded, setLoaded] = React.useState(!image);
|
|
664
|
-
React.useLayoutEffect(() => {
|
|
665
|
-
const el = inner.current;
|
|
666
|
-
if (!el) return;
|
|
667
|
-
const on = () => setTall(el.scrollHeight > PREVIEW_H + 1);
|
|
668
|
-
on();
|
|
669
|
-
if (typeof ResizeObserver === "undefined") return;
|
|
670
|
-
const ro = new ResizeObserver(on);
|
|
671
|
-
ro.observe(el);
|
|
672
|
-
return () => ro.disconnect();
|
|
673
|
-
}, []);
|
|
674
963
|
return /* @__PURE__ */ jsx("div", {
|
|
675
|
-
|
|
676
|
-
className: cn(tall && "[mask-image:linear-gradient(to_bottom,black_calc(100%-24px),transparent)]"),
|
|
677
|
-
style: tall || !loaded ? { height: PREVIEW_H } : void 0,
|
|
964
|
+
style: !loaded ? { height: PREVIEW_H } : void 0,
|
|
678
965
|
children: image ? /* @__PURE__ */ jsx("img", {
|
|
679
966
|
src: image,
|
|
680
967
|
alt: "",
|
|
@@ -688,6 +975,7 @@ function PreviewBody({ image, rows, note }) {
|
|
|
688
975
|
}) : null, /* @__PURE__ */ jsx("dl", {
|
|
689
976
|
className: "flex flex-col gap-3 px-4 py-3.5",
|
|
690
977
|
children: rows.map((r) => /* @__PURE__ */ jsxs("div", {
|
|
978
|
+
"data-prop-key": r.key === "__variant" ? void 0 : r.key,
|
|
691
979
|
className: "min-w-0",
|
|
692
980
|
children: [/* @__PURE__ */ jsx("dt", {
|
|
693
981
|
className: "truncate text-kit-xs text-kit-fg-3",
|
|
@@ -700,6 +988,36 @@ function PreviewBody({ image, rows, note }) {
|
|
|
700
988
|
})] })
|
|
701
989
|
});
|
|
702
990
|
}
|
|
991
|
+
/** The listed value (`data-prop-key`) under a point of the card, else null. */
|
|
992
|
+
function propKeyAt(root, x, y) {
|
|
993
|
+
for (const row of root.querySelectorAll("[data-prop-key]")) {
|
|
994
|
+
const r = row.getBoundingClientRect();
|
|
995
|
+
if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) return row.dataset.propKey ?? null;
|
|
996
|
+
}
|
|
997
|
+
return null;
|
|
998
|
+
}
|
|
999
|
+
/**
|
|
1000
|
+
* Swap component: the new component's fields come from the same lookup the card reads (KitServices.useComponentInfo, a
|
|
1001
|
+
* hook, so it is asked from a component of its own). Answers once, when they are known.
|
|
1002
|
+
*/
|
|
1003
|
+
function SwapResolver({ use, to, onReady, onFail }) {
|
|
1004
|
+
const { info, error } = use(to.id);
|
|
1005
|
+
const done = React.useRef(false);
|
|
1006
|
+
React.useEffect(() => {
|
|
1007
|
+
if (done.current) return;
|
|
1008
|
+
if (error) {
|
|
1009
|
+
done.current = true;
|
|
1010
|
+
onFail(error);
|
|
1011
|
+
} else if (info?.missing) {
|
|
1012
|
+
done.current = true;
|
|
1013
|
+
onFail("The library has no such block.");
|
|
1014
|
+
} else if (info) {
|
|
1015
|
+
done.current = true;
|
|
1016
|
+
onReady(info);
|
|
1017
|
+
}
|
|
1018
|
+
});
|
|
1019
|
+
return null;
|
|
1020
|
+
}
|
|
703
1021
|
//#endregion
|
|
704
1022
|
export { ComponentCard };
|
|
705
1023
|
|