@bettercms-ai/kit 1.0.0 → 2.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/{adapters → dist/adapters}/icons.js +2 -2
- package/dist/adapters/icons.js.map +1 -0
- package/{adapters → dist/adapters}/lossy.d.ts +90 -31
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
- package/{adapters → dist/adapters}/prod-types.js +71 -3
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +996 -179
- package/dist/adapters/schema.js.map +1 -0
- package/{adapters → dist/adapters}/values.d.ts +26 -5
- package/{adapters → dist/adapters}/values.js +87 -17
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/{context.d.ts → dist/context.d.ts} +92 -2
- package/{context.js → dist/context.js} +5 -2
- package/dist/context.js.map +1 -0
- package/{controls → dist/controls}/button.d.ts +19 -5
- package/{controls → dist/controls}/button.js +125 -54
- package/dist/controls/button.js.map +1 -0
- package/{controls → dist/controls}/c1.js +1 -1
- package/dist/controls/c1.js.map +1 -0
- package/{controls → dist/controls}/c2.js +1 -1
- package/dist/controls/c2.js.map +1 -0
- package/{controls → dist/controls}/choice.d.ts +7 -2
- package/{controls → dist/controls}/choice.js +71 -18
- package/dist/controls/choice.js.map +1 -0
- package/{controls → dist/controls}/code-register.js +1 -1
- package/dist/controls/code-register.js.map +1 -0
- package/{controls → dist/controls}/code.js +10 -9
- package/dist/controls/code.js.map +1 -0
- package/{controls → dist/controls}/color.js +8 -8
- package/dist/controls/color.js.map +1 -0
- package/{controls → dist/controls}/component-services.d.ts +42 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/{controls → dist/controls}/date-register.js +1 -1
- package/dist/controls/date-register.js.map +1 -0
- package/{controls → dist/controls}/date-zone.js +8 -2
- package/dist/controls/date-zone.js.map +1 -0
- package/{controls → dist/controls}/date.js +32 -24
- package/dist/controls/date.js.map +1 -0
- package/dist/controls/form-picker-register.d.ts +7 -0
- package/{controls → dist/controls}/form-picker-register.js +2 -6
- package/dist/controls/form-picker-register.js.map +1 -0
- package/{controls → dist/controls}/form-picker.js +11 -9
- package/dist/controls/form-picker.js.map +1 -0
- package/{controls → dist/controls}/icon-register.js +1 -1
- package/dist/controls/icon-register.js.map +1 -0
- package/{controls → dist/controls}/icon.d.ts +4 -2
- package/{controls → dist/controls}/icon.js +32 -27
- package/dist/controls/icon.js.map +1 -0
- package/{controls → dist/controls}/index.d.ts +1 -1
- package/{controls → dist/controls}/index.js +4 -3
- package/dist/controls/index.js.map +1 -0
- package/{controls → dist/controls}/json-register.js +1 -1
- package/dist/controls/json-register.js.map +1 -0
- package/{controls → dist/controls}/json.js +13 -3
- package/dist/controls/json.js.map +1 -0
- package/{controls → dist/controls}/link.js +6 -6
- package/dist/controls/link.js.map +1 -0
- package/{controls → dist/controls}/location-register.js +1 -1
- package/dist/controls/location-register.js.map +1 -0
- package/{controls → dist/controls}/location.js +64 -40
- package/dist/controls/location.js.map +1 -0
- package/{controls → dist/controls}/media-register.js +1 -1
- package/dist/controls/media-register.js.map +1 -0
- package/{controls → dist/controls}/media-services.d.ts +6 -0
- package/dist/controls/media-services.js +0 -0
- package/{controls → dist/controls}/media.d.ts +35 -4
- package/{controls → dist/controls}/media.js +491 -171
- package/dist/controls/media.js.map +1 -0
- package/{controls → dist/controls}/number.js +10 -9
- package/dist/controls/number.js.map +1 -0
- package/{controls → dist/controls}/reference-register.js +1 -1
- package/dist/controls/reference-register.js.map +1 -0
- package/{controls → dist/controls}/reference-services.d.ts +4 -0
- package/dist/controls/reference-services.js +0 -0
- package/{controls → dist/controls}/reference.d.ts +1 -1
- package/{controls → dist/controls}/reference.js +93 -77
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/{controls → dist/controls}/rich-text/blocks.js +471 -144
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
- package/{controls → dist/controls}/rich-text/catalog.js +75 -65
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +3 -1
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
- package/{controls → dist/controls}/rich-text/component-card.js +417 -99
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
- package/{controls → dist/controls}/rich-text/control.js +84 -42
- package/dist/controls/rich-text/control.js.map +1 -0
- package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
- package/{controls → dist/controls}/rich-text/dom.js +379 -50
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
- package/{controls → dist/controls}/rich-text/editor.js +148 -48
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
- package/{controls → dist/controls}/rich-text/floating.js +35 -18
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/{controls → dist/controls}/rich-text/index.js +1 -1
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/{controls → dist/controls}/rich-text/markdown.js +4 -2
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/{controls → dist/controls}/rich-text/ops.js +17 -15
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
- package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/{controls → dist/controls}/scale.js +5 -5
- package/dist/controls/scale.js.map +1 -0
- package/dist/controls/slot-register.d.ts +6 -0
- package/{controls → dist/controls}/slot-register.js +2 -5
- package/dist/controls/slot-register.js.map +1 -0
- package/{controls → dist/controls}/slot-services.d.ts +25 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/{controls → dist/controls}/slot.js +42 -24
- package/dist/controls/slot.js.map +1 -0
- package/{controls → dist/controls}/table/index.js +1 -1
- package/dist/controls/table/index.js.map +1 -0
- package/{controls → dist/controls}/table/prod.js +3 -3
- package/dist/controls/table/prod.js.map +1 -0
- package/{controls → dist/controls}/table/refs.js +13 -2
- package/dist/controls/table/refs.js.map +1 -0
- package/{controls → dist/controls}/table/stored.js +1 -1
- package/dist/controls/table/stored.js.map +1 -0
- package/{controls → dist/controls}/table/table-editor.js +51 -48
- package/dist/controls/table/table-editor.js.map +1 -0
- package/{controls → dist/controls}/table/table-link.js +3 -3
- package/dist/controls/table/table-link.js.map +1 -0
- package/{controls → dist/controls}/table/table.js +3 -3
- package/dist/controls/table/table.js.map +1 -0
- package/{controls → dist/controls}/text.d.ts +2 -2
- package/{controls → dist/controls}/text.js +78 -43
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/{engine → dist/engine}/array.js +34 -21
- package/dist/engine/array.js.map +1 -0
- package/{engine → dist/engine}/bits.js +1 -1
- package/dist/engine/bits.js.map +1 -0
- package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
- package/{engine → dist/engine}/breadcrumb.js +12 -36
- package/dist/engine/breadcrumb.js.map +1 -0
- package/{engine → dist/engine}/expand.d.ts +2 -4
- package/{engine → dist/engine}/expand.js +5 -22
- package/dist/engine/expand.js.map +1 -0
- package/{engine → dist/engine}/field-list.js +1 -1
- package/dist/engine/field-list.js.map +1 -0
- package/{engine → dist/engine}/field-shell.js +249 -121
- package/dist/engine/field-shell.js.map +1 -0
- package/{engine → dist/engine}/frame.d.ts +3 -1
- package/{engine → dist/engine}/frame.js +16 -14
- package/dist/engine/frame.js.map +1 -0
- package/{engine → dist/engine}/group-summary.d.ts +2 -1
- package/{engine → dist/engine}/group-summary.js +7 -3
- package/dist/engine/group-summary.js.map +1 -0
- package/{engine → dist/engine}/grouping.d.ts +19 -5
- package/{engine → dist/engine}/grouping.js +193 -21
- package/dist/engine/grouping.js.map +1 -0
- package/{engine → dist/engine}/item-list.d.ts +11 -1
- package/{engine → dist/engine}/item-list.js +35 -13
- package/dist/engine/item-list.js.map +1 -0
- package/{engine → dist/engine}/kit-field.js +45 -10
- package/dist/engine/kit-field.js.map +1 -0
- package/{engine → dist/engine}/schema-form.d.ts +27 -2
- package/{engine → dist/engine}/schema-form.js +182 -40
- package/dist/engine/schema-form.js.map +1 -0
- package/{engine → dist/engine}/slot.js +5 -15
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/{kit.css → dist/kit.css} +19 -0
- package/{lib → dist/lib}/cn.js +7 -4
- package/dist/lib/cn.js.map +1 -0
- package/{lib → dist/lib}/columns.js +4 -1
- package/dist/lib/columns.js.map +1 -0
- package/{lib → dist/lib}/frames.js +2 -2
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/{lib → dist/lib}/icons.js +4 -3
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/{lib → dist/lib}/path.js +4 -2
- package/dist/lib/path.js.map +1 -0
- package/{lib → dist/lib}/schema.d.ts +34 -3
- package/{lib → dist/lib}/schema.js +110 -13
- package/dist/lib/schema.js.map +1 -0
- package/{lib → dist/lib}/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -0
- package/{lib → dist/lib}/validate.d.ts +11 -1
- package/{lib → dist/lib}/validate.js +85 -11
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/{schema → dist/schema}/adapters.js +1 -2
- package/dist/schema/adapters.js.map +1 -0
- package/{schema → dist/schema}/help.d.ts +2 -0
- package/{schema → dist/schema}/help.js +6 -4
- package/dist/schema/help.js.map +1 -0
- package/{schema → dist/schema}/scale.js +1 -1
- package/dist/schema/scale.js.map +1 -0
- package/{schema → dist/schema}/sources.js +1 -1
- package/dist/schema/sources.js.map +1 -0
- package/{schema → dist/schema}/table.js +11 -10
- package/dist/schema/table.js.map +1 -0
- package/{schema → dist/schema}/types.d.ts +29 -1
- package/{schema → dist/schema}/types.js +1 -1
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +22 -0
- package/dist/theme.js +43 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.js +0 -0
- package/{ui → dist/ui}/action-tray.d.ts +1 -1
- package/{ui → dist/ui}/action-tray.js +20 -19
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +6 -7
- package/dist/ui/button.js.map +1 -0
- package/{ui → dist/ui}/choice-switch.js +1 -1
- package/dist/ui/choice-switch.js.map +1 -0
- package/{ui → dist/ui}/controls.js +51 -39
- package/dist/ui/controls.js.map +1 -0
- package/{ui → dist/ui}/display.d.ts +10 -3
- package/{ui → dist/ui}/display.js +57 -46
- package/dist/ui/display.js.map +1 -0
- package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
- package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/{ui → dist/ui}/field-context.js +1 -1
- package/dist/ui/field-context.js.map +1 -0
- package/{ui → dist/ui}/floating-panel.d.ts +1 -1
- package/{ui → dist/ui}/floating-panel.js +28 -12
- package/dist/ui/floating-panel.js.map +1 -0
- package/{ui → dist/ui}/index.d.ts +4 -0
- package/dist/ui/index.js +18 -0
- package/{ui → dist/ui}/input.d.ts +1 -1
- package/{ui → dist/ui}/input.js +9 -9
- package/dist/ui/input.js.map +1 -0
- package/{ui → dist/ui}/mode-bar.js +3 -3
- package/dist/ui/mode-bar.js.map +1 -0
- package/{ui → dist/ui}/overlay.d.ts +77 -5
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/{ui → dist/ui}/path-crumbs.js +37 -3
- package/dist/ui/path-crumbs.js.map +1 -0
- package/{ui → dist/ui}/presence.js +2 -2
- package/dist/ui/presence.js.map +1 -0
- package/{ui → dist/ui}/select.js +89 -87
- package/dist/ui/select.js.map +1 -0
- package/{ui → dist/ui}/shortcut-hint.js +1 -1
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/{ui → dist/ui}/surfaces.js +1 -1
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
- package/{ui → dist/ui}/tooltip-root.js +9 -8
- package/dist/ui/tooltip-root.js.map +1 -0
- package/{ui → dist/ui}/variants.js +1 -1
- package/dist/ui/variants.js.map +1 -0
- package/package.json +81 -23
- package/adapters/icons.js.map +0 -1
- package/adapters/lossy.js +0 -233
- package/adapters/lossy.js.map +0 -1
- package/adapters/prod-types.js.map +0 -1
- package/adapters/schema.js.map +0 -1
- package/adapters/values.js.map +0 -1
- package/brand/logo.js +0 -9
- package/brand/logo.js.map +0 -1
- package/context.js.map +0 -1
- package/controls/button.js.map +0 -1
- package/controls/c1.js.map +0 -1
- package/controls/c2.js.map +0 -1
- package/controls/choice.js.map +0 -1
- package/controls/code-register.js.map +0 -1
- package/controls/code.js.map +0 -1
- package/controls/color.js.map +0 -1
- package/controls/date-register.js.map +0 -1
- package/controls/date-zone.js.map +0 -1
- package/controls/date.js.map +0 -1
- package/controls/form-picker-register.d.ts +0 -1
- package/controls/form-picker-register.js.map +0 -1
- package/controls/form-picker.js.map +0 -1
- package/controls/icon-register.js.map +0 -1
- package/controls/icon.js.map +0 -1
- package/controls/index.js.map +0 -1
- package/controls/json-register.js.map +0 -1
- package/controls/json.js.map +0 -1
- package/controls/link.js.map +0 -1
- package/controls/location-register.js.map +0 -1
- package/controls/location.js.map +0 -1
- package/controls/media-register.js.map +0 -1
- package/controls/media.js.map +0 -1
- package/controls/number.js.map +0 -1
- package/controls/reference-register.js.map +0 -1
- package/controls/reference.js.map +0 -1
- package/controls/rich-text/blocks.d.ts +0 -28
- package/controls/rich-text/blocks.js.map +0 -1
- package/controls/rich-text/catalog.js.map +0 -1
- package/controls/rich-text/codec.js.map +0 -1
- package/controls/rich-text/component-card.js.map +0 -1
- package/controls/rich-text/control.js.map +0 -1
- package/controls/rich-text/dom.js.map +0 -1
- package/controls/rich-text/editor.js.map +0 -1
- package/controls/rich-text/floating.js.map +0 -1
- package/controls/rich-text/index.js.map +0 -1
- package/controls/rich-text/link-form.js +0 -111
- package/controls/rich-text/link-form.js.map +0 -1
- package/controls/rich-text/markdown.js.map +0 -1
- package/controls/rich-text/ops.js.map +0 -1
- package/controls/rich-text/toolbar.js.map +0 -1
- package/controls/scale.js.map +0 -1
- package/controls/slot-register.d.ts +0 -1
- package/controls/slot-register.js.map +0 -1
- package/controls/slot-services.js +0 -38
- package/controls/slot-services.js.map +0 -1
- package/controls/slot.js.map +0 -1
- package/controls/table/index.js.map +0 -1
- package/controls/table/prod.js.map +0 -1
- package/controls/table/refs.js.map +0 -1
- package/controls/table/stored.js.map +0 -1
- package/controls/table/table-editor.js.map +0 -1
- package/controls/table/table-link.js.map +0 -1
- package/controls/table/table.js.map +0 -1
- package/controls/text.js.map +0 -1
- package/engine/array.js.map +0 -1
- package/engine/bits.js.map +0 -1
- package/engine/breadcrumb.js.map +0 -1
- package/engine/expand.js.map +0 -1
- package/engine/field-list.js.map +0 -1
- package/engine/field-shell.js.map +0 -1
- package/engine/frame.js.map +0 -1
- package/engine/group-summary.js.map +0 -1
- package/engine/grouping.js.map +0 -1
- package/engine/item-list.js.map +0 -1
- package/engine/kit-field.js.map +0 -1
- package/engine/schema-form.js.map +0 -1
- package/engine/slot.js.map +0 -1
- package/index.js +0 -55
- package/index.js.map +0 -1
- package/lib/cn.js.map +0 -1
- package/lib/columns.js.map +0 -1
- package/lib/frames.js.map +0 -1
- package/lib/icons.js.map +0 -1
- package/lib/path.js.map +0 -1
- package/lib/schema.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/lib/validate.js.map +0 -1
- package/schema/adapters.js.map +0 -1
- package/schema/help.js.map +0 -1
- package/schema/scale.js.map +0 -1
- package/schema/sources.js.map +0 -1
- package/schema/table.js.map +0 -1
- package/schema/types.js.map +0 -1
- package/ui/action-tray.js.map +0 -1
- package/ui/button.js.map +0 -1
- package/ui/choice-switch.js.map +0 -1
- package/ui/controls.js.map +0 -1
- package/ui/display.js.map +0 -1
- package/ui/expanded-editor-modal.js.map +0 -1
- package/ui/field-context.js.map +0 -1
- package/ui/floating-panel.js.map +0 -1
- package/ui/index.js +0 -13
- package/ui/input.js.map +0 -1
- package/ui/mode-bar.js.map +0 -1
- package/ui/overlay.js +0 -378
- package/ui/overlay.js.map +0 -1
- package/ui/path-crumbs.js.map +0 -1
- package/ui/presence.js.map +0 -1
- package/ui/select.js.map +0 -1
- package/ui/shortcut-hint.js.map +0 -1
- package/ui/surfaces.js.map +0 -1
- package/ui/tooltip-root.js.map +0 -1
- package/ui/variants.js.map +0 -1
- /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
- /package/{adapters → dist/adapters}/icons.d.ts +0 -0
- /package/{brand → dist/brand}/logo.d.ts +0 -0
- /package/{controls → dist/controls}/c1.d.ts +0 -0
- /package/{controls → dist/controls}/c2.d.ts +0 -0
- /package/{controls → dist/controls}/code-register.d.ts +0 -0
- /package/{controls → dist/controls}/code.d.ts +0 -0
- /package/{controls → dist/controls}/color.d.ts +0 -0
- /package/{controls → dist/controls}/date-register.d.ts +0 -0
- /package/{controls → dist/controls}/date-zone.d.ts +0 -0
- /package/{controls → dist/controls}/date.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker.d.ts +0 -0
- /package/{controls → dist/controls}/icon-register.d.ts +0 -0
- /package/{controls → dist/controls}/json-register.d.ts +0 -0
- /package/{controls → dist/controls}/json.d.ts +0 -0
- /package/{controls → dist/controls}/link.d.ts +0 -0
- /package/{controls → dist/controls}/location-register.d.ts +0 -0
- /package/{controls → dist/controls}/location.d.ts +0 -0
- /package/{controls → dist/controls}/media-register.d.ts +0 -0
- /package/{controls → dist/controls}/number.d.ts +0 -0
- /package/{controls → dist/controls}/reference-register.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
- /package/{controls → dist/controls}/scale.d.ts +0 -0
- /package/{controls → dist/controls}/slot.d.ts +0 -0
- /package/{controls → dist/controls}/table/index.d.ts +0 -0
- /package/{controls → dist/controls}/table/prod.d.ts +0 -0
- /package/{controls → dist/controls}/table/refs.d.ts +0 -0
- /package/{controls → dist/controls}/table/stored.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
- /package/{controls → dist/controls}/table/table.d.ts +0 -0
- /package/{engine → dist/engine}/array.d.ts +0 -0
- /package/{engine → dist/engine}/bits.d.ts +0 -0
- /package/{engine → dist/engine}/field-list.d.ts +0 -0
- /package/{engine → dist/engine}/field-shell.d.ts +0 -0
- /package/{engine → dist/engine}/kit-field.d.ts +0 -0
- /package/{engine → dist/engine}/slot.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/cn.d.ts +0 -0
- /package/{lib → dist/lib}/columns.d.ts +0 -0
- /package/{lib → dist/lib}/frames.d.ts +0 -0
- /package/{lib → dist/lib}/icons.d.ts +0 -0
- /package/{lib → dist/lib}/path.d.ts +0 -0
- /package/{lib → dist/lib}/utils.d.ts +0 -0
- /package/{schema → dist/schema}/adapters.d.ts +0 -0
- /package/{schema → dist/schema}/scale.d.ts +0 -0
- /package/{schema → dist/schema}/sources.d.ts +0 -0
- /package/{schema → dist/schema}/table.d.ts +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
- /package/{ui → dist/ui}/controls.d.ts +0 -0
- /package/{ui → dist/ui}/field-context.d.ts +0 -0
- /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
- /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
- /package/{ui → dist/ui}/presence.d.ts +0 -0
- /package/{ui → dist/ui}/select.d.ts +0 -0
- /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
- /package/{ui → dist/ui}/surfaces.d.ts +0 -0
- /package/{ui → dist/ui}/variants.d.ts +0 -0
|
@@ -1,18 +1,19 @@
|
|
|
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, Popover, PopoverContent, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
|
|
4
|
+
import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
|
|
5
5
|
import { Input, Textarea } from "../../ui/input.js";
|
|
6
6
|
import { TableEditor } from "../table/table-editor.js";
|
|
7
7
|
import { SchemaForm } from "../../engine/schema-form.js";
|
|
8
|
-
import {
|
|
8
|
+
import { eventKey } from "../../lib/key-event.js";
|
|
9
9
|
import { FloatingPanel } from "../../ui/floating-panel.js";
|
|
10
|
+
import { CALLOUT_TONES, detectEmbed, placeCaret } from "./dom.js";
|
|
10
11
|
import { LinkForm } from "./link-form.js";
|
|
11
12
|
import { ComponentCard } from "./component-card.js";
|
|
12
13
|
import * as React from "react";
|
|
13
|
-
import { IconAlertTriangle, IconAlt, IconArrowsHorizontal, IconArrowsMove, IconBulb, IconCheck, IconChevronDown, IconChevronRight, IconComponents, IconCopy, IconDimensions, IconDots, IconFileText, IconInfoCircle, IconLayoutAlignCenter, IconLayoutAlignLeft, IconLayoutAlignRight, IconLayoutSidebar, IconLayoutSidebarRight, IconLibraryPhoto, IconLink, IconPhoto, IconQuote, IconReplace, IconSettings, IconTrash, IconVideo, IconWorld, IconX } from "@tabler/icons-react";
|
|
14
14
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
-
|
|
15
|
+
import { IconAlertTriangle, IconAlt, IconArrowsHorizontal, IconArrowsMove, IconBrandCodepen, IconBrandFigma, IconBrandSpotify, IconBrandVimeo, IconBrandX, IconBrandYoutube, IconBulb, IconCheck, IconChevronDown, IconChevronRight, IconComponents, IconCopy, IconDimensions, IconDots, IconFileText, IconFileUpload, IconHeadphones, IconInfoCircle, IconLayoutAlignCenter, IconLayoutAlignLeft, IconLayoutAlignRight, IconLayoutSidebar, IconLayoutSidebarRight, IconLibraryPhoto, IconLink, IconMap, IconMicrophone, IconPhoto, IconPlayerPlayFilled, IconQuote, IconReplace, IconSettings, IconTrash, IconWorld, IconX } from "@tabler/icons-react";
|
|
16
|
+
//#region src/controls/rich-text/blocks.tsx
|
|
16
17
|
/**
|
|
17
18
|
* RICH TEXT · rich blocks ("islands", V2 HEAD controls/rich-text/blocks.tsx). Each renders through a portal into a
|
|
18
19
|
* contenteditable=false element inside the editor surface; its model lives on that element (`el.__rt`) so serialize()
|
|
@@ -28,6 +29,8 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
|
28
29
|
* block (article-blocks.tsx ArticleBlock + PullQuotePreview): drawn as the reader sees it, edited in the floating
|
|
29
30
|
* properties panel (4 settings → panel, CPO D54) through the kit SchemaForm. Key takeaways are V2's article block too,
|
|
30
31
|
* written in the text itself (article-blocks.tsx TakeawaysEditor, surface "inline"): a title line and a line per point.
|
|
32
|
+
* The embed is V2's article block too (ArticleBlock surface "popover" + EmbedPreview): a placeholder card of the link's
|
|
33
|
+
* provider, edited in a popover beside it (Link, Title; V2's Shape has no stored key, see dom.ts).
|
|
31
34
|
*/
|
|
32
35
|
function Island({ el, ctx }) {
|
|
33
36
|
const kind = el.getAttribute("data-rt-island");
|
|
@@ -111,6 +114,12 @@ function Island({ el, ctx }) {
|
|
|
111
114
|
autoFocus,
|
|
112
115
|
m: model,
|
|
113
116
|
set
|
|
117
|
+
}) : kind === "embed" ? /* @__PURE__ */ jsx(EmbedBlock, {
|
|
118
|
+
el,
|
|
119
|
+
ctx,
|
|
120
|
+
autoFocus,
|
|
121
|
+
m: model,
|
|
122
|
+
set
|
|
114
123
|
}) : kind === "file" ? /* @__PURE__ */ jsx(FileBlock, {
|
|
115
124
|
el,
|
|
116
125
|
ctx,
|
|
@@ -172,10 +181,10 @@ function PlainEditable({ value, onChange, label, placeholder, readOnly, autoFocu
|
|
|
172
181
|
e.preventDefault();
|
|
173
182
|
onEnter?.();
|
|
174
183
|
},
|
|
175
|
-
className: cn("min-w-0 cursor-text whitespace-pre-wrap break-words outline-none empty:before:pointer-events-none empty:before:text-kit-fg-4 empty:before:content-[attr(data-placeholder)]", className)
|
|
184
|
+
className: cn("min-w-0 cursor-text whitespace-pre-wrap break-words outline-none focus-visible:shadow-none empty:before:pointer-events-none empty:before:text-kit-fg-4 empty:before:content-[attr(data-placeholder)]", className)
|
|
176
185
|
});
|
|
177
186
|
}
|
|
178
|
-
var RemoveBtn = ({ onClick, label }) => /* @__PURE__ */ jsx(IconButton, {
|
|
187
|
+
var RemoveBtn = ({ onClick, label = "Remove block" }) => /* @__PURE__ */ jsx(IconButton, {
|
|
179
188
|
size: "xs",
|
|
180
189
|
label,
|
|
181
190
|
onClick,
|
|
@@ -274,19 +283,9 @@ function ImageBlock({ m, set, el, ctx }) {
|
|
|
274
283
|
children: MediaPicker ? "Pick one from the media library or paste a link." : "Paste a link to the image."
|
|
275
284
|
})]
|
|
276
285
|
}),
|
|
277
|
-
ro ? null : /* @__PURE__ */ jsx(
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
type: "button",
|
|
281
|
-
"aria-label": "Remove image",
|
|
282
|
-
onClick: () => ctx.remove(el),
|
|
283
|
-
className: "flex size-6 items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-danger-fg",
|
|
284
|
-
children: /* @__PURE__ */ jsx(IconTrash, {
|
|
285
|
-
className: "size-3.5",
|
|
286
|
-
stroke: 1.5,
|
|
287
|
-
"aria-hidden": true
|
|
288
|
-
})
|
|
289
|
-
})
|
|
286
|
+
ro ? null : /* @__PURE__ */ jsx(RemoveBtn, {
|
|
287
|
+
onClick: () => ctx.remove(el),
|
|
288
|
+
label: "Remove image"
|
|
290
289
|
})
|
|
291
290
|
]
|
|
292
291
|
}),
|
|
@@ -357,8 +356,7 @@ function ImageBlock({ m, set, el, ctx }) {
|
|
|
357
356
|
ro ? null : /* @__PURE__ */ jsxs("div", {
|
|
358
357
|
role: "toolbar",
|
|
359
358
|
"aria-label": "Image tools",
|
|
360
|
-
"
|
|
361
|
-
className: cn("absolute left-1/2 top-2 z-[3] flex h-8 max-w-[calc(100%-16px)] -translate-x-1/2 items-center gap-0.5 overflow-x-auto rounded-kit-lg border border-kit-line bg-kit-surface px-1 opacity-0 shadow-kit-sm transition-opacity duration-150 motion-reduce:transition-none", "group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100", busy && "opacity-100"),
|
|
359
|
+
className: cn("glass-strong absolute left-1/2 top-2 z-[3] flex h-8 -translate-x-1/2 items-center gap-0.5 rounded-kit-lg border border-kit-line px-1 opacity-0 transition-opacity duration-150", "group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100", busy && "opacity-100"),
|
|
362
360
|
children: [
|
|
363
361
|
MediaPicker ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Tooltip, {
|
|
364
362
|
content: "Replace image",
|
|
@@ -440,7 +438,7 @@ function ImageBlock({ m, set, el, ctx }) {
|
|
|
440
438
|
})
|
|
441
439
|
})
|
|
442
440
|
}), /* @__PURE__ */ jsxs(PopoverContent, {
|
|
443
|
-
className: "w-[340px] p-3",
|
|
441
|
+
className: "w-[340px] rounded-kit-lg p-3",
|
|
444
442
|
finalFocus: false,
|
|
445
443
|
children: [/* @__PURE__ */ jsx("p", {
|
|
446
444
|
className: "mb-2 text-kit-xs font-medium text-kit-fg-2",
|
|
@@ -507,7 +505,7 @@ function ImageBlock({ m, set, el, ctx }) {
|
|
|
507
505
|
placeholder: ro ? "" : "Add a caption…",
|
|
508
506
|
onChange: (caption) => set({ caption }, "Edit caption"),
|
|
509
507
|
onEnter: () => ctx.exit(el),
|
|
510
|
-
className: "mt-1.5 text-center text-kit-sm text-kit-fg-3"
|
|
508
|
+
className: "mt-1.5 text-center text-kit-sm text-kit-fg-3 empty:before:text-kit-fg-4"
|
|
511
509
|
}),
|
|
512
510
|
pickerEl
|
|
513
511
|
]
|
|
@@ -642,7 +640,7 @@ function CalloutBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
642
640
|
})] }),
|
|
643
641
|
/* @__PURE__ */ jsx("span", { className: "flex-1" }),
|
|
644
642
|
ro ? null : /* @__PURE__ */ jsx("div", {
|
|
645
|
-
className: "opacity-0 transition-opacity
|
|
643
|
+
className: "opacity-0 transition-opacity group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
|
|
646
644
|
children: /* @__PURE__ */ jsx(RemoveBtn, {
|
|
647
645
|
onClick: () => ctx.remove(el),
|
|
648
646
|
label: "Remove callout"
|
|
@@ -673,7 +671,7 @@ function CalloutBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
673
671
|
readOnly: ro,
|
|
674
672
|
placeholder: "Write a message…",
|
|
675
673
|
onChange: (b) => set({ body: b }, "Edit callout message"),
|
|
676
|
-
className: "mt-0.5 text-kit-fg-2"
|
|
674
|
+
className: "mt-0.5 text-kit-fg-2 [&_p+p]:mt-2"
|
|
677
675
|
})
|
|
678
676
|
})
|
|
679
677
|
]
|
|
@@ -698,7 +696,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
698
696
|
onClick: () => setOpen((o) => !o),
|
|
699
697
|
className: "mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg",
|
|
700
698
|
children: /* @__PURE__ */ jsx(IconChevronRight, {
|
|
701
|
-
className: cn("size-4 transition-transform duration-150
|
|
699
|
+
className: cn("size-4 transition-transform duration-150", open && "rotate-90"),
|
|
702
700
|
stroke: 1.5,
|
|
703
701
|
"aria-hidden": true
|
|
704
702
|
})
|
|
@@ -721,7 +719,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
721
719
|
className: "flex-1 py-0.5 font-medium text-kit-fg"
|
|
722
720
|
}),
|
|
723
721
|
ro ? null : /* @__PURE__ */ jsx("div", {
|
|
724
|
-
className: "opacity-0 transition-opacity
|
|
722
|
+
className: "opacity-0 transition-opacity group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
|
|
725
723
|
children: /* @__PURE__ */ jsx(RemoveBtn, {
|
|
726
724
|
onClick: () => ctx.remove(el),
|
|
727
725
|
label: "Remove toggle"
|
|
@@ -740,7 +738,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
740
738
|
readOnly: ro,
|
|
741
739
|
placeholder: "Hidden content. Click to write…",
|
|
742
740
|
onChange: (b) => set({ body: b }, "Edit toggle body"),
|
|
743
|
-
className: "py-0.5 text-kit-fg-2"
|
|
741
|
+
className: "py-0.5 text-kit-fg-2 [&_p+p]:mt-2"
|
|
744
742
|
})
|
|
745
743
|
})]
|
|
746
744
|
});
|
|
@@ -818,18 +816,14 @@ function VideoBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
818
816
|
controls: true,
|
|
819
817
|
preload: "metadata",
|
|
820
818
|
className: "aspect-video w-full rounded-kit-md bg-kit-muted"
|
|
821
|
-
}) : /* @__PURE__ */
|
|
822
|
-
className: "
|
|
823
|
-
children:
|
|
824
|
-
className: "size-3.5",
|
|
825
|
-
stroke: 1.5,
|
|
826
|
-
"aria-hidden": true
|
|
827
|
-
}), "No video yet."]
|
|
819
|
+
}) : /* @__PURE__ */ jsx("p", {
|
|
820
|
+
className: "px-1 pb-0.5 text-kit-xs text-kit-fg-3",
|
|
821
|
+
children: "No video yet."
|
|
828
822
|
})
|
|
829
823
|
]
|
|
830
824
|
});
|
|
831
825
|
}
|
|
832
|
-
var formatBytes = (n) => n < 1024 ? `${n} B` : n <
|
|
826
|
+
var formatBytes = (n) => n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
|
|
833
827
|
function FileBlock({ m, set, el, ctx, autoFocus }) {
|
|
834
828
|
const { MediaPicker } = useKitServices();
|
|
835
829
|
const [picker, setPicker] = React.useState(false);
|
|
@@ -848,45 +842,47 @@ function FileBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
848
842
|
}, "Choose file")
|
|
849
843
|
}) : null;
|
|
850
844
|
if (has) return /* @__PURE__ */ jsxs("div", {
|
|
851
|
-
className: "group/blk
|
|
845
|
+
className: "group/blk",
|
|
852
846
|
"data-rt-isolate": "",
|
|
853
|
-
children: [
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
className: "size-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
className: "
|
|
866
|
-
children:
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
847
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
848
|
+
className: "flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
|
|
849
|
+
children: [
|
|
850
|
+
/* @__PURE__ */ jsx("span", {
|
|
851
|
+
className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2",
|
|
852
|
+
children: /* @__PURE__ */ jsx(IconFileText, {
|
|
853
|
+
className: "size-[18px]",
|
|
854
|
+
stroke: 1.5,
|
|
855
|
+
"aria-hidden": true
|
|
856
|
+
})
|
|
857
|
+
}),
|
|
858
|
+
/* @__PURE__ */ jsxs("div", {
|
|
859
|
+
className: "min-w-0 flex-1",
|
|
860
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
861
|
+
className: "truncate text-kit-sm font-medium text-kit-fg",
|
|
862
|
+
children: m.name
|
|
863
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
864
|
+
className: "truncate text-kit-xs text-kit-fg-3",
|
|
865
|
+
children: [m.size ? `${formatBytes(m.size)} · ` : "", (m.name.includes(".") ? m.name.split(".").pop() : "file").toUpperCase()]
|
|
866
|
+
})]
|
|
867
|
+
}),
|
|
868
|
+
ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
|
|
869
|
+
size: "xs",
|
|
870
|
+
variant: "ghost",
|
|
871
|
+
onClick: () => setPicker(true),
|
|
872
|
+
children: "Replace"
|
|
873
|
+
}) : null, /* @__PURE__ */ jsx(RemoveBtn, {
|
|
874
|
+
onClick: () => ctx.remove(el),
|
|
875
|
+
label: "Remove file"
|
|
876
|
+
})] })
|
|
877
|
+
]
|
|
878
|
+
}), pickerEl]
|
|
883
879
|
});
|
|
884
880
|
return /* @__PURE__ */ jsxs("div", {
|
|
885
|
-
className: "group/blk
|
|
881
|
+
className: "group/blk",
|
|
886
882
|
"data-rt-isolate": "",
|
|
887
883
|
children: [
|
|
888
884
|
/* @__PURE__ */ jsxs("div", {
|
|
889
|
-
className: "flex items-center gap-3",
|
|
885
|
+
className: "flex items-center gap-3 rounded-kit-lg border border-dashed border-kit-line-strong bg-kit-subtle px-3 py-2.5",
|
|
890
886
|
children: [
|
|
891
887
|
/* @__PURE__ */ jsx("span", {
|
|
892
888
|
className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg-3",
|
|
@@ -908,7 +904,7 @@ function FileBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
908
904
|
}),
|
|
909
905
|
ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
|
|
910
906
|
size: "sm",
|
|
911
|
-
leftIcon: /* @__PURE__ */ jsx(
|
|
907
|
+
leftIcon: /* @__PURE__ */ jsx(IconFileUpload, { stroke: 1.5 }),
|
|
912
908
|
onClick: () => setPicker(true),
|
|
913
909
|
children: "Choose file"
|
|
914
910
|
}) : null, /* @__PURE__ */ jsx(RemoveBtn, {
|
|
@@ -982,10 +978,10 @@ function ComponentBlock({ m, el, ctx, set }) {
|
|
|
982
978
|
set
|
|
983
979
|
});
|
|
984
980
|
const count = Object.keys(overrides).length;
|
|
985
|
-
const name = m.name || "
|
|
981
|
+
const name = m.name || "Block";
|
|
986
982
|
return /* @__PURE__ */ jsxs("div", {
|
|
987
983
|
role: "group",
|
|
988
|
-
"aria-label": `${name}, ${m.detached ? "separate copy" : "linked
|
|
984
|
+
"aria-label": `${name}, ${m.detached ? "separate copy" : "linked block"}`,
|
|
989
985
|
className: "group/blk flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
|
|
990
986
|
"data-rt-isolate": "",
|
|
991
987
|
children: [
|
|
@@ -1004,8 +1000,8 @@ function ComponentBlock({ m, el, ctx, set }) {
|
|
|
1004
1000
|
children: name
|
|
1005
1001
|
}), /* @__PURE__ */ jsx("div", {
|
|
1006
1002
|
className: "truncate text-kit-xs text-kit-fg-3",
|
|
1007
|
-
children: m.detached ? "Separate copy · edits to the
|
|
1008
|
-
m.ref ? "Linked
|
|
1003
|
+
children: m.detached ? "Separate copy · edits to the block don't reach it" : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1004
|
+
m.ref ? "Linked block" : "Block with no source",
|
|
1009
1005
|
count ? ` · ${count} ${count === 1 ? "override" : "overrides"}` : "",
|
|
1010
1006
|
" · edits to the component show here too"
|
|
1011
1007
|
] })
|
|
@@ -1027,24 +1023,28 @@ function ComponentBlock({ m, el, ctx, set }) {
|
|
|
1027
1023
|
});
|
|
1028
1024
|
}
|
|
1029
1025
|
/**
|
|
1030
|
-
* What production's rich-text table keeps:
|
|
1031
|
-
*
|
|
1026
|
+
* What production's rich-text table keeps: typed columns (V2's Text, Number, Price, Yes / No, Link and Rating with their unit,
|
|
1027
|
+
* currency, decimals, alignment, yes / no words, scale and description; a row's and a cell's type and a cell's value: a
|
|
1028
|
+
* first-row cell's `column`, a row's / cell's `type`, a cell's `value`), the header row and row headers, an optional caption,
|
|
1029
|
+
* the note under the table, row groups, the totals row and the row and column highlights (`caption`, `notes`,
|
|
1030
|
+
* `rowGroups`, a row's `footer` / `highlight`, a first-row cell's `highlight` / `sortable`, the table's `filterable`).
|
|
1031
|
+
* the table's `jsonLd` and `design` (On phones, Keep column names in view)). Footnotes are stored as the table's `footnotes` and a cell's `note` (V2's default, allowFootnotes on). No setting is
|
|
1032
|
+
* pinned: V2's island passes no options, so its editor offers GENERAL_TABLE (sort, search and the JSON-LD choice on,
|
|
1033
|
+
* everything else at its default), and so does this.
|
|
1032
1034
|
*/
|
|
1033
1035
|
var STORED_TABLE = {
|
|
1034
|
-
columnTypes: ["text", "link"],
|
|
1035
1036
|
requireCaption: false,
|
|
1036
1037
|
allowGroups: true,
|
|
1037
|
-
allowFootnotes: false,
|
|
1038
1038
|
allowNote: true,
|
|
1039
1039
|
settings: {
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1040
|
+
sort: true,
|
|
1041
|
+
search: true
|
|
1042
|
+
},
|
|
1043
|
+
jsonLd: [
|
|
1044
|
+
"ItemList",
|
|
1045
|
+
"Dataset",
|
|
1046
|
+
"Offers"
|
|
1047
|
+
]
|
|
1048
1048
|
};
|
|
1049
1049
|
function TableBlock({ m, set, el, ctx }) {
|
|
1050
1050
|
return /* @__PURE__ */ jsx("div", {
|
|
@@ -1159,7 +1159,7 @@ function PullQuoteBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
1159
1159
|
const onKeyDown = (e) => {
|
|
1160
1160
|
if (e.defaultPrevented || e.target !== card.current) return;
|
|
1161
1161
|
const mod = e.metaKey || e.ctrlKey;
|
|
1162
|
-
const k = e
|
|
1162
|
+
const k = eventKey(e);
|
|
1163
1163
|
if (mod && k === "z") {
|
|
1164
1164
|
e.preventDefault();
|
|
1165
1165
|
e.stopPropagation();
|
|
@@ -1277,7 +1277,7 @@ function TakeawaysBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
1277
1277
|
const onKeyDown = (e) => {
|
|
1278
1278
|
if (e.defaultPrevented || e.target !== card.current) return;
|
|
1279
1279
|
const mod = e.metaKey || e.ctrlKey;
|
|
1280
|
-
const k = e
|
|
1280
|
+
const k = eventKey(e);
|
|
1281
1281
|
if (mod && k === "z") {
|
|
1282
1282
|
e.preventDefault();
|
|
1283
1283
|
e.stopPropagation();
|
|
@@ -1382,6 +1382,332 @@ function TakeawaysBlock({ m, set, el, ctx, autoFocus }) {
|
|
|
1382
1382
|
})]
|
|
1383
1383
|
});
|
|
1384
1384
|
}
|
|
1385
|
+
var EMBED_LABEL = "Embed";
|
|
1386
|
+
/** V2 article.ts ARTICLE_SCHEMAS.embed without `aspect` (the stored block keeps no shape): the popover is built from it. */
|
|
1387
|
+
var EMBED_SCHEMA = {
|
|
1388
|
+
name: "embed",
|
|
1389
|
+
title: EMBED_LABEL,
|
|
1390
|
+
kind: "object",
|
|
1391
|
+
icon: "code",
|
|
1392
|
+
fields: [{
|
|
1393
|
+
name: "url",
|
|
1394
|
+
title: "Link",
|
|
1395
|
+
type: "url",
|
|
1396
|
+
placeholder: "Paste a YouTube, X, CodePen, Figma or map link",
|
|
1397
|
+
validation: { required: true }
|
|
1398
|
+
}, {
|
|
1399
|
+
name: "title",
|
|
1400
|
+
title: "Title",
|
|
1401
|
+
type: "string",
|
|
1402
|
+
validation: {
|
|
1403
|
+
required: true,
|
|
1404
|
+
max: 120
|
|
1405
|
+
},
|
|
1406
|
+
description: "Not shown. Read by screen readers."
|
|
1407
|
+
}]
|
|
1408
|
+
};
|
|
1409
|
+
function EmbedBlock({ m, set, el, ctx, autoFocus }) {
|
|
1410
|
+
const label = EMBED_LABEL;
|
|
1411
|
+
const uid = React.useId();
|
|
1412
|
+
const card = React.useRef(null);
|
|
1413
|
+
const form = React.useRef(null);
|
|
1414
|
+
const open = useOpenArticle();
|
|
1415
|
+
const editing = open?.id === uid;
|
|
1416
|
+
const ro = !!ctx.readOnly;
|
|
1417
|
+
const modelRef = React.useRef(m);
|
|
1418
|
+
modelRef.current = m;
|
|
1419
|
+
const openPopover = React.useCallback((k) => {
|
|
1420
|
+
if (!ro) setOpenArticle({
|
|
1421
|
+
id: uid,
|
|
1422
|
+
focusKey: k ?? null,
|
|
1423
|
+
nonce: (openArticle?.nonce ?? 0) + 1
|
|
1424
|
+
});
|
|
1425
|
+
}, [uid, ro]);
|
|
1426
|
+
const close = React.useCallback(() => {
|
|
1427
|
+
if (openArticle?.id === uid) setOpenArticle(null);
|
|
1428
|
+
}, [uid]);
|
|
1429
|
+
const focusCard = React.useCallback(() => requestAnimationFrame(() => card.current?.focus({ preventScroll: true })), []);
|
|
1430
|
+
React.useEffect(() => () => {
|
|
1431
|
+
if (openArticle?.id === uid) setOpenArticle(null);
|
|
1432
|
+
}, [uid]);
|
|
1433
|
+
React.useEffect(() => {
|
|
1434
|
+
if (autoFocus && !ro) openPopover();
|
|
1435
|
+
}, []);
|
|
1436
|
+
const nonce = editing ? open.nonce : 0;
|
|
1437
|
+
React.useEffect(() => {
|
|
1438
|
+
if (!nonce) return;
|
|
1439
|
+
const id = requestAnimationFrame(() => focusField(form.current, openArticle?.focusKey ?? null));
|
|
1440
|
+
return () => cancelAnimationFrame(id);
|
|
1441
|
+
}, [nonce]);
|
|
1442
|
+
/** a form edit joins the body's one undo history (D54); typing coalesces per field */
|
|
1443
|
+
const commit = (next) => {
|
|
1444
|
+
const prev = modelRef.current;
|
|
1445
|
+
const field = ["url", "title"].find((k) => (next[k] ?? "") !== (prev[k] ?? "")) ?? "";
|
|
1446
|
+
set(() => next, `Edit ${label.toLowerCase()} ${field}`);
|
|
1447
|
+
};
|
|
1448
|
+
const onKeyDown = (e) => {
|
|
1449
|
+
if (e.defaultPrevented || e.target !== card.current) return;
|
|
1450
|
+
const mod = e.metaKey || e.ctrlKey;
|
|
1451
|
+
const k = eventKey(e);
|
|
1452
|
+
if (mod && k === "z") {
|
|
1453
|
+
e.preventDefault();
|
|
1454
|
+
e.stopPropagation();
|
|
1455
|
+
if (e.shiftKey) ctx.redo?.();
|
|
1456
|
+
else ctx.undo?.();
|
|
1457
|
+
return;
|
|
1458
|
+
}
|
|
1459
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
1460
|
+
e.preventDefault();
|
|
1461
|
+
openPopover();
|
|
1462
|
+
return;
|
|
1463
|
+
}
|
|
1464
|
+
if (e.key === "Escape") {
|
|
1465
|
+
e.preventDefault();
|
|
1466
|
+
e.stopPropagation();
|
|
1467
|
+
if (editing) close();
|
|
1468
|
+
else ctx.exit(el);
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1471
|
+
if (ro) return;
|
|
1472
|
+
if (mod && k === "d" && ctx.duplicate) {
|
|
1473
|
+
e.preventDefault();
|
|
1474
|
+
e.stopPropagation();
|
|
1475
|
+
ctx.duplicate(el);
|
|
1476
|
+
} else if (e.altKey && (e.key === "ArrowUp" || e.key === "ArrowDown") && ctx.move) {
|
|
1477
|
+
e.preventDefault();
|
|
1478
|
+
ctx.move(el, e.key === "ArrowUp" ? -1 : 1);
|
|
1479
|
+
focusCard();
|
|
1480
|
+
} else if (e.key === "Backspace" || e.key === "Delete") {
|
|
1481
|
+
e.preventDefault();
|
|
1482
|
+
ctx.remove(el);
|
|
1483
|
+
}
|
|
1484
|
+
};
|
|
1485
|
+
const actions = ro ? null : /* @__PURE__ */ jsxs("div", {
|
|
1486
|
+
className: cn("absolute -top-3.5 right-2 z-[2] flex items-center gap-0.5 rounded-kit-md border border-kit-line bg-kit-surface-raised p-0.5 opacity-0 shadow-kit-sm transition-opacity", "group-hover/art:opacity-100 group-focus-within/art:opacity-100 pointer-coarse:opacity-100", editing && "opacity-100"),
|
|
1487
|
+
children: [/* @__PURE__ */ jsx(Tooltip, {
|
|
1488
|
+
content: `Edit ${label.toLowerCase()}`,
|
|
1489
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
1490
|
+
size: "xs",
|
|
1491
|
+
label: `Edit ${label.toLowerCase()}`,
|
|
1492
|
+
onClick: () => editing ? close() : openPopover(),
|
|
1493
|
+
children: /* @__PURE__ */ jsx(IconSettings, { stroke: 1.5 })
|
|
1494
|
+
})
|
|
1495
|
+
}), /* @__PURE__ */ jsx(Tooltip, {
|
|
1496
|
+
content: `Remove ${label.toLowerCase()}`,
|
|
1497
|
+
children: /* @__PURE__ */ jsx(IconButton, {
|
|
1498
|
+
size: "xs",
|
|
1499
|
+
label: `Remove ${label.toLowerCase()}`,
|
|
1500
|
+
onClick: () => ctx.remove(el),
|
|
1501
|
+
className: "hover:text-kit-danger-fg",
|
|
1502
|
+
children: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 })
|
|
1503
|
+
})
|
|
1504
|
+
})]
|
|
1505
|
+
});
|
|
1506
|
+
return /* @__PURE__ */ jsxs(Popover, {
|
|
1507
|
+
open: editing,
|
|
1508
|
+
onOpenChange: (o, d) => {
|
|
1509
|
+
if (o) return;
|
|
1510
|
+
close();
|
|
1511
|
+
if (d?.reason !== "outside-press") focusCard();
|
|
1512
|
+
},
|
|
1513
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
1514
|
+
ref: card,
|
|
1515
|
+
role: "group",
|
|
1516
|
+
tabIndex: 0,
|
|
1517
|
+
"aria-label": `${label}${editing ? ", editing" : ""}`,
|
|
1518
|
+
"aria-roledescription": "block",
|
|
1519
|
+
"aria-haspopup": "dialog",
|
|
1520
|
+
"aria-expanded": editing,
|
|
1521
|
+
"data-rt-isolate": "",
|
|
1522
|
+
"data-article-block": "embed",
|
|
1523
|
+
onKeyDown,
|
|
1524
|
+
onClick: (e) => {
|
|
1525
|
+
if (ro || !e.currentTarget.contains(e.target)) return;
|
|
1526
|
+
const t = e.target;
|
|
1527
|
+
if (t.closest("button,a,[role=menuitem]")) return;
|
|
1528
|
+
openPopover(t.closest("[data-field]")?.getAttribute("data-field") ?? null);
|
|
1529
|
+
},
|
|
1530
|
+
className: cn("group/art relative rounded-kit-lg outline-none transition-shadow duration-150", !ro && "cursor-pointer", "focus-visible:shadow-[0_0_0_1px_var(--kit-line-strong)]", editing ? "shadow-[0_0_0_2px_var(--kit-accent)] focus-visible:shadow-[0_0_0_2px_var(--kit-accent)]" : !ro && "hover:shadow-[0_0_0_1px_var(--kit-line)]"),
|
|
1531
|
+
children: [
|
|
1532
|
+
/* @__PURE__ */ jsx(EmbedPreview, {
|
|
1533
|
+
m,
|
|
1534
|
+
onAdd: () => openPopover("url"),
|
|
1535
|
+
ro
|
|
1536
|
+
}),
|
|
1537
|
+
actions,
|
|
1538
|
+
/* @__PURE__ */ jsx(PopoverAnchor, { render: /* @__PURE__ */ jsx("span", {
|
|
1539
|
+
"aria-hidden": true,
|
|
1540
|
+
className: "pointer-events-none absolute right-2 top-2 size-px"
|
|
1541
|
+
}) })
|
|
1542
|
+
]
|
|
1543
|
+
}), editing ? /* @__PURE__ */ jsxs(PopoverContent, {
|
|
1544
|
+
align: "end",
|
|
1545
|
+
side: "bottom",
|
|
1546
|
+
className: "w-[340px] p-0",
|
|
1547
|
+
initialFocus: false,
|
|
1548
|
+
finalFocus: false,
|
|
1549
|
+
onKeyDown: (e) => {
|
|
1550
|
+
if ((e.metaKey || e.ctrlKey) && !e.altKey && eventKey(e) === "z" && !e.defaultPrevented) {
|
|
1551
|
+
e.preventDefault();
|
|
1552
|
+
if (e.shiftKey) ctx.redo?.();
|
|
1553
|
+
else ctx.undo?.();
|
|
1554
|
+
}
|
|
1555
|
+
},
|
|
1556
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
1557
|
+
className: "flex h-10 items-center gap-2 border-b border-kit-line-subtle pl-4 pr-1.5",
|
|
1558
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1559
|
+
className: "flex-1 truncate text-kit-sm font-medium text-kit-fg",
|
|
1560
|
+
children: label
|
|
1561
|
+
}), /* @__PURE__ */ jsx(IconButton, {
|
|
1562
|
+
size: "sm",
|
|
1563
|
+
label: "Close",
|
|
1564
|
+
onClick: () => (close(), focusCard()),
|
|
1565
|
+
children: /* @__PURE__ */ jsx(IconX, { stroke: 1.5 })
|
|
1566
|
+
})]
|
|
1567
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
1568
|
+
ref: form,
|
|
1569
|
+
className: "max-h-[min(480px,70vh)] overflow-y-auto pb-2",
|
|
1570
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
1571
|
+
"data-article-form": "",
|
|
1572
|
+
className: "min-w-0",
|
|
1573
|
+
children: [/* @__PURE__ */ jsx(SchemaForm, {
|
|
1574
|
+
schema: EMBED_SCHEMA,
|
|
1575
|
+
value: {
|
|
1576
|
+
url: m.url ?? "",
|
|
1577
|
+
title: m.title ?? ""
|
|
1578
|
+
},
|
|
1579
|
+
onChange: (v) => commit({
|
|
1580
|
+
...modelRef.current,
|
|
1581
|
+
url: String(v.url ?? ""),
|
|
1582
|
+
title: String(v.title ?? "")
|
|
1583
|
+
}),
|
|
1584
|
+
variant: "panel",
|
|
1585
|
+
scroll: false,
|
|
1586
|
+
readOnly: ro,
|
|
1587
|
+
rootLabel: label,
|
|
1588
|
+
env: {
|
|
1589
|
+
docId: `article:${EMBED_SCHEMA.name}`,
|
|
1590
|
+
docTitle: label
|
|
1591
|
+
}
|
|
1592
|
+
}), /* @__PURE__ */ jsx("style", { children: `[data-article-form] [data-kit-form] section:first-of-type { border-top-width: 0; margin-top: 0; padding-top: 0; }` })]
|
|
1593
|
+
})
|
|
1594
|
+
})]
|
|
1595
|
+
}) : null]
|
|
1596
|
+
});
|
|
1597
|
+
}
|
|
1598
|
+
/** V2 article-blocks.tsx Empty: a block with nothing to show yet. */
|
|
1599
|
+
var ArticleEmpty = ({ icon, title, action, onAction, ro }) => /* @__PURE__ */ jsxs("div", {
|
|
1600
|
+
className: "flex items-center gap-3 rounded-kit-lg border border-dashed border-kit-line-strong bg-kit-subtle px-4 py-3.5",
|
|
1601
|
+
children: [
|
|
1602
|
+
/* @__PURE__ */ jsx("span", {
|
|
1603
|
+
className: "flex size-8 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg-2 [&_svg]:size-4",
|
|
1604
|
+
children: icon
|
|
1605
|
+
}),
|
|
1606
|
+
/* @__PURE__ */ jsx("span", {
|
|
1607
|
+
className: "min-w-0 flex-1 text-kit-sm font-medium text-kit-fg",
|
|
1608
|
+
children: title
|
|
1609
|
+
}),
|
|
1610
|
+
ro ? null : /* @__PURE__ */ jsx(Button, {
|
|
1611
|
+
size: "sm",
|
|
1612
|
+
onClick: onAction,
|
|
1613
|
+
children: action
|
|
1614
|
+
})
|
|
1615
|
+
]
|
|
1616
|
+
});
|
|
1617
|
+
var PROVIDER_ICON = {
|
|
1618
|
+
youtube: /* @__PURE__ */ jsx(IconBrandYoutube, { stroke: 1.5 }),
|
|
1619
|
+
vimeo: /* @__PURE__ */ jsx(IconBrandVimeo, { stroke: 1.5 }),
|
|
1620
|
+
x: /* @__PURE__ */ jsx(IconBrandX, { stroke: 1.5 }),
|
|
1621
|
+
codepen: /* @__PURE__ */ jsx(IconBrandCodepen, { stroke: 1.5 }),
|
|
1622
|
+
figma: /* @__PURE__ */ jsx(IconBrandFigma, { stroke: 1.5 }),
|
|
1623
|
+
maps: /* @__PURE__ */ jsx(IconMap, { stroke: 1.5 }),
|
|
1624
|
+
spotify: /* @__PURE__ */ jsx(IconBrandSpotify, { stroke: 1.5 }),
|
|
1625
|
+
podcast: /* @__PURE__ */ jsx(IconMicrophone, { stroke: 1.5 }),
|
|
1626
|
+
audio: /* @__PURE__ */ jsx(IconHeadphones, { stroke: 1.5 }),
|
|
1627
|
+
link: /* @__PURE__ */ jsx(IconWorld, { stroke: 1.5 })
|
|
1628
|
+
};
|
|
1629
|
+
/** V2 EmbedPreview: a faithful placeholder (provider, title and shape), no third-party frame in the editor. Drawn 16:9. */
|
|
1630
|
+
function EmbedPreview({ m, onAdd, ro }) {
|
|
1631
|
+
if (!m.url) return /* @__PURE__ */ jsx(ArticleEmpty, {
|
|
1632
|
+
icon: /* @__PURE__ */ jsx(IconLink, { stroke: 1.5 }),
|
|
1633
|
+
title: "Embed",
|
|
1634
|
+
action: "Paste a link",
|
|
1635
|
+
onAction: onAdd,
|
|
1636
|
+
ro
|
|
1637
|
+
});
|
|
1638
|
+
const info = detectEmbed(m.url);
|
|
1639
|
+
const icon = PROVIDER_ICON[info.provider];
|
|
1640
|
+
const title = m.title || /* @__PURE__ */ jsx("span", {
|
|
1641
|
+
className: "text-kit-warning-fg",
|
|
1642
|
+
children: "Add a title"
|
|
1643
|
+
});
|
|
1644
|
+
if (info.shape === "frame") return /* @__PURE__ */ jsx("figure", {
|
|
1645
|
+
className: "m-0",
|
|
1646
|
+
"data-field": "url",
|
|
1647
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
1648
|
+
className: "relative mx-auto flex w-full flex-col items-center justify-center gap-2 overflow-hidden rounded-kit-lg border border-kit-line bg-kit-subtle text-center",
|
|
1649
|
+
style: { aspectRatio: "16 / 9" },
|
|
1650
|
+
children: [
|
|
1651
|
+
/* @__PURE__ */ jsx("span", {
|
|
1652
|
+
className: "flex size-11 items-center justify-center rounded-full bg-kit-inverse text-kit-fg-inverse [&_svg]:size-5",
|
|
1653
|
+
children: info.provider === "youtube" || info.provider === "vimeo" ? /* @__PURE__ */ jsx(IconPlayerPlayFilled, {}) : icon
|
|
1654
|
+
}),
|
|
1655
|
+
/* @__PURE__ */ jsx("span", {
|
|
1656
|
+
"data-field": "title",
|
|
1657
|
+
className: "max-w-[80%] truncate text-kit-sm font-medium text-kit-fg",
|
|
1658
|
+
children: title
|
|
1659
|
+
}),
|
|
1660
|
+
/* @__PURE__ */ jsxs("span", {
|
|
1661
|
+
className: "absolute left-3 top-2.5 flex items-center gap-1.5 text-kit-xs text-kit-fg-2 [&_svg]:size-3.5",
|
|
1662
|
+
children: [icon, info.label]
|
|
1663
|
+
})
|
|
1664
|
+
]
|
|
1665
|
+
})
|
|
1666
|
+
});
|
|
1667
|
+
if (info.shape === "audio") return /* @__PURE__ */ jsxs("figure", {
|
|
1668
|
+
className: "m-0 flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-subtle px-3 py-2.5",
|
|
1669
|
+
"data-field": "url",
|
|
1670
|
+
children: [
|
|
1671
|
+
/* @__PURE__ */ jsx("span", {
|
|
1672
|
+
className: "flex size-9 shrink-0 items-center justify-center rounded-full bg-kit-inverse text-kit-fg-inverse [&_svg]:size-4",
|
|
1673
|
+
children: /* @__PURE__ */ jsx(IconPlayerPlayFilled, {})
|
|
1674
|
+
}),
|
|
1675
|
+
/* @__PURE__ */ jsxs("span", {
|
|
1676
|
+
className: "min-w-0 flex-1",
|
|
1677
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1678
|
+
"data-field": "title",
|
|
1679
|
+
className: "block truncate text-kit-sm font-medium text-kit-fg",
|
|
1680
|
+
children: title
|
|
1681
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
1682
|
+
className: "flex items-center gap-1 text-kit-xs text-kit-fg-3 [&_svg]:size-3",
|
|
1683
|
+
children: [icon, info.label]
|
|
1684
|
+
})]
|
|
1685
|
+
}),
|
|
1686
|
+
/* @__PURE__ */ jsx("span", {
|
|
1687
|
+
"aria-hidden": true,
|
|
1688
|
+
className: "hidden h-1 w-28 rounded-full bg-kit-line-strong sm:block"
|
|
1689
|
+
})
|
|
1690
|
+
]
|
|
1691
|
+
});
|
|
1692
|
+
return /* @__PURE__ */ jsxs("figure", {
|
|
1693
|
+
className: "m-0 flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
|
|
1694
|
+
"data-field": "url",
|
|
1695
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1696
|
+
className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2 [&_svg]:size-4",
|
|
1697
|
+
children: icon
|
|
1698
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
1699
|
+
className: "min-w-0 flex-1",
|
|
1700
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
1701
|
+
"data-field": "title",
|
|
1702
|
+
className: "block truncate text-kit-sm font-medium text-kit-fg",
|
|
1703
|
+
children: title
|
|
1704
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
1705
|
+
className: "block truncate text-kit-xs text-kit-fg-3",
|
|
1706
|
+
children: info.shape === "post" ? `${info.label} · ${m.url.replace(/^https?:\/\/(www\.)?/, "")}` : m.url.replace(/^https?:\/\/(www\.)?/, "")
|
|
1707
|
+
})]
|
|
1708
|
+
})]
|
|
1709
|
+
});
|
|
1710
|
+
}
|
|
1385
1711
|
function ArticlePanel({ label, anchor, nonce, focusKey, onClose, focusBack, ctx, el, children }) {
|
|
1386
1712
|
const panel = React.useRef(null);
|
|
1387
1713
|
const titleId = React.useId();
|
|
@@ -1408,71 +1734,72 @@ function ArticlePanel({ label, anchor, nonce, focusKey, onClose, focusBack, ctx,
|
|
|
1408
1734
|
return () => timers.forEach((t) => window.clearTimeout(t));
|
|
1409
1735
|
}, [nonce]);
|
|
1410
1736
|
React.useEffect(() => panel.current?.announce(`${label} properties.`), [label]);
|
|
1737
|
+
const header = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1738
|
+
/* @__PURE__ */ jsx("span", {
|
|
1739
|
+
id: titleId,
|
|
1740
|
+
className: "min-w-0 flex-1 truncate text-kit-sm font-medium text-kit-fg",
|
|
1741
|
+
children: label
|
|
1742
|
+
}),
|
|
1743
|
+
/* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
|
|
1744
|
+
size: "sm",
|
|
1745
|
+
label: `${label} actions`,
|
|
1746
|
+
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
1747
|
+
}) }), /* @__PURE__ */ jsxs(MenuContent, {
|
|
1748
|
+
align: "end",
|
|
1749
|
+
className: "w-52",
|
|
1750
|
+
children: [
|
|
1751
|
+
ctx.readOnly || !ctx.duplicate ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
|
|
1752
|
+
icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
|
|
1753
|
+
onClick: () => ctx.duplicate?.(el),
|
|
1754
|
+
children: "Duplicate"
|
|
1755
|
+
}), /* @__PURE__ */ jsx(MenuSeparator, {})] }),
|
|
1756
|
+
/* @__PURE__ */ jsx(MenuItem, {
|
|
1757
|
+
icon: /* @__PURE__ */ jsx(IconArrowsMove, { stroke: 1.5 }),
|
|
1758
|
+
onClick: () => panel.current?.keyboard("move"),
|
|
1759
|
+
children: "Move panel"
|
|
1760
|
+
}),
|
|
1761
|
+
/* @__PURE__ */ jsx(MenuItem, {
|
|
1762
|
+
icon: /* @__PURE__ */ jsx(IconDimensions, { stroke: 1.5 }),
|
|
1763
|
+
onClick: () => panel.current?.keyboard("resize"),
|
|
1764
|
+
children: "Resize panel"
|
|
1765
|
+
}),
|
|
1766
|
+
/* @__PURE__ */ jsx(MenuItem, {
|
|
1767
|
+
icon: /* @__PURE__ */ jsx(IconLayoutSidebar, { stroke: 1.5 }),
|
|
1768
|
+
onClick: () => panel.current?.dock("left"),
|
|
1769
|
+
children: "Dock left"
|
|
1770
|
+
}),
|
|
1771
|
+
/* @__PURE__ */ jsx(MenuItem, {
|
|
1772
|
+
icon: /* @__PURE__ */ jsx(IconLayoutSidebarRight, { stroke: 1.5 }),
|
|
1773
|
+
onClick: () => panel.current?.dock("right"),
|
|
1774
|
+
children: "Dock right"
|
|
1775
|
+
}),
|
|
1776
|
+
ctx.readOnly ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(MenuItem, {
|
|
1777
|
+
danger: true,
|
|
1778
|
+
icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
|
|
1779
|
+
onClick: () => ctx.remove(el),
|
|
1780
|
+
children: "Remove"
|
|
1781
|
+
})] })
|
|
1782
|
+
]
|
|
1783
|
+
})] }),
|
|
1784
|
+
/* @__PURE__ */ jsx(IconButton, {
|
|
1785
|
+
size: "sm",
|
|
1786
|
+
label: "Close properties",
|
|
1787
|
+
tooltip: "Close",
|
|
1788
|
+
onClick: () => (onClose(), focusBack()),
|
|
1789
|
+
children: /* @__PURE__ */ jsx(IconX, { stroke: 1.5 })
|
|
1790
|
+
})
|
|
1791
|
+
] });
|
|
1411
1792
|
return /* @__PURE__ */ jsx(FloatingPanel, {
|
|
1412
1793
|
ref: panel,
|
|
1413
1794
|
id: "article-properties",
|
|
1414
1795
|
labelledBy: titleId,
|
|
1415
1796
|
anchor,
|
|
1416
1797
|
container,
|
|
1417
|
-
header
|
|
1418
|
-
/* @__PURE__ */ jsx("span", {
|
|
1419
|
-
id: titleId,
|
|
1420
|
-
className: "min-w-0 flex-1 truncate text-kit-sm font-medium text-kit-fg",
|
|
1421
|
-
children: label
|
|
1422
|
-
}),
|
|
1423
|
-
/* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
|
|
1424
|
-
size: "sm",
|
|
1425
|
-
label: `${label} actions`,
|
|
1426
|
-
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
1427
|
-
}) }), /* @__PURE__ */ jsxs(MenuContent, {
|
|
1428
|
-
align: "end",
|
|
1429
|
-
className: "w-52",
|
|
1430
|
-
children: [
|
|
1431
|
-
ctx.readOnly || !ctx.duplicate ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
|
|
1432
|
-
icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
|
|
1433
|
-
onClick: () => ctx.duplicate?.(el),
|
|
1434
|
-
children: "Duplicate"
|
|
1435
|
-
}), /* @__PURE__ */ jsx(MenuSeparator, {})] }),
|
|
1436
|
-
/* @__PURE__ */ jsx(MenuItem, {
|
|
1437
|
-
icon: /* @__PURE__ */ jsx(IconArrowsMove, { stroke: 1.5 }),
|
|
1438
|
-
onClick: () => panel.current?.keyboard("move"),
|
|
1439
|
-
children: "Move panel"
|
|
1440
|
-
}),
|
|
1441
|
-
/* @__PURE__ */ jsx(MenuItem, {
|
|
1442
|
-
icon: /* @__PURE__ */ jsx(IconDimensions, { stroke: 1.5 }),
|
|
1443
|
-
onClick: () => panel.current?.keyboard("resize"),
|
|
1444
|
-
children: "Resize panel"
|
|
1445
|
-
}),
|
|
1446
|
-
/* @__PURE__ */ jsx(MenuItem, {
|
|
1447
|
-
icon: /* @__PURE__ */ jsx(IconLayoutSidebar, { stroke: 1.5 }),
|
|
1448
|
-
onClick: () => panel.current?.dock("left"),
|
|
1449
|
-
children: "Dock left"
|
|
1450
|
-
}),
|
|
1451
|
-
/* @__PURE__ */ jsx(MenuItem, {
|
|
1452
|
-
icon: /* @__PURE__ */ jsx(IconLayoutSidebarRight, { stroke: 1.5 }),
|
|
1453
|
-
onClick: () => panel.current?.dock("right"),
|
|
1454
|
-
children: "Dock right"
|
|
1455
|
-
}),
|
|
1456
|
-
ctx.readOnly ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(MenuItem, {
|
|
1457
|
-
danger: true,
|
|
1458
|
-
icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
|
|
1459
|
-
onClick: () => ctx.remove(el),
|
|
1460
|
-
children: "Remove"
|
|
1461
|
-
})] })
|
|
1462
|
-
]
|
|
1463
|
-
})] }),
|
|
1464
|
-
/* @__PURE__ */ jsx(IconButton, {
|
|
1465
|
-
size: "sm",
|
|
1466
|
-
label: "Close properties",
|
|
1467
|
-
tooltip: "Close",
|
|
1468
|
-
onClick: () => (onClose(), focusBack()),
|
|
1469
|
-
children: /* @__PURE__ */ jsx(IconX, { stroke: 1.5 })
|
|
1470
|
-
})
|
|
1471
|
-
] }),
|
|
1798
|
+
header,
|
|
1472
1799
|
onClose,
|
|
1473
1800
|
focusBack,
|
|
1474
1801
|
onPanelKeyDown: (e) => {
|
|
1475
|
-
if ((e.metaKey || e.ctrlKey) && !e.altKey && e
|
|
1802
|
+
if ((e.metaKey || e.ctrlKey) && !e.altKey && eventKey(e) === "z" && !e.defaultPrevented) {
|
|
1476
1803
|
e.preventDefault();
|
|
1477
1804
|
if (e.shiftKey) ctx.redo?.();
|
|
1478
1805
|
else ctx.undo?.();
|