@bettercms-ai/kit 1.0.0 → 2.0.0-next.1
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 +94 -31
- package/dist/adapters/lossy.js +419 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +91 -26
- package/{adapters → dist/adapters}/prod-types.js +82 -13
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +1038 -204
- 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} +131 -2
- package/{context.js → dist/context.js} +44 -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 +116 -200
- 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 +59 -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 +21 -4
- package/{controls → dist/controls}/media.js +407 -130
- 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/article-shell.d.ts +145 -0
- package/dist/controls/rich-text/article-shell.js +510 -0
- package/dist/controls/rich-text/article-shell.js.map +1 -0
- package/dist/controls/rich-text/author.d.ts +25 -0
- package/dist/controls/rich-text/author.js +104 -0
- package/dist/controls/rich-text/author.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +60 -0
- package/{controls → dist/controls}/rich-text/blocks.js +164 -389
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/dist/controls/rich-text/button.d.ts +23 -0
- package/dist/controls/rich-text/button.js +85 -0
- package/dist/controls/rich-text/button.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +7 -4
- package/{controls → dist/controls}/rich-text/catalog.js +94 -68
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/dist/controls/rich-text/checklist.d.ts +24 -0
- package/dist/controls/rich-text/checklist.js +115 -0
- package/dist/controls/rich-text/checklist.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +7 -2
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/dist/controls/rich-text/columns.d.ts +41 -0
- package/dist/controls/rich-text/columns.js +181 -0
- package/dist/controls/rich-text/columns.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 +53 -9
- package/{controls → dist/controls}/rich-text/dom.js +388 -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 +226 -44
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/dist/controls/rich-text/embed.d.ts +28 -0
- package/dist/controls/rich-text/embed.js +210 -0
- package/dist/controls/rich-text/embed.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/dist/controls/rich-text/footnote.d.ts +41 -0
- package/dist/controls/rich-text/footnote.js +185 -0
- package/dist/controls/rich-text/footnote.js.map +1 -0
- package/dist/controls/rich-text/gallery.d.ts +28 -0
- package/dist/controls/rich-text/gallery.js +167 -0
- package/dist/controls/rich-text/gallery.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/{controls → dist/controls}/rich-text/link-form.d.ts +3 -1
- 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/dist/controls/rich-text/related.d.ts +36 -0
- package/dist/controls/rich-text/related.js +213 -0
- package/dist/controls/rich-text/related.js.map +1 -0
- package/dist/controls/rich-text/toc.d.ts +46 -0
- package/dist/controls/rich-text/toc.js +161 -0
- package/dist/controls/rich-text/toc.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 +70 -0
- package/dist/core/core.js +187 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +355 -0
- package/dist/core/facets.js +342 -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 +1511 -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 +36 -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 +58 -0
- package/dist/ui/autocomplete.js +194 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +8 -11
- 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 +83 -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/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
|
@@ -5,21 +5,26 @@ import { shortcutHintsOn } from "../../ui/shortcut-hint.js";
|
|
|
5
5
|
import { Menu, MenuContent, MenuItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
|
|
6
6
|
import { Textarea } from "../../ui/input.js";
|
|
7
7
|
import { ExpandedEditorModal } from "../../ui/expanded-editor-modal.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { COMPONENT_INSERT_TOAST } from "../component-services.js";
|
|
9
|
+
import { eventKey } from "../../lib/key-event.js";
|
|
10
|
+
import { closestBlock, createIsland, defaultModel, editingHost, esc, hydrate, isEmptyHtml, placeCaret, rangeRect, rid, sanitize, serialize, textBeforeCaret, topBlock } from "./dom.js";
|
|
10
11
|
import { LinkForm } from "./link-form.js";
|
|
11
|
-
import { Island } from "./blocks.js";
|
|
12
12
|
import { CatalogComponentsProvider, InsertMenuContent, SlashMenuPanel, blockAllowed, catalogKey, noteRecent, useCatalog } from "./catalog.js";
|
|
13
|
-
import {
|
|
13
|
+
import { openComponentPanel } from "./component-panel.js";
|
|
14
|
+
import { Island } from "./blocks.js";
|
|
14
15
|
import { duplicateBlock, ensureLineAfter, insertBasic, insertIsland, liveInlineCode, liveMarkdown, moveBlock, restrictHtml, turnInto } from "./ops.js";
|
|
16
|
+
import { ButtonLinkPanel, applyButton, buttonAt, buttonInitial, insertButton, removeButton } from "./button.js";
|
|
17
|
+
import { checklistShortcut, insertChecklist, syncTaskA11y, toggleTaskAtPointer, toggleTaskFromKey } from "./checklist.js";
|
|
18
|
+
import { ALL_FEATURES } from "./codec.js";
|
|
19
|
+
import { htmlToMarkdown, looksLikeMarkdown, markdownToHtml } from "./markdown.js";
|
|
15
20
|
import { EMPTY_FMT, FormatToolbar, MARK_FEATURE, stylesFor } from "./toolbar.js";
|
|
16
21
|
import { SelectionBubble } from "./floating.js";
|
|
17
22
|
import * as React from "react";
|
|
18
|
-
import { IconArrowBarToDown, IconArrowBarToUp, IconCopy, IconGripVertical, IconPlus, IconTransform, IconTrash } from "@tabler/icons-react";
|
|
19
23
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
-
import {
|
|
24
|
+
import { IconArrowBarToDown, IconArrowBarToUp, IconCopy, IconGripVertical, IconPlus, IconTransform, IconTrash } from "@tabler/icons-react";
|
|
25
|
+
import { AnimatePresence, motion, useReducedMotion } from "framer-motion";
|
|
21
26
|
import { createPortal, flushSync } from "react-dom";
|
|
22
|
-
//#region src/
|
|
27
|
+
//#region src/controls/rich-text/editor.tsx
|
|
23
28
|
/**
|
|
24
29
|
* RICH TEXT — the boxed rich-text editor (V2 HEAD controls/rich-text-editor.tsx, Figma 60995-5431, CPO D49 / D54 / D55).
|
|
25
30
|
*
|
|
@@ -38,9 +43,9 @@ import { createPortal, flushSync } from "react-dom";
|
|
|
38
43
|
* Everything the editor offers is limited to what the field accepts (`features`): a toolbar button, a slash command, a
|
|
39
44
|
* Markdown shortcut or pasted markup the field cannot hold is not offered, or is turned into what it can hold and said so.
|
|
40
45
|
*/
|
|
41
|
-
var RT_PROSE = "text-kit-base leading-[1.6] text-kit-fg [&>*+*]:mt-3 [&_h1]:text-[28px] [&_h1]:font-semibold [&_h1]:leading-9 [&_h1]:tracking-[-0.01em] [&_h2]:text-[22px] [&_h2]:font-semibold [&_h2]:leading-8 [&_h2]:tracking-[-0.01em] [&_h3]:text-kit-lg [&_h3]:font-semibold [&_h4]:text-kit-md [&_h4]:font-semibold [&_h5]:text-kit-base [&_h5]:font-semibold [&_h6]:text-kit-sm [&_h6]:font-semibold [&_h6]:uppercase [&_h6]:tracking-wide [&_h6]:text-kit-fg-2 [&>h1]:mt-6 [&>h2]:mt-6 [&>h3]:mt-5 [&>*:first-child]:mt-0 [&_ul:not([data-rt-isolate]_*)]:list-disc [&_ul:not([data-rt-isolate]_*)]:pl-5 [&_ol:not([data-rt-isolate]_*)]:list-decimal [&_ol:not([data-rt-isolate]_*)]:pl-5 [&_li:not([data-rt-isolate]_*)]:pl-1 [&_li+li:not([data-rt-isolate]_*)]:mt-1 [&_li:not([data-rt-isolate]_*)]:marker:text-kit-fg-3 [&_blockquote]:border-l-2 [&_blockquote]:border-kit-line-strong [&_blockquote]:pl-4 [&_blockquote]:text-kit-fg-2 [&_blockquote]:italic [&_a]:text-kit-accent-fg [&_a]:underline [&_a]:decoration-kit-accent-line [&_a]:underline-offset-2 [&_abbr]:cursor-help [&_abbr]:underline [&_abbr]:decoration-dotted [&_abbr]:underline-offset-2 [&_sup]:text-[0.7em] [&_sup]:leading-none [&_code]:rounded-kit-md [&_code]:bg-kit-muted [&_code]:px-1 [&_code]:py-px [&_code]:font-kit-mono [&_code]:text-[0.9em] [&_pre]:overflow-x-auto [&_pre]:whitespace-pre-wrap [&_pre]:rounded-kit-lg [&_pre]:border [&_pre]:border-kit-line [&_pre]:bg-kit-code [&_pre]:p-3 [&_pre]:font-kit-mono [&_pre]:text-kit-sm [&_pre_code]:rounded-none [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:text-[1em] [&_hr]:my-6 [&_hr]:border-kit-line [&_table]:w-full [&_table]:border-collapse [&_table]:text-kit-sm [&_td]:border [&_td]:border-kit-line [&_td]:px-2.5 [&_td]:py-1.5 [&_td]:align-top [&_th]:border [&_th]:border-kit-line [&_th]:bg-kit-subtle [&_th]:px-2.5 [&_th]:py-1.5 [&_th]:text-left [&_th]:align-top [&_th]:font-medium";
|
|
46
|
+
var RT_PROSE = "text-kit-base leading-[1.6] text-kit-fg [&>*+*]:mt-3 [&_span[class]:not([data-rt-isolate]_*)]:!text-inherit [&_span[class]:not([data-rt-isolate]_*)]:![-webkit-text-fill-color:currentColor] [&_span[class]:not([data-rt-isolate]_*)]:!bg-none [&_span[class]:not([data-rt-isolate]_*)]:!opacity-100 [&_span[class]:not([data-rt-isolate]_*)]:!visible [&_h1:not([data-rt-isolate]_*)]:text-[28px] [&_h1:not([data-rt-isolate]_*)]:font-semibold [&_h1:not([data-rt-isolate]_*)]:leading-9 [&_h1:not([data-rt-isolate]_*)]:tracking-[-0.01em] [&_h2:not([data-rt-isolate]_*)]:text-[22px] [&_h2:not([data-rt-isolate]_*)]:font-semibold [&_h2:not([data-rt-isolate]_*)]:leading-8 [&_h2:not([data-rt-isolate]_*)]:tracking-[-0.01em] [&_h3:not([data-rt-isolate]_*)]:text-kit-lg [&_h3:not([data-rt-isolate]_*)]:font-semibold [&_h4:not([data-rt-isolate]_*)]:text-kit-md [&_h4:not([data-rt-isolate]_*)]:font-semibold [&_h5:not([data-rt-isolate]_*)]:text-kit-base [&_h5:not([data-rt-isolate]_*)]:font-semibold [&_h6:not([data-rt-isolate]_*)]:text-kit-sm [&_h6:not([data-rt-isolate]_*)]:font-semibold [&_h6:not([data-rt-isolate]_*)]:uppercase [&_h6:not([data-rt-isolate]_*)]:tracking-wide [&_h6:not([data-rt-isolate]_*)]:text-kit-fg-2 [&>h1]:mt-6 [&>h2]:mt-6 [&>h3]:mt-5 [&>*:first-child]:mt-0 [&_ul:not([data-rt-isolate]_*)]:list-disc [&_ul:not([data-rt-isolate]_*)]:pl-5 [&_ol:not([data-rt-isolate]_*)]:list-decimal [&_ol:not([data-rt-isolate]_*)]:pl-5 [&_li:not([data-rt-isolate]_*)]:pl-1 [&_li+li:not([data-rt-isolate]_*)]:mt-1 [&_li:not([data-rt-isolate]_*)]:marker:text-kit-fg-3 [&_ul[data-task]:not([data-rt-isolate]_*)]:list-none [&_ul[data-task]:not([data-rt-isolate]_*)]:pl-0 [&_ul[data-task]>li:not([data-rt-isolate]_*)]:relative [&_ul[data-task]>li:not([data-rt-isolate]_*)]:pl-7 [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:absolute [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:left-0 [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:top-[0.2em] [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:flex [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:size-4 [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:items-center [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:justify-center [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:rounded-kit-md [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:border [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:border-kit-line-strong [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:bg-kit-surface [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:text-[11px] [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:font-semibold [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:leading-none [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:content-[''] [&_ul[data-task]>li[data-checked=true]:not([data-rt-isolate]_*)]:text-kit-fg-3 [&_ul[data-task]>li[data-checked=true]:not([data-rt-isolate]_*)]:line-through [&_ul[data-task]>li[data-checked=true]:not([data-rt-isolate]_*)]:before:border-kit-inverse [&_ul[data-task]>li[data-checked=true]:not([data-rt-isolate]_*)]:before:bg-kit-inverse [&_ul[data-task]>li[data-checked=true]:not([data-rt-isolate]_*)]:before:text-kit-fg-inverse [&_ul[data-task]>li[data-checked=true]:not([data-rt-isolate]_*)]:before:content-['✓'] [&_blockquote:not([data-rt-isolate]_*)]:border-l-2 [&_blockquote:not([data-rt-isolate]_*)]:border-kit-line-strong [&_blockquote:not([data-rt-isolate]_*)]:pl-4 [&_blockquote:not([data-rt-isolate]_*)]:text-kit-fg-2 [&_blockquote:not([data-rt-isolate]_*)]:italic [&_a:not([data-rt-isolate]_*)]:text-kit-accent-fg [&_a:not([data-rt-isolate]_*)]:underline [&_a:not([data-rt-isolate]_*)]:decoration-kit-accent-line [&_a:not([data-rt-isolate]_*)]:underline-offset-2 [&_a[data-button]:not([data-rt-isolate]_*)]:inline-flex [&_a[data-button]:not([data-rt-isolate]_*)]:h-9 [&_a[data-button]:not([data-rt-isolate]_*)]:items-center [&_a[data-button]:not([data-rt-isolate]_*)]:rounded-kit-md [&_a[data-button]:not([data-rt-isolate]_*)]:bg-kit-inverse [&_a[data-button]:not([data-rt-isolate]_*)]:px-3.5 [&_a[data-button]:not([data-rt-isolate]_*)]:text-kit-sm [&_a[data-button]:not([data-rt-isolate]_*)]:font-medium [&_a[data-button]:not([data-rt-isolate]_*)]:text-kit-fg-inverse [&_a[data-button]:not([data-rt-isolate]_*)]:no-underline [&_abbr:not([data-rt-isolate]_*)]:cursor-help [&_abbr:not([data-rt-isolate]_*)]:underline [&_abbr:not([data-rt-isolate]_*)]:decoration-dotted [&_abbr:not([data-rt-isolate]_*)]:underline-offset-2 [&_sup:not([data-rt-isolate]_*)]:text-[0.7em] [&_sup:not([data-rt-isolate]_*)]:leading-none [&_code:not([data-rt-isolate]_*)]:rounded-kit-md [&_code:not([data-rt-isolate]_*)]:bg-kit-muted [&_code:not([data-rt-isolate]_*)]:px-1 [&_code:not([data-rt-isolate]_*)]:py-px [&_code:not([data-rt-isolate]_*)]:font-kit-mono [&_code:not([data-rt-isolate]_*)]:text-[0.9em] [&_pre:not([data-rt-isolate]_*)]:overflow-x-auto [&_pre:not([data-rt-isolate]_*)]:whitespace-pre-wrap [&_pre:not([data-rt-isolate]_*)]:rounded-kit-lg [&_pre:not([data-rt-isolate]_*)]:bg-kit-code [&_pre:not([data-rt-isolate]_*)]:text-kit-code-fg [&_pre:not([data-rt-isolate]_*)]:p-3 [&_pre:not([data-rt-isolate]_*)]:font-kit-mono [&_pre:not([data-rt-isolate]_*)]:text-kit-sm [&_pre:not([data-rt-isolate]_*)]:border [&_pre:not([data-rt-isolate]_*)]:border-kit-line [&_pre_code:not([data-rt-isolate]_*)]:rounded-none [&_pre_code:not([data-rt-isolate]_*)]:bg-transparent [&_pre_code:not([data-rt-isolate]_*)]:p-0 [&_pre_code:not([data-rt-isolate]_*)]:text-[1em] [&_hr:not([data-rt-isolate]_*)]:my-6 [&_hr:not([data-rt-isolate]_*)]:border-kit-line [&_figure:not([data-rt-isolate]_*)]:my-4 [&_img:not([data-rt-isolate]_*)]:rounded-kit-lg [&_img:not([data-rt-isolate]_*)]:border [&_img:not([data-rt-isolate]_*)]:border-kit-line [&_figcaption:not([data-rt-isolate]_*)]:mt-1.5 [&_figcaption:not([data-rt-isolate]_*)]:text-center [&_figcaption:not([data-rt-isolate]_*)]:text-kit-sm [&_figcaption:not([data-rt-isolate]_*)]:text-kit-fg-3 [&_figure_img:not([data-rt-isolate]_*)]:block [&_figure[data-size=s]_img:not([data-rt-isolate]_*)]:w-1/3 [&_figure[data-size=m]_img:not([data-rt-isolate]_*)]:w-1/2 [&_figure[data-size=l]_img:not([data-rt-isolate]_*)]:w-3/4 [&_figure[data-align=center]_img:not([data-rt-isolate]_*)]:mx-auto [&_figure[data-align=right]_img:not([data-rt-isolate]_*)]:ml-auto [&_figure[data-align=full]_img:not([data-rt-isolate]_*)]:w-full [&_div[data-callout]:not([data-rt-isolate]_*)]:rounded-kit-lg [&_div[data-callout]:not([data-rt-isolate]_*)]:border [&_div[data-callout]:not([data-rt-isolate]_*)]:border-kit-info-line [&_div[data-callout]:not([data-rt-isolate]_*)]:bg-kit-info-soft [&_div[data-callout]:not([data-rt-isolate]_*)]:px-4 [&_div[data-callout]:not([data-rt-isolate]_*)]:py-3 [&_div[data-callout]:not([data-rt-isolate]_*)]:text-kit-fg [&_div[data-callout=tip]:not([data-rt-isolate]_*)]:border-kit-success-line [&_div[data-callout=tip]:not([data-rt-isolate]_*)]:bg-kit-success-soft [&_div[data-callout=warning]:not([data-rt-isolate]_*)]:border-kit-warning-line [&_div[data-callout=warning]:not([data-rt-isolate]_*)]:bg-kit-warning-soft [&_div[data-callout]>p[data-title]:not([data-rt-isolate]_*)]:font-medium [&_details:not([data-rt-isolate]_*)]:rounded-kit-md [&_summary:not([data-rt-isolate]_*)]:cursor-pointer [&_summary:not([data-rt-isolate]_*)]:font-medium [&_details>div:not([data-rt-isolate]_*)]:mt-1 [&_details>div:not([data-rt-isolate]_*)]:border-l [&_details>div:not([data-rt-isolate]_*)]:border-kit-line [&_details>div:not([data-rt-isolate]_*)]:pl-4 [&_details>div:not([data-rt-isolate]_*)]:ml-1 [&_div[data-rt=columns]:not([data-rt-isolate]_*)]:grid [&_div[data-rt=columns]:not([data-rt-isolate]_*)]:gap-4 [&_div[data-cols='2']:not([data-rt-isolate]_*)]:grid-cols-2 [&_div[data-cols='3']:not([data-rt-isolate]_*)]:grid-cols-3 [&_div[data-cols='4']:not([data-rt-isolate]_*)]:grid-cols-4 [&_div[data-gap=s]:not([data-rt-isolate]_*)]:gap-2 [&_div[data-gap=l]:not([data-rt-isolate]_*)]:gap-7 [&_div[data-rt=file]:not([data-rt-isolate]_*)]:rounded-kit-lg [&_div[data-rt=file]:not([data-rt-isolate]_*)]:border [&_div[data-rt=file]:not([data-rt-isolate]_*)]:border-kit-line [&_div[data-rt=file]:not([data-rt-isolate]_*)]:px-3 [&_div[data-rt=file]:not([data-rt-isolate]_*)]:py-2.5 [&_div[data-rt=file]:not([data-rt-isolate]_*)]:text-kit-sm [&_div[data-embed]:not([data-rt-isolate]_*)]:flex [&_div[data-embed]:not([data-rt-isolate]_*)]:aspect-video [&_div[data-embed]:not([data-rt-isolate]_*)]:items-center [&_div[data-embed]:not([data-rt-isolate]_*)]:justify-center [&_div[data-embed]:not([data-rt-isolate]_*)]:rounded-kit-lg [&_div[data-embed]:not([data-rt-isolate]_*)]:border [&_div[data-embed]:not([data-rt-isolate]_*)]:border-kit-line [&_div[data-embed]:not([data-rt-isolate]_*)]:bg-kit-subtle [&_div[data-embed]:not([data-rt-isolate]_*)]:text-kit-sm [&_div[data-embed]:not([data-rt-isolate]_*)]:text-kit-fg-3 [&_div[data-block]:not([data-rt-isolate]_*)]:flex [&_div[data-block]:not([data-rt-isolate]_*)]:items-center [&_div[data-block]:not([data-rt-isolate]_*)]:gap-2 [&_div[data-block]:not([data-rt-isolate]_*)]:rounded-kit-lg [&_div[data-block]:not([data-rt-isolate]_*)]:border [&_div[data-block]:not([data-rt-isolate]_*)]:border-dashed [&_div[data-block]:not([data-rt-isolate]_*)]:border-kit-accent-line [&_div[data-block]:not([data-rt-isolate]_*)]:bg-kit-accent-softer [&_div[data-block]:not([data-rt-isolate]_*)]:px-3 [&_div[data-block]:not([data-rt-isolate]_*)]:py-3 [&_div[data-block]:not([data-rt-isolate]_*)]:text-kit-sm [&_div[data-block]:not([data-rt-isolate]_*)]:text-kit-accent-fg [&_table:not([data-rt-isolate]_*)]:w-full [&_table:not([data-rt-isolate]_*)]:border-collapse [&_table:not([data-rt-isolate]_*)]:text-kit-sm [&_td:not([data-rt-isolate]_*)]:border [&_td:not([data-rt-isolate]_*)]:border-kit-line [&_td:not([data-rt-isolate]_*)]:px-2.5 [&_td:not([data-rt-isolate]_*)]:py-1.5 [&_td:not([data-rt-isolate]_*)]:align-top [&_th:not([data-rt-isolate]_*)]:border [&_th:not([data-rt-isolate]_*)]:border-kit-line [&_th:not([data-rt-isolate]_*)]:bg-kit-subtle [&_th:not([data-rt-isolate]_*)]:px-2.5 [&_th:not([data-rt-isolate]_*)]:py-1.5 [&_th:not([data-rt-isolate]_*)]:text-left [&_th:not([data-rt-isolate]_*)]:align-top [&_th:not([data-rt-isolate]_*)]:font-medium";
|
|
42
47
|
/** Panel density (≈340px inspector): 13px text, smaller headings. */
|
|
43
|
-
var RT_PANEL = "text-kit-sm leading-[1.6] [&_h1]:text-kit-xl [&_h1]:leading-7 [&_h2]:text-kit-lg [&_h2]:leading-7 [&_h3]:text-kit-md [&_h4]:text-kit-base [&_h5]:text-kit-sm [&_h6]:text-kit-xs";
|
|
48
|
+
var RT_PANEL = "text-kit-sm leading-[1.6] [&_h1:not([data-rt-isolate]_*)]:text-kit-xl [&_h1:not([data-rt-isolate]_*)]:leading-7 [&_h2:not([data-rt-isolate]_*)]:text-kit-lg [&_h2:not([data-rt-isolate]_*)]:leading-7 [&_h3:not([data-rt-isolate]_*)]:text-kit-md [&_h4:not([data-rt-isolate]_*)]:text-kit-base [&_h5:not([data-rt-isolate]_*)]:text-kit-sm [&_h6:not([data-rt-isolate]_*)]:text-kit-xs";
|
|
44
49
|
/** execCommand, where the engine has it (it returns false where it does not). */
|
|
45
50
|
var exec = (cmd, arg) => {
|
|
46
51
|
try {
|
|
@@ -49,6 +54,41 @@ var exec = (cmd, arg) => {
|
|
|
49
54
|
return false;
|
|
50
55
|
}
|
|
51
56
|
};
|
|
57
|
+
/** A footnote marker (`<sup data-footnote>`, or the table's `<sup><a href="#…-fn-n">`): never an x² mark. */
|
|
58
|
+
var FOOTNOTE_SUP = "sup[data-footnote], sup:has(> a[href*='-fn-'])";
|
|
59
|
+
/** x² / x₂ (V2): on inside the same mark takes it off (unwrap, keeping the words selected); inside the other one swaps;
|
|
60
|
+
* otherwise the browser wraps the selection. Footnote markers are never touched. */
|
|
61
|
+
function toggleScript(root, tag) {
|
|
62
|
+
const s = window.getSelection();
|
|
63
|
+
if (!s || !s.rangeCount) return;
|
|
64
|
+
const at = (n) => n?.nodeType === 1 ? n : n?.parentElement ?? null;
|
|
65
|
+
const find = (t) => {
|
|
66
|
+
const el = at(s.anchorNode)?.closest(t === "sup" ? `sup:not(${FOOTNOTE_SUP})` : "sub");
|
|
67
|
+
return el && root.contains(el) ? el : null;
|
|
68
|
+
};
|
|
69
|
+
const unwrap = (el) => {
|
|
70
|
+
const first = el.firstChild;
|
|
71
|
+
const last = el.lastChild;
|
|
72
|
+
el.replaceWith(...Array.from(el.childNodes));
|
|
73
|
+
if (first && last) {
|
|
74
|
+
const r = document.createRange();
|
|
75
|
+
r.setStartBefore(first);
|
|
76
|
+
r.setEndAfter(last);
|
|
77
|
+
s.removeAllRanges();
|
|
78
|
+
s.addRange(r);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const same = find(tag);
|
|
82
|
+
if (same) return unwrap(same);
|
|
83
|
+
const other = find(tag === "sup" ? "sub" : "sup");
|
|
84
|
+
if (other) unwrap(other);
|
|
85
|
+
exec(tag === "sup" ? "superscript" : "subscript");
|
|
86
|
+
}
|
|
87
|
+
/** Focus is in another text field (the comment composer, a link input) while the page's selection stays in this editor. */
|
|
88
|
+
var typingElsewhere = (el) => {
|
|
89
|
+
const ae = document.activeElement;
|
|
90
|
+
return !!el && !!ae && ae !== el && !el.contains(ae) && ae.matches("input, textarea, [contenteditable='true']");
|
|
91
|
+
};
|
|
52
92
|
var queryState = (c) => {
|
|
53
93
|
try {
|
|
54
94
|
return typeof document.queryCommandState === "function" && document.queryCommandState(c);
|
|
@@ -74,6 +114,36 @@ function insertHtmlAtCaret(html) {
|
|
|
74
114
|
s.addRange(r);
|
|
75
115
|
}
|
|
76
116
|
}
|
|
117
|
+
var NOT_COUNTED = [
|
|
118
|
+
"[data-rt=component]",
|
|
119
|
+
"[data-rt=pullquote]",
|
|
120
|
+
"[data-rt=takeaways]",
|
|
121
|
+
"[data-rt=toc]",
|
|
122
|
+
"[data-rt=related]",
|
|
123
|
+
"[data-rt=author]",
|
|
124
|
+
"[data-rt=embed]",
|
|
125
|
+
"[data-rt=video]",
|
|
126
|
+
"[data-rt=file]",
|
|
127
|
+
"[data-rt=footnotes]",
|
|
128
|
+
"sup[data-rt=fn]"
|
|
129
|
+
].join(",");
|
|
130
|
+
var WORDS = (s) => s.replace(/\u200b/g, "").trim().split(/\s+/).filter(Boolean).length;
|
|
131
|
+
function countWords(html) {
|
|
132
|
+
if (!html) return 0;
|
|
133
|
+
if (!/data-rt="(?:component|pullquote|takeaways|toc|related|author|embed|video|file|footnotes|fn)"/.test(html) || typeof DOMParser === "undefined") return WORDS(html.replace(/<[^>]+>/g, " ").replace(/ |&[a-z]+;/g, " "));
|
|
134
|
+
const doc = new DOMParser().parseFromString(`<body>${html}</body>`, "text/html");
|
|
135
|
+
doc.body.querySelectorAll(NOT_COUNTED).forEach((n) => n.remove());
|
|
136
|
+
doc.body.querySelectorAll("p,li,h1,h2,h3,h4,h5,h6,td,th,figcaption,summary,pre,blockquote,div").forEach((n) => n.append(" "));
|
|
137
|
+
return WORDS(doc.body.textContent ?? "");
|
|
138
|
+
}
|
|
139
|
+
/** Linked component instances in the body. */
|
|
140
|
+
var countComponents = (html) => (html.match(/data-rt="component"/g) ?? []).length;
|
|
141
|
+
/** "1,840 words · 3 components" */
|
|
142
|
+
var bodyCountLabel = (html) => {
|
|
143
|
+
const w = countWords(html);
|
|
144
|
+
const c = countComponents(html);
|
|
145
|
+
return `${w.toLocaleString("en-US")} ${w === 1 ? "word" : "words"}${c ? ` · ${c} ${c === 1 ? "component" : "components"}` : ""}`;
|
|
146
|
+
};
|
|
77
147
|
function insertTextAtCaret(text) {
|
|
78
148
|
if (exec("insertText", text)) return;
|
|
79
149
|
const s = window.getSelection();
|
|
@@ -135,7 +205,21 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
135
205
|
const setModalOpen = (o) => onExpandedOpenChange ? onExpandedOpenChange(o) : setModalOwn(o);
|
|
136
206
|
const [md, setMd] = React.useState(null);
|
|
137
207
|
const [mdConfirm, setMdConfirm] = React.useState(false);
|
|
208
|
+
const reduceMotion = useReducedMotion();
|
|
138
209
|
const [bubble, setBubble] = React.useState(null);
|
|
210
|
+
/** Comment was picked: the toolbar stays away until the next click or key inside this editor */
|
|
211
|
+
const [quiet, setQuiet] = React.useState(false);
|
|
212
|
+
React.useEffect(() => {
|
|
213
|
+
const el = ref.current;
|
|
214
|
+
if (!quiet || !el) return;
|
|
215
|
+
const wake = () => setQuiet(false);
|
|
216
|
+
el.addEventListener("mousedown", wake);
|
|
217
|
+
el.addEventListener("keydown", wake);
|
|
218
|
+
return () => {
|
|
219
|
+
el.removeEventListener("mousedown", wake);
|
|
220
|
+
el.removeEventListener("keydown", wake);
|
|
221
|
+
};
|
|
222
|
+
}, [quiet]);
|
|
139
223
|
const [slash, setSlash] = React.useState(null);
|
|
140
224
|
const [gutter, setGutter] = React.useState(null);
|
|
141
225
|
const [blockMenu, setBlockMenu] = React.useState(false);
|
|
@@ -203,6 +287,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
203
287
|
if (!el) return;
|
|
204
288
|
el.innerHTML = sanitize(html || "") || "<p><br></p>";
|
|
205
289
|
hydrate(el);
|
|
290
|
+
syncTaskA11y(el);
|
|
206
291
|
known.current = html;
|
|
207
292
|
setEmpty(isEmptyHtml(html));
|
|
208
293
|
setWords(countWords(html));
|
|
@@ -213,6 +298,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
213
298
|
const el = ref.current;
|
|
214
299
|
if (!el) return;
|
|
215
300
|
syncIslands();
|
|
301
|
+
syncTaskA11y(el);
|
|
216
302
|
const html = serialize(el);
|
|
217
303
|
setEmpty(isEmptyHtml(html) && !el.querySelector(":scope > [data-rt-island], :scope > hr"));
|
|
218
304
|
setWords(countWords(html));
|
|
@@ -269,7 +355,8 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
269
355
|
if (cs.overflowX !== "visible" || cs.overflowY !== "visible") break;
|
|
270
356
|
a = a.parentElement;
|
|
271
357
|
}
|
|
272
|
-
|
|
358
|
+
const left = w.getBoundingClientRect().left - (a ? a.getBoundingClientRect().left : 0);
|
|
359
|
+
setGutterRoom(left >= 48);
|
|
273
360
|
};
|
|
274
361
|
const ro = new ResizeObserver(([e]) => {
|
|
275
362
|
setWidth(Math.round(e.contentRect.width));
|
|
@@ -325,13 +412,17 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
325
412
|
cancelAnimationFrame(raf);
|
|
326
413
|
raf = requestAnimationFrame(() => {
|
|
327
414
|
const s = window.getSelection();
|
|
328
|
-
|
|
415
|
+
const ok = s && s.rangeCount && !s.isCollapsed && ref.current?.contains(s.anchorNode) && !typingElsewhere(ref.current);
|
|
416
|
+
setBubble(ok ? rangeRect(s.getRangeAt(0), ref.current) : null);
|
|
329
417
|
});
|
|
330
418
|
};
|
|
331
419
|
window.addEventListener("scroll", on, true);
|
|
332
420
|
window.addEventListener("resize", on);
|
|
421
|
+
const box = new ResizeObserver(on);
|
|
422
|
+
if (wrap.current) box.observe(wrap.current);
|
|
333
423
|
return () => {
|
|
334
424
|
cancelAnimationFrame(raf);
|
|
425
|
+
box.disconnect();
|
|
335
426
|
window.removeEventListener("scroll", on, true);
|
|
336
427
|
window.removeEventListener("resize", on);
|
|
337
428
|
};
|
|
@@ -358,6 +449,10 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
358
449
|
const el = ref.current;
|
|
359
450
|
const s = window.getSelection();
|
|
360
451
|
if (!el || !s || !s.rangeCount || !el.contains(s.anchorNode)) return;
|
|
452
|
+
if (typingElsewhere(el)) {
|
|
453
|
+
setBubble(null);
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
361
456
|
saved.current = s.getRangeAt(0).cloneRange();
|
|
362
457
|
const anchorEl = s.anchorNode?.nodeType === 1 ? s.anchorNode : s.anchorNode?.parentElement;
|
|
363
458
|
const inIsland = !!anchorEl?.closest("[data-rt-island]");
|
|
@@ -369,6 +464,8 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
369
464
|
italic: queryState("italic"),
|
|
370
465
|
underline: queryState("underline"),
|
|
371
466
|
strike: queryState("strikeThrough"),
|
|
467
|
+
sup: !!anchorEl?.closest(`sup:not(${FOOTNOTE_SUP})`),
|
|
468
|
+
sub: !!anchorEl?.closest("sub"),
|
|
372
469
|
ul: !inIsland && tb?.tagName === "UL",
|
|
373
470
|
ol: !inIsland && tb?.tagName === "OL",
|
|
374
471
|
block: inIsland ? "island" : tb?.tagName.toLowerCase() ?? "p",
|
|
@@ -382,8 +479,13 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
382
479
|
}, []);
|
|
383
480
|
React.useEffect(() => {
|
|
384
481
|
const on = () => refresh();
|
|
482
|
+
const away = () => typingElsewhere(ref.current) && setBubble(null);
|
|
385
483
|
document.addEventListener("selectionchange", on);
|
|
386
|
-
|
|
484
|
+
document.addEventListener("focusin", away);
|
|
485
|
+
return () => {
|
|
486
|
+
document.removeEventListener("selectionchange", on);
|
|
487
|
+
document.removeEventListener("focusin", away);
|
|
488
|
+
};
|
|
387
489
|
}, [refresh]);
|
|
388
490
|
const run = (fn) => {
|
|
389
491
|
restoreSel();
|
|
@@ -465,8 +567,9 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
465
567
|
if (it.kind === "component" && it.component) {
|
|
466
568
|
const c = it.component;
|
|
467
569
|
noteRecent(it);
|
|
570
|
+
const made = { el: null };
|
|
468
571
|
oneStep(`Insert ${c.name}`, () => {
|
|
469
|
-
const isl = insertIsland(el, "component", {
|
|
572
|
+
const isl = made.el = insertIsland(el, "component", {
|
|
470
573
|
...defaultModel("component"),
|
|
471
574
|
ref: c.id,
|
|
472
575
|
name: c.name
|
|
@@ -475,11 +578,20 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
475
578
|
return isl;
|
|
476
579
|
});
|
|
477
580
|
refresh();
|
|
581
|
+
if (made.el && services.useComponentInfo) openComponentPanel(made.el);
|
|
582
|
+
services.toast?.(`${c.name} added`, { description: COMPONENT_INSERT_TOAST });
|
|
478
583
|
return;
|
|
479
584
|
}
|
|
480
585
|
if (!it.id || !blockAllowed(it.id, allows)) return;
|
|
481
586
|
noteRecent(it);
|
|
482
|
-
|
|
587
|
+
if (it.id === "task") insertChecklist(el);
|
|
588
|
+
else if (it.id === "button") {
|
|
589
|
+
const a = insertButton(el);
|
|
590
|
+
emit();
|
|
591
|
+
refresh();
|
|
592
|
+
openButton(a);
|
|
593
|
+
return;
|
|
594
|
+
} else insertBasic(el, it.id);
|
|
483
595
|
emit();
|
|
484
596
|
refresh();
|
|
485
597
|
};
|
|
@@ -555,7 +667,12 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
555
667
|
}
|
|
556
668
|
}
|
|
557
669
|
const mod = e.metaKey || e.ctrlKey;
|
|
558
|
-
const k = e
|
|
670
|
+
const k = eventKey(e);
|
|
671
|
+
if (!mod && !e.altKey && !readOnly && ref.current && toggleTaskFromKey(ref.current, e.key)) {
|
|
672
|
+
e.preventDefault();
|
|
673
|
+
emit();
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
559
676
|
if (mod && !e.altKey && k === "k") {
|
|
560
677
|
e.preventDefault();
|
|
561
678
|
saveSel();
|
|
@@ -621,7 +738,8 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
621
738
|
rest.setStart(s.anchorNode, s.anchorOffset);
|
|
622
739
|
if (!rest.toString().trim()) {
|
|
623
740
|
e.preventDefault();
|
|
624
|
-
|
|
741
|
+
const p = ensureLineAfter(b);
|
|
742
|
+
placeCaret(p, false);
|
|
625
743
|
emit();
|
|
626
744
|
}
|
|
627
745
|
}
|
|
@@ -641,7 +759,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
641
759
|
if (!ref.current?.contains(t) || t.tagName === "INPUT" || t.tagName === "TEXTAREA") return;
|
|
642
760
|
if (undoKey(e)) return;
|
|
643
761
|
if (single) return;
|
|
644
|
-
if (mod && !e.shiftKey && !e.altKey && e
|
|
762
|
+
if (mod && !e.shiftKey && !e.altKey && eventKey(e) === "d") {
|
|
645
763
|
e.preventDefault();
|
|
646
764
|
const b = currentBlock();
|
|
647
765
|
if (b) duplicateBlock$1(b);
|
|
@@ -660,6 +778,11 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
660
778
|
hist.current.textAt = Date.now();
|
|
661
779
|
hist.current.future = [];
|
|
662
780
|
}
|
|
781
|
+
if (!single && ne.inputType === "insertText" && allows("checklist") && checklistShortcut(ref.current, ne.data)) {
|
|
782
|
+
setSlash(null);
|
|
783
|
+
emit();
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
663
786
|
if (!single && ne.inputType === "insertText" && (ne.data === " " || ne.data === "-") && liveMarkdown(ref.current, ne.data, allows)) {
|
|
664
787
|
setSlash(null);
|
|
665
788
|
emit();
|
|
@@ -699,6 +822,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
699
822
|
restoreSel();
|
|
700
823
|
const s = window.getSelection();
|
|
701
824
|
const anchor = (s?.anchorNode?.nodeType === 1 ? s.anchorNode : s?.anchorNode?.parentElement)?.closest("a") ?? null;
|
|
825
|
+
if (anchor && ref.current && buttonAt(ref.current, anchor)) return openButton(anchor);
|
|
702
826
|
if (!anchor && (!s || s.isCollapsed || !s.toString().trim())) {
|
|
703
827
|
notify("Select some text first", { description: hints ? "Then press ⌘K to link it." : "Then link it." });
|
|
704
828
|
return;
|
|
@@ -714,6 +838,28 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
714
838
|
} : { href: "" }
|
|
715
839
|
});
|
|
716
840
|
};
|
|
841
|
+
/** V2 rich-text-editor.tsx:865-873: a button's popover, its label above the link form */
|
|
842
|
+
const openButton = (a) => {
|
|
843
|
+
if (readOnly) return;
|
|
844
|
+
const { link: initial, label } = buttonInitial(a);
|
|
845
|
+
setBubble(null);
|
|
846
|
+
setLink({
|
|
847
|
+
rect: a.getBoundingClientRect(),
|
|
848
|
+
existing: a,
|
|
849
|
+
initial,
|
|
850
|
+
button: {
|
|
851
|
+
a,
|
|
852
|
+
label
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
};
|
|
856
|
+
const saveButton = (v, label) => {
|
|
857
|
+
const b = link?.button;
|
|
858
|
+
setLink(null);
|
|
859
|
+
if (!b) return;
|
|
860
|
+
applyButton(b.a, v, label);
|
|
861
|
+
emit();
|
|
862
|
+
};
|
|
717
863
|
const saveLink = (v) => {
|
|
718
864
|
const l = link;
|
|
719
865
|
setLink(null);
|
|
@@ -811,7 +957,8 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
811
957
|
};
|
|
812
958
|
const toggleMarkdown = () => {
|
|
813
959
|
if (!md) {
|
|
814
|
-
const
|
|
960
|
+
const html = ref.current ? serialize(ref.current) : value;
|
|
961
|
+
const text = htmlToMarkdown(html);
|
|
815
962
|
setMd({
|
|
816
963
|
text,
|
|
817
964
|
original: text
|
|
@@ -950,7 +1097,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
950
1097
|
h.future = [];
|
|
951
1098
|
};
|
|
952
1099
|
const undoKey = (e) => {
|
|
953
|
-
if (!(e.metaKey || e.ctrlKey) || e.altKey || e
|
|
1100
|
+
if (!(e.metaKey || e.ctrlKey) || e.altKey || eventKey(e) !== "z") return false;
|
|
954
1101
|
if (e.shiftKey) {
|
|
955
1102
|
if (!islandRedo()) return false;
|
|
956
1103
|
e.preventDefault();
|
|
@@ -980,7 +1127,9 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
980
1127
|
duplicateBlock: duplicateBlock$1,
|
|
981
1128
|
moveBlock: moveBlock$1,
|
|
982
1129
|
islandUndo,
|
|
983
|
-
islandRedo
|
|
1130
|
+
islandRedo,
|
|
1131
|
+
startDrag,
|
|
1132
|
+
allows
|
|
984
1133
|
});
|
|
985
1134
|
api.current = {
|
|
986
1135
|
emit,
|
|
@@ -992,7 +1141,9 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
992
1141
|
duplicateBlock: duplicateBlock$1,
|
|
993
1142
|
moveBlock: moveBlock$1,
|
|
994
1143
|
islandUndo,
|
|
995
|
-
islandRedo
|
|
1144
|
+
islandRedo,
|
|
1145
|
+
startDrag,
|
|
1146
|
+
allows
|
|
996
1147
|
};
|
|
997
1148
|
const islandCtx = React.useMemo(() => ({
|
|
998
1149
|
readOnly,
|
|
@@ -1006,14 +1157,18 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1006
1157
|
duplicate: (x) => api.current.duplicateBlock(x),
|
|
1007
1158
|
move: (x, dir) => api.current.moveBlock(x, dir),
|
|
1008
1159
|
undo: () => api.current.islandUndo(),
|
|
1009
|
-
redo: () => api.current.islandRedo()
|
|
1160
|
+
redo: () => api.current.islandRedo(),
|
|
1161
|
+
drag: (x, e) => api.current.startDrag(x, e),
|
|
1162
|
+
allows: (f) => api.current.allows(f)
|
|
1010
1163
|
}), [readOnly, dense]);
|
|
1011
1164
|
const commentSel = onComment ? () => {
|
|
1012
1165
|
restoreSel();
|
|
1013
1166
|
const q = window.getSelection()?.toString().trim();
|
|
1167
|
+
setBubble(null);
|
|
1168
|
+
setQuiet(true);
|
|
1014
1169
|
if (q) onComment(q);
|
|
1015
1170
|
} : void 0;
|
|
1016
|
-
const onMark = (cmd) => allows(MARK_FEATURE[cmd]) && run(() => exec(cmd));
|
|
1171
|
+
const onMark = (cmd) => allows(MARK_FEATURE[cmd]) && run(() => cmd === "superscript" || cmd === "subscript" ? ref.current && toggleScript(ref.current, cmd === "superscript" ? "sup" : "sub") : exec(cmd));
|
|
1017
1172
|
const onStyle = (tag) => {
|
|
1018
1173
|
restoreSel();
|
|
1019
1174
|
turnInto$1(currentBlock(), tag);
|
|
@@ -1025,7 +1180,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1025
1180
|
};
|
|
1026
1181
|
const gBlock = gutter?.el;
|
|
1027
1182
|
const gIsText = !!gBlock && !gBlock.hasAttribute("data-rt-island") && gBlock.tagName !== "HR";
|
|
1028
|
-
const btn = dense ? "size-5 [&_svg]:size-3.5" : "size-[22px] [&_svg]:size-3.5";
|
|
1183
|
+
const btn = dense ? "size-5 [&_svg:not([data-rt-isolate]_*)]:size-3.5" : "size-[22px] [&_svg:not([data-rt-isolate]_*)]:size-3.5";
|
|
1029
1184
|
const gutterMode = readOnly || dense || single ? "none" : gutterRoom ? "outside" : "inset";
|
|
1030
1185
|
const showGutter = gutterMode !== "none";
|
|
1031
1186
|
const minH = expanded ? "min-h-[60vh]" : single ? "min-h-9" : dense ? "min-h-[120px]" : "min-h-[190px]";
|
|
@@ -1041,7 +1196,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1041
1196
|
children: /* @__PURE__ */ jsxs("div", {
|
|
1042
1197
|
ref: wrap,
|
|
1043
1198
|
"data-rt-editor": "",
|
|
1044
|
-
className: cn("relative
|
|
1199
|
+
className: cn("relative [--rt-toolbar-h:2rem] pointer-coarse:[--rt-toolbar-h:2.75rem]", "rounded-kit-lg border transition-colors duration-150", expanded ? "bg-[var(--kit-surface-raised)]" : "bg-kit-surface", invalid ? "border-[var(--kit-field-invalid)]" : toolbarOpen ? "border-kit-line-strong" : "border-kit-line"),
|
|
1045
1200
|
style: { "--rt-sticky-top": toolbarOpen && !dense ? `calc(${stickyTop}px + var(--rt-toolbar-h))` : "var(--kit-sticky-top, 0px)" },
|
|
1046
1201
|
onMouseLeave: () => !blockMenu && !gutterInsert && !drag && setGutter(null),
|
|
1047
1202
|
onKeyDown: onWrapKeyDown,
|
|
@@ -1143,7 +1298,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1143
1298
|
children: mdConfirm ? /* @__PURE__ */ jsxs(motion.div, {
|
|
1144
1299
|
initial: {
|
|
1145
1300
|
opacity: 0,
|
|
1146
|
-
y: 4
|
|
1301
|
+
y: reduceMotion ? 0 : 4
|
|
1147
1302
|
},
|
|
1148
1303
|
animate: {
|
|
1149
1304
|
opacity: 1,
|
|
@@ -1151,7 +1306,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1151
1306
|
},
|
|
1152
1307
|
exit: {
|
|
1153
1308
|
opacity: 0,
|
|
1154
|
-
y: 4
|
|
1309
|
+
y: reduceMotion ? 0 : 4
|
|
1155
1310
|
},
|
|
1156
1311
|
transition: { duration: .15 },
|
|
1157
1312
|
role: "alertdialog",
|
|
@@ -1187,7 +1342,8 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1187
1342
|
if (drag || blockMenu || gutterInsert || !showGutter) return;
|
|
1188
1343
|
const t = e.target;
|
|
1189
1344
|
if (t.closest("[data-rt-gutter]")) return;
|
|
1190
|
-
|
|
1345
|
+
const b = topBlock(ref.current, t);
|
|
1346
|
+
placeGutter(b?.getAttribute("data-rt-island") === "component" ? null : b);
|
|
1191
1347
|
},
|
|
1192
1348
|
children: [
|
|
1193
1349
|
/* @__PURE__ */ jsx("div", {
|
|
@@ -1196,7 +1352,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1196
1352
|
role: "textbox",
|
|
1197
1353
|
"aria-multiline": !single,
|
|
1198
1354
|
"aria-labelledby": !inModal && id ? `${id}-label` : void 0,
|
|
1199
|
-
"aria-label":
|
|
1355
|
+
"aria-label": "Rich text",
|
|
1200
1356
|
"aria-placeholder": ph,
|
|
1201
1357
|
"aria-readonly": readOnly || void 0,
|
|
1202
1358
|
"aria-invalid": invalid || void 0,
|
|
@@ -1208,6 +1364,17 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1208
1364
|
onKeyDown,
|
|
1209
1365
|
onKeyUp: refresh,
|
|
1210
1366
|
onMouseUp: refresh,
|
|
1367
|
+
onMouseDown: (e) => {
|
|
1368
|
+
if (readOnly || !ref.current || !toggleTaskAtPointer(ref.current, e.target, e.clientX)) return;
|
|
1369
|
+
e.preventDefault();
|
|
1370
|
+
emit();
|
|
1371
|
+
},
|
|
1372
|
+
onClick: (e) => {
|
|
1373
|
+
const a = ref.current ? buttonAt(ref.current, e.target) : null;
|
|
1374
|
+
if (!a || readOnly) return;
|
|
1375
|
+
e.preventDefault();
|
|
1376
|
+
openButton(a);
|
|
1377
|
+
},
|
|
1211
1378
|
onPaste: (e) => {
|
|
1212
1379
|
if (readOnly) return;
|
|
1213
1380
|
if (Array.from(e.clipboardData.files).filter((f) => f.type.startsWith("image/")).length) {
|
|
@@ -1255,11 +1422,11 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1255
1422
|
notify("That drop is not an image from the media library");
|
|
1256
1423
|
}
|
|
1257
1424
|
},
|
|
1258
|
-
className: cn(RT_PROSE, dense &&
|
|
1425
|
+
className: cn(RT_PROSE, dense && "text-kit-sm leading-[1.6] [&_h1:not([data-rt-isolate]_*)]:text-kit-xl [&_h1:not([data-rt-isolate]_*)]:leading-7 [&_h2:not([data-rt-isolate]_*)]:text-kit-lg [&_h2:not([data-rt-isolate]_*)]:leading-7 [&_h3:not([data-rt-isolate]_*)]:text-kit-md [&_h4:not([data-rt-isolate]_*)]:text-kit-base [&_h5:not([data-rt-isolate]_*)]:text-kit-sm [&_h6:not([data-rt-isolate]_*)]:text-kit-xs", "peer relative outline-none focus-visible:shadow-none [&_*:not([data-rt-isolate]_*)]:outline-none", "[&>p[data-hint]]:before:pointer-events-none [&>p[data-hint]]:before:float-left [&>p[data-hint]]:before:h-0 [&>p[data-hint]]:before:text-kit-fg-4 [&>p[data-hint]]:before:content-[attr(data-hint)]", "[&_a[data-button]:not([data-rt-isolate]_*)]:cursor-pointer [&_ul[data-task]>li:not([data-rt-isolate]_*)]:before:cursor-pointer", "[&_sup[data-rt=fn]]:mx-px [&_sup[data-rt=fn]]:cursor-pointer [&_sup[data-rt=fn]]:rounded-kit-sm [&_sup[data-rt=fn]]:px-0.5 [&_sup[data-rt=fn]]:text-[0.72em] [&_sup[data-rt=fn]]:font-semibold [&_sup[data-rt=fn]]:text-kit-accent-fg [&_sup[data-rt=fn]:hover]:bg-kit-accent-soft", dense ? "px-2.5 py-2" : "px-4 py-3.5", minH)
|
|
1259
1426
|
}),
|
|
1260
1427
|
empty ? /* @__PURE__ */ jsx("div", {
|
|
1261
1428
|
"aria-hidden": true,
|
|
1262
|
-
className: cn("pointer-events-none absolute text-kit-fg-4 peer-focus:hidden", dense ? "left-2.5 top-2
|
|
1429
|
+
className: cn("pointer-events-none absolute text-kit-fg-4 peer-focus:hidden", dense ? "text-kit-sm" : "text-kit-base", dense ? "left-2.5 top-2" : "left-4 top-3.5"),
|
|
1263
1430
|
children: ph
|
|
1264
1431
|
}) : null,
|
|
1265
1432
|
gutter && showGutter ? /* @__PURE__ */ jsxs("div", {
|
|
@@ -1320,7 +1487,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1320
1487
|
setBlockMenu(true);
|
|
1321
1488
|
}
|
|
1322
1489
|
},
|
|
1323
|
-
className: cn("flex cursor-grab items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg active:cursor-grabbing", gutterMode === "inset" ? "h-[22px] w-4 rounded-kit-sm [&_svg]:size-3.5" : btn, (blockMenu || drag) && "bg-kit-hover text-kit-fg"),
|
|
1490
|
+
className: cn("flex cursor-grab items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg active:cursor-grabbing", gutterMode === "inset" ? "h-[22px] w-4 rounded-kit-sm [&_svg:not([data-rt-isolate]_*)]:size-3.5" : btn, (blockMenu || drag) && "bg-kit-hover text-kit-fg"),
|
|
1324
1491
|
children: /* @__PURE__ */ jsx(IconGripVertical, {
|
|
1325
1492
|
stroke: 1.5,
|
|
1326
1493
|
"aria-hidden": true
|
|
@@ -1385,7 +1552,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1385
1552
|
]
|
|
1386
1553
|
}),
|
|
1387
1554
|
/* @__PURE__ */ jsxs("div", {
|
|
1388
|
-
className: "flex
|
|
1555
|
+
className: "flex h-7 items-center justify-end gap-3 rounded-b-kit-lg border-t border-kit-line-subtle px-3 text-kit-2xs text-kit-fg-3",
|
|
1389
1556
|
children: [notice ? /* @__PURE__ */ jsxs("span", {
|
|
1390
1557
|
role: "status",
|
|
1391
1558
|
"aria-live": "polite",
|
|
@@ -1404,7 +1571,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1404
1571
|
}) : null
|
|
1405
1572
|
]
|
|
1406
1573
|
}) : null, /* @__PURE__ */ jsxs("span", {
|
|
1407
|
-
className: "
|
|
1574
|
+
className: "tabular-nums",
|
|
1408
1575
|
children: [
|
|
1409
1576
|
words.toLocaleString("en-US"),
|
|
1410
1577
|
" ",
|
|
@@ -1416,7 +1583,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1416
1583
|
]
|
|
1417
1584
|
})]
|
|
1418
1585
|
}),
|
|
1419
|
-
bubble && !readOnly && !slash && !link && !md && !menus.style && !menus.more && !insertOpen ? /* @__PURE__ */ jsx(SelectionBubble, {
|
|
1586
|
+
bubble && !quiet && !readOnly && !slash && !link && !md && !menus.style && !menus.more && !insertOpen ? /* @__PURE__ */ jsx(SelectionBubble, {
|
|
1420
1587
|
rect: bubble,
|
|
1421
1588
|
avoid: toolbarOpen ? wrap.current?.querySelector("[role=\"toolbar\"][aria-label=\"Text formatting\"]")?.getBoundingClientRect() : null,
|
|
1422
1589
|
fmt,
|
|
@@ -1434,7 +1601,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1434
1601
|
}) : null,
|
|
1435
1602
|
slash && !md ? createPortal(/* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
1436
1603
|
"data-floating-layer": "",
|
|
1437
|
-
className: "pointer-events-auto fixed inset-0 z-[84]",
|
|
1604
|
+
className: "pointer-events-auto fixed inset-0 z-[var(--kit-z-popover,84)]",
|
|
1438
1605
|
onMouseDown: () => setSlash(null)
|
|
1439
1606
|
}), /* @__PURE__ */ jsx(motion.div, {
|
|
1440
1607
|
initial: {
|
|
@@ -1451,7 +1618,7 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1451
1618
|
...flipUp ? { bottom: window.innerHeight - slash.rect.top + 6 } : { top: slash.rect.bottom + 6 }
|
|
1452
1619
|
},
|
|
1453
1620
|
"data-floating-layer": "",
|
|
1454
|
-
className: "pointer-events-auto fixed z-[
|
|
1621
|
+
className: "pointer-events-auto fixed z-[calc(var(--kit-z-popover,84)_+_1)]",
|
|
1455
1622
|
children: /* @__PURE__ */ jsx(SlashMenuPanel, {
|
|
1456
1623
|
query: slash.query,
|
|
1457
1624
|
folder: slash.folder,
|
|
@@ -1482,17 +1649,32 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1482
1649
|
}) }), /* @__PURE__ */ jsx(PopoverContent, {
|
|
1483
1650
|
className: "w-[340px] rounded-kit-lg p-3",
|
|
1484
1651
|
finalFocus: false,
|
|
1485
|
-
children: link ? /* @__PURE__ */ jsx(
|
|
1652
|
+
children: link?.button ? /* @__PURE__ */ jsx(ButtonLinkPanel, {
|
|
1486
1653
|
initial: link.initial,
|
|
1654
|
+
label: link.button.label,
|
|
1487
1655
|
allowNewTab,
|
|
1488
|
-
onSave:
|
|
1656
|
+
onSave: saveButton,
|
|
1489
1657
|
onCancel: () => setLink(null),
|
|
1490
|
-
onDetach:
|
|
1491
|
-
const a = link.
|
|
1492
|
-
a.replaceWith(...Array.from(a.childNodes));
|
|
1658
|
+
onDetach: () => {
|
|
1659
|
+
const a = link.button.a;
|
|
1493
1660
|
setLink(null);
|
|
1661
|
+
if (ref.current) removeButton(ref.current, a);
|
|
1494
1662
|
emit();
|
|
1495
|
-
}
|
|
1663
|
+
}
|
|
1664
|
+
}) : link ? /* @__PURE__ */ jsx("div", {
|
|
1665
|
+
className: "flex flex-col gap-2",
|
|
1666
|
+
children: /* @__PURE__ */ jsx(LinkForm, {
|
|
1667
|
+
initial: link.initial,
|
|
1668
|
+
allowNewTab,
|
|
1669
|
+
onSave: saveLink,
|
|
1670
|
+
onCancel: () => setLink(null),
|
|
1671
|
+
onDetach: link.existing ? () => {
|
|
1672
|
+
const a = link.existing;
|
|
1673
|
+
a.replaceWith(...Array.from(a.childNodes));
|
|
1674
|
+
setLink(null);
|
|
1675
|
+
emit();
|
|
1676
|
+
} : void 0
|
|
1677
|
+
})
|
|
1496
1678
|
}) : null
|
|
1497
1679
|
})]
|
|
1498
1680
|
}),
|
|
@@ -1525,6 +1707,6 @@ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, featur
|
|
|
1525
1707
|
});
|
|
1526
1708
|
}
|
|
1527
1709
|
//#endregion
|
|
1528
|
-
export { RichTextEditor };
|
|
1710
|
+
export { RT_PANEL, RT_PROSE, RichTextEditor, bodyCountLabel, countComponents, countWords, slashPlacement };
|
|
1529
1711
|
|
|
1530
1712
|
//# sourceMappingURL=editor.js.map
|