@bettercms-ai/kit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/{adapters → dist/adapters}/icons.js +2 -2
- package/dist/adapters/icons.js.map +1 -0
- package/{adapters → dist/adapters}/lossy.d.ts +90 -31
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
- package/{adapters → dist/adapters}/prod-types.js +71 -3
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +996 -179
- package/dist/adapters/schema.js.map +1 -0
- package/{adapters → dist/adapters}/values.d.ts +26 -5
- package/{adapters → dist/adapters}/values.js +87 -17
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/{context.d.ts → dist/context.d.ts} +92 -2
- package/{context.js → dist/context.js} +5 -2
- package/dist/context.js.map +1 -0
- package/{controls → dist/controls}/button.d.ts +19 -5
- package/{controls → dist/controls}/button.js +125 -54
- package/dist/controls/button.js.map +1 -0
- package/{controls → dist/controls}/c1.js +1 -1
- package/dist/controls/c1.js.map +1 -0
- package/{controls → dist/controls}/c2.js +1 -1
- package/dist/controls/c2.js.map +1 -0
- package/{controls → dist/controls}/choice.d.ts +7 -2
- package/{controls → dist/controls}/choice.js +71 -18
- package/dist/controls/choice.js.map +1 -0
- package/{controls → dist/controls}/code-register.js +1 -1
- package/dist/controls/code-register.js.map +1 -0
- package/{controls → dist/controls}/code.js +10 -9
- package/dist/controls/code.js.map +1 -0
- package/{controls → dist/controls}/color.js +8 -8
- package/dist/controls/color.js.map +1 -0
- package/{controls → dist/controls}/component-services.d.ts +42 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/{controls → dist/controls}/date-register.js +1 -1
- package/dist/controls/date-register.js.map +1 -0
- package/{controls → dist/controls}/date-zone.js +8 -2
- package/dist/controls/date-zone.js.map +1 -0
- package/{controls → dist/controls}/date.js +32 -24
- package/dist/controls/date.js.map +1 -0
- package/{controls → dist/controls}/form-picker-register.js +1 -1
- package/dist/controls/form-picker-register.js.map +1 -0
- package/{controls → dist/controls}/form-picker.js +11 -9
- package/dist/controls/form-picker.js.map +1 -0
- package/{controls → dist/controls}/icon-register.js +1 -1
- package/dist/controls/icon-register.js.map +1 -0
- package/{controls → dist/controls}/icon.d.ts +4 -2
- package/{controls → dist/controls}/icon.js +32 -27
- package/dist/controls/icon.js.map +1 -0
- package/{controls → dist/controls}/index.d.ts +1 -1
- package/{controls → dist/controls}/index.js +4 -3
- package/dist/controls/index.js.map +1 -0
- package/{controls → dist/controls}/json-register.js +1 -1
- package/dist/controls/json-register.js.map +1 -0
- package/{controls → dist/controls}/json.js +13 -3
- package/dist/controls/json.js.map +1 -0
- package/{controls → dist/controls}/link.js +6 -6
- package/dist/controls/link.js.map +1 -0
- package/{controls → dist/controls}/location-register.js +1 -1
- package/dist/controls/location-register.js.map +1 -0
- package/{controls → dist/controls}/location.js +64 -40
- package/dist/controls/location.js.map +1 -0
- package/{controls → dist/controls}/media-register.js +1 -1
- package/dist/controls/media-register.js.map +1 -0
- package/{controls → dist/controls}/media-services.d.ts +6 -0
- package/dist/controls/media-services.js +0 -0
- package/{controls → dist/controls}/media.d.ts +35 -4
- package/{controls → dist/controls}/media.js +491 -171
- package/dist/controls/media.js.map +1 -0
- package/{controls → dist/controls}/number.js +10 -9
- package/dist/controls/number.js.map +1 -0
- package/{controls → dist/controls}/reference-register.js +1 -1
- package/dist/controls/reference-register.js.map +1 -0
- package/{controls → dist/controls}/reference-services.d.ts +4 -0
- package/dist/controls/reference-services.js +0 -0
- package/{controls → dist/controls}/reference.d.ts +1 -1
- package/{controls → dist/controls}/reference.js +93 -77
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/{controls → dist/controls}/rich-text/blocks.js +471 -144
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
- package/{controls → dist/controls}/rich-text/catalog.js +75 -65
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +3 -1
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
- package/{controls → dist/controls}/rich-text/component-card.js +417 -99
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
- package/{controls → dist/controls}/rich-text/control.js +84 -42
- package/dist/controls/rich-text/control.js.map +1 -0
- package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
- package/{controls → dist/controls}/rich-text/dom.js +379 -50
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
- package/{controls → dist/controls}/rich-text/editor.js +148 -48
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
- package/{controls → dist/controls}/rich-text/floating.js +35 -18
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/{controls → dist/controls}/rich-text/index.js +1 -1
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/{controls → dist/controls}/rich-text/markdown.js +4 -2
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/{controls → dist/controls}/rich-text/ops.js +17 -15
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
- package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/{controls → dist/controls}/scale.js +5 -5
- package/dist/controls/scale.js.map +1 -0
- package/{controls → dist/controls}/slot-register.js +1 -1
- package/dist/controls/slot-register.js.map +1 -0
- package/{controls → dist/controls}/slot-services.d.ts +25 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/{controls → dist/controls}/slot.js +42 -24
- package/dist/controls/slot.js.map +1 -0
- package/{controls → dist/controls}/table/index.js +1 -1
- package/dist/controls/table/index.js.map +1 -0
- package/{controls → dist/controls}/table/prod.js +3 -3
- package/dist/controls/table/prod.js.map +1 -0
- package/{controls → dist/controls}/table/refs.js +13 -2
- package/dist/controls/table/refs.js.map +1 -0
- package/{controls → dist/controls}/table/stored.js +1 -1
- package/dist/controls/table/stored.js.map +1 -0
- package/{controls → dist/controls}/table/table-editor.js +51 -48
- package/dist/controls/table/table-editor.js.map +1 -0
- package/{controls → dist/controls}/table/table-link.js +3 -3
- package/dist/controls/table/table-link.js.map +1 -0
- package/{controls → dist/controls}/table/table.js +3 -3
- package/dist/controls/table/table.js.map +1 -0
- package/{controls → dist/controls}/text.d.ts +2 -2
- package/{controls → dist/controls}/text.js +78 -43
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/{engine → dist/engine}/array.js +34 -21
- package/dist/engine/array.js.map +1 -0
- package/{engine → dist/engine}/bits.js +1 -1
- package/dist/engine/bits.js.map +1 -0
- package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
- package/{engine → dist/engine}/breadcrumb.js +12 -36
- package/dist/engine/breadcrumb.js.map +1 -0
- package/{engine → dist/engine}/expand.d.ts +2 -4
- package/{engine → dist/engine}/expand.js +5 -22
- package/dist/engine/expand.js.map +1 -0
- package/{engine → dist/engine}/field-list.js +1 -1
- package/dist/engine/field-list.js.map +1 -0
- package/{engine → dist/engine}/field-shell.js +249 -121
- package/dist/engine/field-shell.js.map +1 -0
- package/{engine → dist/engine}/frame.d.ts +3 -1
- package/{engine → dist/engine}/frame.js +16 -14
- package/dist/engine/frame.js.map +1 -0
- package/{engine → dist/engine}/group-summary.d.ts +2 -1
- package/{engine → dist/engine}/group-summary.js +7 -3
- package/dist/engine/group-summary.js.map +1 -0
- package/{engine → dist/engine}/grouping.d.ts +19 -5
- package/{engine → dist/engine}/grouping.js +193 -21
- package/dist/engine/grouping.js.map +1 -0
- package/{engine → dist/engine}/item-list.d.ts +11 -1
- package/{engine → dist/engine}/item-list.js +35 -13
- package/dist/engine/item-list.js.map +1 -0
- package/{engine → dist/engine}/kit-field.js +45 -10
- package/dist/engine/kit-field.js.map +1 -0
- package/{engine → dist/engine}/schema-form.d.ts +27 -2
- package/{engine → dist/engine}/schema-form.js +182 -40
- package/dist/engine/schema-form.js.map +1 -0
- package/{engine → dist/engine}/slot.js +5 -15
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/{kit.css → dist/kit.css} +19 -0
- package/{lib → dist/lib}/cn.js +7 -4
- package/dist/lib/cn.js.map +1 -0
- package/{lib → dist/lib}/columns.js +4 -1
- package/dist/lib/columns.js.map +1 -0
- package/{lib → dist/lib}/frames.js +2 -2
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/{lib → dist/lib}/icons.js +4 -3
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/{lib → dist/lib}/path.js +4 -2
- package/dist/lib/path.js.map +1 -0
- package/{lib → dist/lib}/schema.d.ts +34 -3
- package/{lib → dist/lib}/schema.js +110 -13
- package/dist/lib/schema.js.map +1 -0
- package/{lib → dist/lib}/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -0
- package/{lib → dist/lib}/validate.d.ts +11 -1
- package/{lib → dist/lib}/validate.js +85 -11
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/{schema → dist/schema}/adapters.js +1 -2
- package/dist/schema/adapters.js.map +1 -0
- package/{schema → dist/schema}/help.d.ts +2 -0
- package/{schema → dist/schema}/help.js +6 -4
- package/dist/schema/help.js.map +1 -0
- package/{schema → dist/schema}/scale.js +1 -1
- package/dist/schema/scale.js.map +1 -0
- package/{schema → dist/schema}/sources.js +1 -1
- package/dist/schema/sources.js.map +1 -0
- package/{schema → dist/schema}/table.js +11 -10
- package/dist/schema/table.js.map +1 -0
- package/{schema → dist/schema}/types.d.ts +29 -1
- package/{schema → dist/schema}/types.js +1 -1
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +22 -0
- package/dist/theme.js +43 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.js +0 -0
- package/{ui → dist/ui}/action-tray.d.ts +1 -1
- package/{ui → dist/ui}/action-tray.js +20 -19
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +6 -7
- package/dist/ui/button.js.map +1 -0
- package/{ui → dist/ui}/choice-switch.js +1 -1
- package/dist/ui/choice-switch.js.map +1 -0
- package/{ui → dist/ui}/controls.js +51 -39
- package/dist/ui/controls.js.map +1 -0
- package/{ui → dist/ui}/display.d.ts +10 -3
- package/{ui → dist/ui}/display.js +57 -46
- package/dist/ui/display.js.map +1 -0
- package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
- package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/{ui → dist/ui}/field-context.js +1 -1
- package/dist/ui/field-context.js.map +1 -0
- package/{ui → dist/ui}/floating-panel.d.ts +1 -1
- package/{ui → dist/ui}/floating-panel.js +28 -12
- package/dist/ui/floating-panel.js.map +1 -0
- package/{ui → dist/ui}/index.d.ts +4 -0
- package/dist/ui/index.js +18 -0
- package/{ui → dist/ui}/input.d.ts +1 -1
- package/{ui → dist/ui}/input.js +9 -9
- package/dist/ui/input.js.map +1 -0
- package/{ui → dist/ui}/mode-bar.js +3 -3
- package/dist/ui/mode-bar.js.map +1 -0
- package/{ui → dist/ui}/overlay.d.ts +77 -5
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/{ui → dist/ui}/path-crumbs.js +37 -3
- package/dist/ui/path-crumbs.js.map +1 -0
- package/{ui → dist/ui}/presence.js +2 -2
- package/dist/ui/presence.js.map +1 -0
- package/{ui → dist/ui}/select.js +89 -87
- package/dist/ui/select.js.map +1 -0
- package/{ui → dist/ui}/shortcut-hint.js +1 -1
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/{ui → dist/ui}/surfaces.js +1 -1
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
- package/{ui → dist/ui}/tooltip-root.js +9 -8
- package/dist/ui/tooltip-root.js.map +1 -0
- package/{ui → dist/ui}/variants.js +1 -1
- package/dist/ui/variants.js.map +1 -0
- package/package.json +77 -23
- package/adapters/icons.js.map +0 -1
- package/adapters/lossy.js +0 -233
- package/adapters/lossy.js.map +0 -1
- package/adapters/prod-types.js.map +0 -1
- package/adapters/schema.js.map +0 -1
- package/adapters/values.js.map +0 -1
- package/brand/logo.js +0 -9
- package/brand/logo.js.map +0 -1
- package/context.js.map +0 -1
- package/controls/button.js.map +0 -1
- package/controls/c1.js.map +0 -1
- package/controls/c2.js.map +0 -1
- package/controls/choice.js.map +0 -1
- package/controls/code-register.js.map +0 -1
- package/controls/code.js.map +0 -1
- package/controls/color.js.map +0 -1
- package/controls/date-register.js.map +0 -1
- package/controls/date-zone.js.map +0 -1
- package/controls/date.js.map +0 -1
- package/controls/form-picker-register.js.map +0 -1
- package/controls/form-picker.js.map +0 -1
- package/controls/icon-register.js.map +0 -1
- package/controls/icon.js.map +0 -1
- package/controls/index.js.map +0 -1
- package/controls/json-register.js.map +0 -1
- package/controls/json.js.map +0 -1
- package/controls/link.js.map +0 -1
- package/controls/location-register.js.map +0 -1
- package/controls/location.js.map +0 -1
- package/controls/media-register.js.map +0 -1
- package/controls/media.js.map +0 -1
- package/controls/number.js.map +0 -1
- package/controls/reference-register.js.map +0 -1
- package/controls/reference.js.map +0 -1
- package/controls/rich-text/blocks.d.ts +0 -28
- package/controls/rich-text/blocks.js.map +0 -1
- package/controls/rich-text/catalog.js.map +0 -1
- package/controls/rich-text/codec.js.map +0 -1
- package/controls/rich-text/component-card.js.map +0 -1
- package/controls/rich-text/control.js.map +0 -1
- package/controls/rich-text/dom.js.map +0 -1
- package/controls/rich-text/editor.js.map +0 -1
- package/controls/rich-text/floating.js.map +0 -1
- package/controls/rich-text/index.js.map +0 -1
- package/controls/rich-text/link-form.js +0 -111
- package/controls/rich-text/link-form.js.map +0 -1
- package/controls/rich-text/markdown.js.map +0 -1
- package/controls/rich-text/ops.js.map +0 -1
- package/controls/rich-text/toolbar.js.map +0 -1
- package/controls/scale.js.map +0 -1
- package/controls/slot-register.js.map +0 -1
- package/controls/slot-services.js +0 -38
- package/controls/slot-services.js.map +0 -1
- package/controls/slot.js.map +0 -1
- package/controls/table/index.js.map +0 -1
- package/controls/table/prod.js.map +0 -1
- package/controls/table/refs.js.map +0 -1
- package/controls/table/stored.js.map +0 -1
- package/controls/table/table-editor.js.map +0 -1
- package/controls/table/table-link.js.map +0 -1
- package/controls/table/table.js.map +0 -1
- package/controls/text.js.map +0 -1
- package/engine/array.js.map +0 -1
- package/engine/bits.js.map +0 -1
- package/engine/breadcrumb.js.map +0 -1
- package/engine/expand.js.map +0 -1
- package/engine/field-list.js.map +0 -1
- package/engine/field-shell.js.map +0 -1
- package/engine/frame.js.map +0 -1
- package/engine/group-summary.js.map +0 -1
- package/engine/grouping.js.map +0 -1
- package/engine/item-list.js.map +0 -1
- package/engine/kit-field.js.map +0 -1
- package/engine/schema-form.js.map +0 -1
- package/engine/slot.js.map +0 -1
- package/index.js +0 -55
- package/index.js.map +0 -1
- package/lib/cn.js.map +0 -1
- package/lib/columns.js.map +0 -1
- package/lib/frames.js.map +0 -1
- package/lib/icons.js.map +0 -1
- package/lib/path.js.map +0 -1
- package/lib/schema.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/lib/validate.js.map +0 -1
- package/schema/adapters.js.map +0 -1
- package/schema/help.js.map +0 -1
- package/schema/scale.js.map +0 -1
- package/schema/sources.js.map +0 -1
- package/schema/table.js.map +0 -1
- package/schema/types.js.map +0 -1
- package/ui/action-tray.js.map +0 -1
- package/ui/button.js.map +0 -1
- package/ui/choice-switch.js.map +0 -1
- package/ui/controls.js.map +0 -1
- package/ui/display.js.map +0 -1
- package/ui/expanded-editor-modal.js.map +0 -1
- package/ui/field-context.js.map +0 -1
- package/ui/floating-panel.js.map +0 -1
- package/ui/index.js +0 -13
- package/ui/input.js.map +0 -1
- package/ui/mode-bar.js.map +0 -1
- package/ui/overlay.js +0 -378
- package/ui/overlay.js.map +0 -1
- package/ui/path-crumbs.js.map +0 -1
- package/ui/presence.js.map +0 -1
- package/ui/select.js.map +0 -1
- package/ui/shortcut-hint.js.map +0 -1
- package/ui/surfaces.js.map +0 -1
- package/ui/tooltip-root.js.map +0 -1
- package/ui/variants.js.map +0 -1
- /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
- /package/{adapters → dist/adapters}/icons.d.ts +0 -0
- /package/{brand → dist/brand}/logo.d.ts +0 -0
- /package/{controls → dist/controls}/c1.d.ts +0 -0
- /package/{controls → dist/controls}/c2.d.ts +0 -0
- /package/{controls → dist/controls}/code-register.d.ts +0 -0
- /package/{controls → dist/controls}/code.d.ts +0 -0
- /package/{controls → dist/controls}/color.d.ts +0 -0
- /package/{controls → dist/controls}/date-register.d.ts +0 -0
- /package/{controls → dist/controls}/date-zone.d.ts +0 -0
- /package/{controls → dist/controls}/date.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker.d.ts +0 -0
- /package/{controls → dist/controls}/icon-register.d.ts +0 -0
- /package/{controls → dist/controls}/json-register.d.ts +0 -0
- /package/{controls → dist/controls}/json.d.ts +0 -0
- /package/{controls → dist/controls}/link.d.ts +0 -0
- /package/{controls → dist/controls}/location-register.d.ts +0 -0
- /package/{controls → dist/controls}/location.d.ts +0 -0
- /package/{controls → dist/controls}/media-register.d.ts +0 -0
- /package/{controls → dist/controls}/number.d.ts +0 -0
- /package/{controls → dist/controls}/reference-register.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
- /package/{controls → dist/controls}/scale.d.ts +0 -0
- /package/{controls → dist/controls}/slot-register.d.ts +0 -0
- /package/{controls → dist/controls}/slot.d.ts +0 -0
- /package/{controls → dist/controls}/table/index.d.ts +0 -0
- /package/{controls → dist/controls}/table/prod.d.ts +0 -0
- /package/{controls → dist/controls}/table/refs.d.ts +0 -0
- /package/{controls → dist/controls}/table/stored.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
- /package/{controls → dist/controls}/table/table.d.ts +0 -0
- /package/{engine → dist/engine}/array.d.ts +0 -0
- /package/{engine → dist/engine}/bits.d.ts +0 -0
- /package/{engine → dist/engine}/field-list.d.ts +0 -0
- /package/{engine → dist/engine}/field-shell.d.ts +0 -0
- /package/{engine → dist/engine}/kit-field.d.ts +0 -0
- /package/{engine → dist/engine}/slot.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/cn.d.ts +0 -0
- /package/{lib → dist/lib}/columns.d.ts +0 -0
- /package/{lib → dist/lib}/frames.d.ts +0 -0
- /package/{lib → dist/lib}/icons.d.ts +0 -0
- /package/{lib → dist/lib}/path.d.ts +0 -0
- /package/{lib → dist/lib}/utils.d.ts +0 -0
- /package/{schema → dist/schema}/adapters.d.ts +0 -0
- /package/{schema → dist/schema}/scale.d.ts +0 -0
- /package/{schema → dist/schema}/sources.d.ts +0 -0
- /package/{schema → dist/schema}/table.d.ts +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
- /package/{ui → dist/ui}/controls.d.ts +0 -0
- /package/{ui → dist/ui}/field-context.d.ts +0 -0
- /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
- /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
- /package/{ui → dist/ui}/presence.d.ts +0 -0
- /package/{ui → dist/ui}/select.d.ts +0 -0
- /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
- /package/{ui → dist/ui}/surfaces.d.ts +0 -0
- /package/{ui → dist/ui}/variants.d.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { cellText, cellValue, emptyTable, isCellObject, isObjLike, normalizeTable, parseTableElement, tkey } from "../../schema/table.js";
|
|
2
|
-
//#region src/
|
|
1
|
+
import { boolLabels, cellText, cellValue, emptyTable, formatNumber, isCellObject, isObjLike, normalizeTable, parseTableElement, tkey, toBool, toNumber } from "../../schema/table.js";
|
|
2
|
+
//#region src/controls/rich-text/dom.ts
|
|
3
3
|
/**
|
|
4
4
|
* RICH TEXT · DOM layer (V2 HEAD controls/rich-text/dom.ts). The field value is clean, semantic HTML; rich blocks are
|
|
5
5
|
* "islands" while editing.
|
|
@@ -30,6 +30,9 @@ import { cellText, cellValue, emptyTable, isCellObject, isObjLike, normalizeTabl
|
|
|
30
30
|
* <div data-body><p>…` (the message is plain text: paragraphs and line breaks)
|
|
31
31
|
* toggle `bcmsBlock` builtin:toggle {title, body}: `<details data-rt="toggle"><summary>…<div data-body><p>…`
|
|
32
32
|
* video the `video` block {src, title}: `<div data-rt="video" data-url data-title>`
|
|
33
|
+
* embed `bcmsBlock` builtin:video {url, title} (the package's embed: `<iframe src title>` on the page), V2's
|
|
34
|
+
* article Embed: `<figure data-rt="embed" data-url data-title><a href>…`. V2's Shape (`aspect`) has no
|
|
35
|
+
* stored key, so it is not offered: every embed draws 16:9.
|
|
33
36
|
* file the `file` block {src, name, size}: `<div data-rt="file" data-url data-name data-size>`
|
|
34
37
|
* component `bcmsBlock` "component" {componentId, overrides, variant} (CPO D28): `<div data-rt="component" data-ref
|
|
35
38
|
* data-id data-name data-overrides data-variant>` — a linked instance of a project component, shown as a card.
|
|
@@ -37,8 +40,8 @@ import { cellText, cellValue, emptyTable, isCellObject, isObjLike, normalizeTabl
|
|
|
37
40
|
* `data-detached="true" data-props data-blocks data-source-published-at`, and carries no overrides.
|
|
38
41
|
* A key the stored block holds is an attribute or element that is present; a key it lacks is absent, so an untouched
|
|
39
42
|
* block reads back exactly as stored.
|
|
40
|
-
* V2's gallery,
|
|
41
|
-
*
|
|
43
|
+
* V2's gallery, columns, footnotes, contents, related posts and author bio have no stored form in production and are
|
|
44
|
+
* not offered.
|
|
42
45
|
*/
|
|
43
46
|
var esc = (s) => s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
44
47
|
var escAttr = (s) => esc(s).replace(/"/g, """);
|
|
@@ -61,6 +64,78 @@ var CALLOUT_TONES = [
|
|
|
61
64
|
"tip",
|
|
62
65
|
"warning"
|
|
63
66
|
];
|
|
67
|
+
var hostOf = (url) => {
|
|
68
|
+
try {
|
|
69
|
+
return new URL(url).hostname.replace(/^www\./, "");
|
|
70
|
+
} catch {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
function detectEmbed(url) {
|
|
75
|
+
const u = url.trim();
|
|
76
|
+
const host = hostOf(u);
|
|
77
|
+
const is = (re) => re.test(u);
|
|
78
|
+
if (is(/(?:youtube\.com\/(?:watch\?|embed\/|shorts\/|live\/)|youtu\.be\/)/i)) return {
|
|
79
|
+
provider: "youtube",
|
|
80
|
+
label: "YouTube",
|
|
81
|
+
shape: "frame",
|
|
82
|
+
host
|
|
83
|
+
};
|
|
84
|
+
if (is(/vimeo\.com\/(?:video\/)?\d+/i)) return {
|
|
85
|
+
provider: "vimeo",
|
|
86
|
+
label: "Vimeo",
|
|
87
|
+
shape: "frame",
|
|
88
|
+
host
|
|
89
|
+
};
|
|
90
|
+
if (is(/(?:twitter|x)\.com\/[^/]+\/status\/\d+/i)) return {
|
|
91
|
+
provider: "x",
|
|
92
|
+
label: "X post",
|
|
93
|
+
shape: "post",
|
|
94
|
+
host
|
|
95
|
+
};
|
|
96
|
+
if (is(/codepen\.io\/[^/]+\/(?:pen|embed)\//i)) return {
|
|
97
|
+
provider: "codepen",
|
|
98
|
+
label: "CodePen",
|
|
99
|
+
shape: "frame",
|
|
100
|
+
host
|
|
101
|
+
};
|
|
102
|
+
if (is(/figma\.com\/(?:file|design|proto|board)\//i)) return {
|
|
103
|
+
provider: "figma",
|
|
104
|
+
label: "Figma",
|
|
105
|
+
shape: "frame",
|
|
106
|
+
host
|
|
107
|
+
};
|
|
108
|
+
if (is(/(?:google\.[a-z.]+\/maps|maps\.app\.goo\.gl|goo\.gl\/maps)/i)) return {
|
|
109
|
+
provider: "maps",
|
|
110
|
+
label: "Google Maps",
|
|
111
|
+
shape: "frame",
|
|
112
|
+
host
|
|
113
|
+
};
|
|
114
|
+
if (is(/open\.spotify\.com\/(?:episode|track|show|playlist|album)\//i)) return {
|
|
115
|
+
provider: "spotify",
|
|
116
|
+
label: "Spotify",
|
|
117
|
+
shape: "audio",
|
|
118
|
+
host
|
|
119
|
+
};
|
|
120
|
+
if (is(/podcasts\.apple\.com\//i)) return {
|
|
121
|
+
provider: "podcast",
|
|
122
|
+
label: "Apple Podcasts",
|
|
123
|
+
shape: "audio",
|
|
124
|
+
host
|
|
125
|
+
};
|
|
126
|
+
if (is(/\.(?:mp3|m4a|wav|ogg|aac)(?:\?|$)/i)) return {
|
|
127
|
+
provider: "audio",
|
|
128
|
+
label: "Audio",
|
|
129
|
+
shape: "audio",
|
|
130
|
+
host
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
provider: "link",
|
|
134
|
+
label: host || "Link",
|
|
135
|
+
shape: "link",
|
|
136
|
+
host
|
|
137
|
+
};
|
|
138
|
+
}
|
|
64
139
|
var ISLAND_KINDS = [
|
|
65
140
|
"image",
|
|
66
141
|
"table",
|
|
@@ -69,6 +144,7 @@ var ISLAND_KINDS = [
|
|
|
69
144
|
"callout",
|
|
70
145
|
"toggle",
|
|
71
146
|
"video",
|
|
147
|
+
"embed",
|
|
72
148
|
"file",
|
|
73
149
|
"component"
|
|
74
150
|
];
|
|
@@ -99,6 +175,10 @@ function defaultModel(kind, extra) {
|
|
|
99
175
|
body: ""
|
|
100
176
|
}),
|
|
101
177
|
video: () => ({ url: "" }),
|
|
178
|
+
embed: () => ({
|
|
179
|
+
url: "",
|
|
180
|
+
title: ""
|
|
181
|
+
}),
|
|
102
182
|
file: () => ({
|
|
103
183
|
url: "",
|
|
104
184
|
name: ""
|
|
@@ -178,6 +258,10 @@ function renderStatic(kind, model) {
|
|
|
178
258
|
const m = model;
|
|
179
259
|
return `<div data-rt="video"${attr("data-url", m.url)}${attr("data-title", m.title)}${xAttr(m.extra)}>${m.url ? `<a href="${escAttr(m.url)}">${esc(m.title || m.url)}</a>` : ""}</div>`;
|
|
180
260
|
}
|
|
261
|
+
case "embed": {
|
|
262
|
+
const m = model;
|
|
263
|
+
return `<figure data-rt="embed"${attr("data-url", m.url)}${attr("data-title", m.title)}${xAttr(m.extra)}>${m.url ? `<a href="${escAttr(m.url)}">${esc(m.title || m.url)}</a>` : ""}</figure>`;
|
|
264
|
+
}
|
|
181
265
|
case "file": {
|
|
182
266
|
const m = model;
|
|
183
267
|
const link = m.url && m.name ? `<a href="${escAttr(m.url)}" download>${esc(m.name)}</a>` : "";
|
|
@@ -206,6 +290,150 @@ var isRowGroupRow = (tr) => {
|
|
|
206
290
|
return rows[0] === tr && rows.length > 1;
|
|
207
291
|
};
|
|
208
292
|
var KEY = /^[A-Za-z0-9-]{1,32}$/;
|
|
293
|
+
/** The column types a rich-text table stores: V2's island offers these (table-editor.tsx:80-86 TYPE_UI, the non-dev ones). */
|
|
294
|
+
var STORED_COLUMN_TYPES = [
|
|
295
|
+
"text",
|
|
296
|
+
"number",
|
|
297
|
+
"money",
|
|
298
|
+
"boolean",
|
|
299
|
+
"rating",
|
|
300
|
+
"link"
|
|
301
|
+
];
|
|
302
|
+
var storedType = (v) => STORED_COLUMN_TYPES.includes(v) ? v : void 0;
|
|
303
|
+
/** The settings a kit column stores: none for a plain text or link column, else its type and every setting it has. */
|
|
304
|
+
function columnSettings(c) {
|
|
305
|
+
const s = {
|
|
306
|
+
...c.description ? { description: c.description } : {},
|
|
307
|
+
...c.unit ? { unit: c.unit } : {},
|
|
308
|
+
...c.currency ? { currency: c.currency } : {},
|
|
309
|
+
...c.decimals != null ? { decimals: c.decimals } : {},
|
|
310
|
+
...c.align ? { align: c.align } : {},
|
|
311
|
+
...c.trueLabel ? { trueLabel: c.trueLabel } : {},
|
|
312
|
+
...c.falseLabel ? { falseLabel: c.falseLabel } : {},
|
|
313
|
+
...c.max != null ? { max: c.max } : {}
|
|
314
|
+
};
|
|
315
|
+
const type = storedType(c.type) ?? "text";
|
|
316
|
+
return type === "text" || type === "link" ? Object.keys(s).length ? {
|
|
317
|
+
type,
|
|
318
|
+
...s
|
|
319
|
+
} : void 0 : {
|
|
320
|
+
type,
|
|
321
|
+
...s
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/** A `<col>`'s attributes, V2 renderTableHtml's order (schema/table.ts:511-526): the column's settings, data-sortable among them. */
|
|
325
|
+
function colAttrs(c, sortable) {
|
|
326
|
+
return [
|
|
327
|
+
c ? ` data-type="${c.type ?? "text"}"` : "",
|
|
328
|
+
c?.unit ? ` data-unit="${escAttr(c.unit)}"` : "",
|
|
329
|
+
c?.currency ? ` data-currency="${escAttr(c.currency)}"` : "",
|
|
330
|
+
c?.decimals != null ? ` data-decimals="${c.decimals}"` : "",
|
|
331
|
+
c?.align ? ` data-align="${c.align}"` : "",
|
|
332
|
+
sortable ? " data-sortable=\"true\"" : "",
|
|
333
|
+
c?.trueLabel ? ` data-true="${escAttr(c.trueLabel)}"` : "",
|
|
334
|
+
c?.falseLabel ? ` data-false="${escAttr(c.falseLabel)}"` : "",
|
|
335
|
+
c?.max != null ? ` data-max="${c.max}"` : "",
|
|
336
|
+
c?.description ? ` data-description="${escAttr(c.description)}"` : ""
|
|
337
|
+
].join("");
|
|
338
|
+
}
|
|
339
|
+
/** A `<col data-type …>` read back, as V2 parseTableElement reads it; undefined without a data-type. */
|
|
340
|
+
function colSettingsOf(col) {
|
|
341
|
+
const d = (n) => col.getAttribute(`data-${n}`) ?? void 0;
|
|
342
|
+
const type = storedType(d("type"));
|
|
343
|
+
if (!type) return void 0;
|
|
344
|
+
const int = (n, lo, hi) => {
|
|
345
|
+
const v = Number(d(n));
|
|
346
|
+
return d(n) !== void 0 && Number.isInteger(v) && v >= lo && v <= hi ? v : void 0;
|
|
347
|
+
};
|
|
348
|
+
const align = d("align");
|
|
349
|
+
return {
|
|
350
|
+
type,
|
|
351
|
+
...d("unit") ? { unit: d("unit") } : {},
|
|
352
|
+
...d("currency") && /^[A-Z]{3}$/.test(d("currency")) ? { currency: d("currency") } : {},
|
|
353
|
+
...int("decimals", 0, 10) !== void 0 ? { decimals: int("decimals", 0, 10) } : {},
|
|
354
|
+
...align === "start" || align === "center" || align === "end" ? { align } : {},
|
|
355
|
+
...d("true") ? { trueLabel: d("true") } : {},
|
|
356
|
+
...d("false") ? { falseLabel: d("false") } : {},
|
|
357
|
+
...int("max", 1, 10) !== void 0 ? { max: int("max", 1, 10) } : {},
|
|
358
|
+
...d("description") ? { description: d("description") } : {}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
var NUMERIC = /* @__PURE__ */ new Set([
|
|
362
|
+
"number",
|
|
363
|
+
"money",
|
|
364
|
+
"rating"
|
|
365
|
+
]);
|
|
366
|
+
/** V2 alignOf (schema/table.ts:365). */
|
|
367
|
+
var alignOf = (c, t) => c?.align ?? (NUMERIC.has(t) ? "end" : "start");
|
|
368
|
+
var isValueType = (t) => t === "boolean" || NUMERIC.has(t);
|
|
369
|
+
var asColumn = (c) => ({
|
|
370
|
+
_key: "",
|
|
371
|
+
label: "",
|
|
372
|
+
...c,
|
|
373
|
+
type: c?.type ?? "text"
|
|
374
|
+
});
|
|
375
|
+
/** V2 cellText for a typed cell: the words it says (what a stored typed cell's blocks hold). */
|
|
376
|
+
var typedWords = (c, type, value) => value == null || value === "" ? "" : cellText(asColumn(c), void 0, {
|
|
377
|
+
value,
|
|
378
|
+
type
|
|
379
|
+
});
|
|
380
|
+
/**
|
|
381
|
+
* What one cell of a typed table draws, as production's renderer writes it (the package's typedCellView, V2 cellHtml
|
|
382
|
+
* schema/table.ts:369-437 and the column header at :564): `lead` attributes before data-label / data-highlight, `tail` after,
|
|
383
|
+
* and the markup when the cell is empty or of a value type (undefined: the cell draws its own text or link).
|
|
384
|
+
*/
|
|
385
|
+
function typedCellView(column, rowType, cellType, value, header, inHead) {
|
|
386
|
+
if (inHead) {
|
|
387
|
+
const a = alignOf(column, column?.type ?? "text");
|
|
388
|
+
return {
|
|
389
|
+
lead: a !== "start" ? ` data-align="${a}"` : "",
|
|
390
|
+
tail: column?.description ? ` title="${escAttr(column.description)}"` : ""
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
const type = cellType ?? rowType ?? column?.type ?? "text";
|
|
394
|
+
const words = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : value;
|
|
395
|
+
let tail = cellType ? ` data-type="${cellType}"` : "";
|
|
396
|
+
let inner;
|
|
397
|
+
if (words == null || words === "") {
|
|
398
|
+
inner = header ? "" : "<span aria-hidden=\"true\" class=\"bt-dash\">—</span><span class=\"bt-sr\">No value</span>";
|
|
399
|
+
tail += " data-empty=\"\"";
|
|
400
|
+
} else if (type === "boolean") {
|
|
401
|
+
const b = toBool(words);
|
|
402
|
+
if (b == null) inner = esc(String(words));
|
|
403
|
+
else {
|
|
404
|
+
const { yes, no } = boolLabels(asColumn(column));
|
|
405
|
+
inner = `<span aria-hidden="true" class="bt-bool" data-bool="${b}">${b ? "✓" : "–"}</span><span class="bt-sr">${esc(b ? yes : no)}</span>`;
|
|
406
|
+
tail += ` data-value="${b}"`;
|
|
407
|
+
}
|
|
408
|
+
} else if (type === "rating") {
|
|
409
|
+
const n = toNumber(words);
|
|
410
|
+
if (n == null) inner = esc(String(words));
|
|
411
|
+
else {
|
|
412
|
+
inner = `<span aria-hidden="true" class="bt-star">★</span> ${esc(formatNumber(n, 1).replace(/\.0$/, ""))}<span class="bt-dim"> / ${column?.max ?? 5}</span>`;
|
|
413
|
+
tail += ` data-value="${n}"`;
|
|
414
|
+
}
|
|
415
|
+
} else if (type === "number" || type === "money") {
|
|
416
|
+
const n = toNumber(words);
|
|
417
|
+
inner = esc(typedWords(column, type, words));
|
|
418
|
+
if (n != null) tail += ` data-value="${n}"`;
|
|
419
|
+
}
|
|
420
|
+
const a = alignOf(column, type);
|
|
421
|
+
if (a !== "start") tail += ` data-align="${a}"`;
|
|
422
|
+
return {
|
|
423
|
+
lead: "",
|
|
424
|
+
tail,
|
|
425
|
+
...inner === void 0 ? {} : { inner }
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
/** A typed cell read back (V2 readCell): data-empty is no value; data-value a number or true / false for a value type. */
|
|
429
|
+
function typedValueOf(cell, type) {
|
|
430
|
+
if (cell.hasAttribute("data-empty")) return "";
|
|
431
|
+
const raw = cell.getAttribute("data-value");
|
|
432
|
+
if (raw === null || !isValueType(type)) return void 0;
|
|
433
|
+
if (type === "boolean") return raw === "true";
|
|
434
|
+
return raw.trim() !== "" && Number.isFinite(Number(raw)) ? Number(raw) : void 0;
|
|
435
|
+
}
|
|
436
|
+
var typeAttrOf = (el) => storedType(el.getAttribute("data-type"));
|
|
209
437
|
/**
|
|
210
438
|
* Production's table markup → the table value, cell for cell (renderStoredTable's inverse): the plain `<table>`, or
|
|
211
439
|
* the `<figure data-rt="table">` around one with its note. The V2 reader (parseTableElement) is not used here: it reads
|
|
@@ -225,23 +453,77 @@ function parseStoredTable(src) {
|
|
|
225
453
|
t.headerRow = head.length > 0;
|
|
226
454
|
t.headerColumn = body.length > 0 && body.every((tr) => tr.cells[0]?.tagName === "TH");
|
|
227
455
|
t.caption = words(table.querySelector(":scope > caption"));
|
|
456
|
+
if (fig?.getAttribute("data-filter") === "true") t.filterable = true;
|
|
457
|
+
const resp = fig?.getAttribute("data-responsive");
|
|
458
|
+
if (resp === "stack" || resp === "cards") t.design = {
|
|
459
|
+
...t.design,
|
|
460
|
+
responsive: resp
|
|
461
|
+
};
|
|
462
|
+
if (fig?.getAttribute("data-sticky") === "true") t.design = {
|
|
463
|
+
...t.design,
|
|
464
|
+
sticky: true
|
|
465
|
+
};
|
|
466
|
+
const ld = fig?.getAttribute("data-jsonld");
|
|
467
|
+
if (ld === "ItemList" || ld === "Dataset" || ld === "Offers") {
|
|
468
|
+
const axis = fig?.getAttribute("data-jsonld-axis");
|
|
469
|
+
const price = fig?.getAttribute("data-jsonld-price");
|
|
470
|
+
t.jsonLd = {
|
|
471
|
+
type: ld,
|
|
472
|
+
...axis === "rows" || axis === "columns" ? { axis } : {},
|
|
473
|
+
...price ? { priceRow: price } : {}
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
const sortable = /* @__PURE__ */ new Set();
|
|
477
|
+
const settings = [];
|
|
478
|
+
let colAt = 0;
|
|
479
|
+
for (const g of Array.from(table.querySelectorAll(":scope > colgroup"))) {
|
|
480
|
+
const list = Array.from(g.querySelectorAll(":scope > col"));
|
|
481
|
+
if (!list.length) colAt += Math.max(1, Number(g.getAttribute("span")) || 1);
|
|
482
|
+
for (const col of list) {
|
|
483
|
+
const w = Math.max(1, Number(col.getAttribute("span")) || 1);
|
|
484
|
+
if (col.getAttribute("data-sortable") === "true") for (let i = 0; i < w; i++) sortable.add(colAt + i);
|
|
485
|
+
for (let i = 0; i < w; i++) settings[colAt + i] = colSettingsOf(col);
|
|
486
|
+
colAt += w;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
228
489
|
t.columns = Array.from({ length: width }, (_, i) => ({
|
|
229
490
|
_key: tkey("c"),
|
|
230
491
|
label: words(headCells[i]),
|
|
231
|
-
|
|
492
|
+
...settings[i],
|
|
493
|
+
type: settings[i]?.type ?? "text",
|
|
494
|
+
...grid[0]?.cells[i]?.getAttribute("data-highlight") === "true" ? { highlight: true } : {},
|
|
495
|
+
...sortable.has(i) ? { sortable: true } : {}
|
|
496
|
+
}));
|
|
497
|
+
const footnoteEls = Array.from(fig?.querySelectorAll("[data-footnotes] > li") ?? []);
|
|
498
|
+
if (footnoteEls.length) t.footnotes = footnoteEls.map((li) => ({
|
|
499
|
+
_key: li.getAttribute("data-key") || tkey("f"),
|
|
500
|
+
text: words(li)
|
|
232
501
|
}));
|
|
233
|
-
const cellOf = (cell) => {
|
|
502
|
+
const cellOf = (cell, col, rowType) => {
|
|
234
503
|
if (!cell) return "";
|
|
235
504
|
const { rest: c, marks } = splitMarks(cell);
|
|
505
|
+
let mark;
|
|
506
|
+
for (const sup of Array.from(c.querySelectorAll("sup"))) {
|
|
507
|
+
const n = /-fn-(\d+)$/.exec(sup.querySelector("a")?.getAttribute("href") ?? "")?.[1];
|
|
508
|
+
if (!n) continue;
|
|
509
|
+
mark ??= Number(n);
|
|
510
|
+
sup.remove();
|
|
511
|
+
}
|
|
512
|
+
const named = cell.getAttribute("data-note") ?? (mark ? t.footnotes?.[mark - 1]?._key : void 0);
|
|
513
|
+
const note = named && t.footnotes?.some((f) => f._key === named) ? named : void 0;
|
|
514
|
+
const own = typeAttrOf(cell);
|
|
515
|
+
const typed = typedValueOf(cell, own ?? rowType ?? col.type);
|
|
236
516
|
const text = words(c);
|
|
237
517
|
const a = c.children.length === 1 && c.firstElementChild?.tagName === "A" && c.firstElementChild.textContent?.trim() === text ? c.firstElementChild : null;
|
|
238
|
-
const value = a ? {
|
|
518
|
+
const value = typed !== void 0 ? typed : a ? {
|
|
239
519
|
label: text,
|
|
240
520
|
href: a.getAttribute("href") ?? ""
|
|
241
521
|
} : text;
|
|
242
|
-
return marks ? {
|
|
522
|
+
return own || marks || note ? {
|
|
243
523
|
value,
|
|
244
|
-
|
|
524
|
+
...own ? { type: own } : {},
|
|
525
|
+
...note ? { note } : {},
|
|
526
|
+
...marks ? { marks } : {}
|
|
245
527
|
} : value;
|
|
246
528
|
};
|
|
247
529
|
const groupOf = (list, own, prefix, label) => {
|
|
@@ -281,19 +563,26 @@ function parseStoredTable(src) {
|
|
|
281
563
|
continue;
|
|
282
564
|
}
|
|
283
565
|
if (current && current.body !== tr.parentElement) current = void 0;
|
|
566
|
+
const footer = tr.parentElement?.tagName === "TFOOT";
|
|
567
|
+
const rowType = typeAttrOf(tr);
|
|
284
568
|
t.rows.push({
|
|
285
569
|
_key: tkey("r"),
|
|
286
|
-
cells: Object.fromEntries(t.columns.map((col, i) => [col._key, cellOf(tr.cells[i])])),
|
|
287
|
-
...
|
|
570
|
+
cells: Object.fromEntries(t.columns.map((col, i) => [col._key, cellOf(tr.cells[i], col, rowType)])),
|
|
571
|
+
...rowType ? { type: rowType } : {},
|
|
572
|
+
...current && !footer ? { group: current.key } : {},
|
|
573
|
+
...footer ? { footer: true } : {},
|
|
574
|
+
...tr.getAttribute("data-highlight") === "true" ? { highlight: true } : {}
|
|
288
575
|
});
|
|
289
576
|
}
|
|
290
577
|
if (rowGroups.length) t.rowGroups = rowGroups;
|
|
291
|
-
const note = fig?.querySelector(":scope > [data-notes]");
|
|
578
|
+
const note = fig?.querySelector(":scope > [data-notes], :scope > .bt-notes > [data-notes]");
|
|
579
|
+
const box = fig?.querySelector(":scope > .bt-notes");
|
|
292
580
|
const notes = words(note);
|
|
293
581
|
if (notes) t.notes = notes;
|
|
294
|
-
const own = (note?.getAttribute("id") ?? table.getAttribute("aria-describedby") ?? "").replace(/-notes$/, "");
|
|
582
|
+
const own = (box?.getAttribute("id") ?? note?.getAttribute("id") ?? table.getAttribute("aria-describedby") ?? "").replace(/-notes$/, "");
|
|
295
583
|
if (KEY.test(own)) t.id = own;
|
|
296
|
-
t.columns.forEach((col) => {
|
|
584
|
+
t.columns.forEach((col, i) => {
|
|
585
|
+
if (settings[i]) return;
|
|
297
586
|
const vals = t.rows.map((r) => r.cells[col._key]).filter((v) => v !== "");
|
|
298
587
|
if (vals.length && vals.every((v) => isObjLike(v))) col.type = "link";
|
|
299
588
|
});
|
|
@@ -304,19 +593,53 @@ function parseStoredTable(src) {
|
|
|
304
593
|
* row in <thead>, header cells of the first column as <th>, every cell its text (a link cell its link). A caption, a
|
|
305
594
|
* note or a group adds what that renderer writes for it, in the order the rows are held (an unedited stored table
|
|
306
595
|
* comes back as it was; the editor's row list writes V2's order, loose rows first). An empty group has no row to label
|
|
307
|
-
* and is not written, as production's renderer writes none.
|
|
596
|
+
* and is not written, as production's renderer writes none. The totals rows are a <tfoot> after every <tbody>; a
|
|
597
|
+
* highlighted row is `<tr data-highlight="true">` and a highlighted column `data-highlight="true"` on each of its cells
|
|
598
|
+
* (production 0.10, the V2 table's markup). A sortable column is its `<col data-sortable="true">` (one `<col>` per column,
|
|
599
|
+
* inside each column group's `<colgroup>`), and "Visitors can search rows" the figure's `data-filter="true"`.
|
|
308
600
|
*/
|
|
309
601
|
function renderStoredTable(input) {
|
|
310
602
|
const t = normalizeTable(input);
|
|
311
603
|
const cols = t.columns;
|
|
312
|
-
const
|
|
604
|
+
const settings = cols.map(columnSettings);
|
|
605
|
+
const typed = settings.some(Boolean) || t.rows.some((r) => !!storedType(r.type) || Object.values(r.cells).some((c) => isCellObject(c) && !!storedType(c.type)));
|
|
606
|
+
const cell = (row, c, i, header) => {
|
|
313
607
|
const raw = row.cells[c._key];
|
|
314
608
|
const v = cellValue(raw);
|
|
315
609
|
const text = esc(cellText(c, row, raw));
|
|
316
610
|
const marks = isCellObject(raw) && typeof raw.marks === "string" ? raw.marks : "";
|
|
317
|
-
|
|
611
|
+
const plain = (isObjLike(v) && typeof v.href === "string" && v.href ? `<a href="${escAttr(v.href)}">${text}</a>` : text) + marks;
|
|
612
|
+
const tag = header ? "th" : "td";
|
|
613
|
+
const fn = noted(row, c);
|
|
614
|
+
if (!typed) return `<${tag}${hi(c)}${fn.attr}>${plain}${fn.sup}</${tag}>`;
|
|
615
|
+
const view = typedCellView(settings[i], storedType(row.type), isCellObject(raw) ? storedType(raw.type) : void 0, isObjLike(v) ? cellText(c, row, raw) : v, header, false);
|
|
616
|
+
const tail = view.tail.replace(/( data-align="[^"]*")?$/, `${fn.attr}$1`);
|
|
617
|
+
return `<${tag}${view.lead}${hi(c)}${tail}>${view.inner === void 0 ? plain : view.inner + marks}${fn.sup}</${tag}>`;
|
|
318
618
|
};
|
|
319
|
-
const
|
|
619
|
+
const hi = (c) => c.highlight ? " data-highlight=\"true\"" : "";
|
|
620
|
+
const fnOf = new Map((t.footnotes ?? []).map((f, i) => [f._key, i + 1]));
|
|
621
|
+
const noted = (row, c) => {
|
|
622
|
+
const raw = row.cells[c._key];
|
|
623
|
+
const key = isCellObject(raw) ? raw.note : void 0;
|
|
624
|
+
const n = key ? fnOf.get(key) : void 0;
|
|
625
|
+
return n ? {
|
|
626
|
+
attr: ` data-note="${escAttr(key)}"`,
|
|
627
|
+
sup: `<sup><a href="#${escAttr(t.id ?? "tbl")}-fn-${n}" aria-label="Note ${n}">${n}</a></sup>`
|
|
628
|
+
} : {
|
|
629
|
+
attr: "",
|
|
630
|
+
sup: ""
|
|
631
|
+
};
|
|
632
|
+
};
|
|
633
|
+
const rowHtml = (row) => `<tr${typed && storedType(row.type) ? ` data-type="${row.type}"` : ""}${row.highlight ? " data-highlight=\"true\"" : ""}>${cols.map((c, i) => cell(row, c, i, i === 0 && t.headerColumn)).join("")}</tr>`;
|
|
634
|
+
const headRow = `<tr>${cols.map((c, i) => {
|
|
635
|
+
const view = typed ? typedCellView(settings[i], void 0, void 0, void 0, true, true) : {
|
|
636
|
+
lead: "",
|
|
637
|
+
tail: ""
|
|
638
|
+
};
|
|
639
|
+
return `<th${view.lead}${hi(c)}${view.tail}>${esc(c.label)}</th>`;
|
|
640
|
+
}).join("")}</tr>`;
|
|
641
|
+
const body = t.rows.filter((r) => !r.footer);
|
|
642
|
+
const tfoot = t.rows.some((r) => r.footer) ? `<tfoot>${t.rows.filter((r) => r.footer).map(rowHtml).join("")}</tfoot>` : "";
|
|
320
643
|
const span = (name, n) => n > 1 ? ` ${name}="${n}"` : "";
|
|
321
644
|
const colLabels = new Map((t.columnGroups ?? []).map((g) => [g._key, String(g.label ?? "")]));
|
|
322
645
|
const rowLabels = new Map((t.rowGroups ?? []).map((g) => [g._key, String(g.label ?? "")]));
|
|
@@ -334,26 +657,39 @@ function renderStoredTable(input) {
|
|
|
334
657
|
return out.some((r) => r.key !== void 0) ? out : [];
|
|
335
658
|
};
|
|
336
659
|
const colRuns = runs(cols, (c) => c.group && colLabels.has(c.group) ? c.group : void 0);
|
|
337
|
-
const rowRuns = runs(
|
|
660
|
+
const rowRuns = runs(body, (r) => r.group && rowLabels.has(r.group) ? r.group : void 0);
|
|
338
661
|
const caption = t.caption.trim();
|
|
339
|
-
const notes =
|
|
340
|
-
|
|
662
|
+
const notes = (t.notes ?? "").trim();
|
|
663
|
+
const footnotes = t.footnotes ?? [];
|
|
664
|
+
const sortable = cols.some((c) => c.sortable) || settings.some(Boolean);
|
|
665
|
+
const filter = !!t.filterable;
|
|
666
|
+
const ld = t.jsonLd && t.jsonLd.type !== "none" ? t.jsonLd : null;
|
|
667
|
+
const resp = t.design?.responsive === "stack" || t.design?.responsive === "cards" ? t.design.responsive : null;
|
|
668
|
+
const sticky = !!t.design?.sticky;
|
|
669
|
+
if (!caption && !notes && !footnotes.length && !colRuns.length && !rowRuns.length && !sortable && !filter && !ld && !resp && !sticky && !typed) {
|
|
341
670
|
const out = ["<table>"];
|
|
342
|
-
if (t.headerRow) out.push(`<thead
|
|
343
|
-
out.push(`<tbody>${
|
|
671
|
+
if (t.headerRow) out.push(`<thead>${headRow}</thead>`);
|
|
672
|
+
out.push(`${body.length || !tfoot ? `<tbody>${body.map(rowHtml).join("")}</tbody>` : ""}${tfoot}</table>`);
|
|
344
673
|
return out.join("");
|
|
345
674
|
}
|
|
346
|
-
const notesId = notes ? `${t.id}-notes` : "";
|
|
675
|
+
const notesId = notes || footnotes.length ? `${t.id}-notes` : "";
|
|
347
676
|
const out = [`<table${notesId ? ` aria-describedby="${escAttr(notesId)}"` : ""}>`];
|
|
348
677
|
if (caption) out.push(`<caption>${esc(caption)}</caption>`);
|
|
349
|
-
|
|
678
|
+
if (sortable) {
|
|
679
|
+
let at = 0;
|
|
680
|
+
const widths = colRuns.length ? colRuns.map((r) => r.items.length) : [cols.length];
|
|
681
|
+
out.push(widths.map((w) => `<colgroup>${cols.slice(at, at += w).map((c, k) => `<col${colAttrs(settings[at - w + k], !!c.sortable)}>`).join("")}</colgroup>`).join(""));
|
|
682
|
+
} else out.push(colRuns.map((r) => `<colgroup${span("span", r.items.length)}></colgroup>`).join(""));
|
|
350
683
|
const groupRow = colRuns.length ? `<tr>${colRuns.map((r) => r.key === void 0 ? "<td></td>".repeat(r.items.length) : `<th scope="colgroup"${span("colspan", r.items.length)} data-group="${escAttr(r.key)}">${esc(colLabels.get(r.key))}</th>`).join("")}</tr>` : "";
|
|
351
|
-
if (groupRow || t.headerRow) out.push(`<thead>${groupRow}${t.headerRow ?
|
|
684
|
+
if (groupRow || t.headerRow) out.push(`<thead>${groupRow}${t.headerRow ? headRow : ""}</thead>`);
|
|
352
685
|
if (rowRuns.length) for (const r of rowRuns) out.push(`<tbody${r.key === void 0 ? "" : ` data-key="${escAttr(r.key)}"`}>${r.key === void 0 ? "" : `<tr><th scope="rowgroup"${span("colspan", cols.length)}>${esc(rowLabels.get(r.key))}</th></tr>`}${r.items.map(rowHtml).join("")}</tbody>`);
|
|
353
|
-
else if (
|
|
354
|
-
out.push(
|
|
686
|
+
else if (body.length) out.push(`<tbody>${body.map(rowHtml).join("")}</tbody>`);
|
|
687
|
+
out.push(`${tfoot}</table>`);
|
|
355
688
|
const html = out.join("");
|
|
356
|
-
|
|
689
|
+
if (!notes && !footnotes.length && !filter && !ld && !resp && !sticky) return html;
|
|
690
|
+
const designAttrs = `${resp ? ` data-responsive="${resp}"` : ""}${sticky ? " data-sticky=\"true\"" : ""}`;
|
|
691
|
+
const ldAttrs = ld ? ` data-jsonld="${ld.type}"${ld.axis ? ` data-jsonld-axis="${ld.axis}"` : ""}${ld.priceRow ? ` data-jsonld-price="${escAttr(ld.priceRow)}"` : ""}` : "";
|
|
692
|
+
return `<figure data-rt="table"${designAttrs}${filter ? " data-filter=\"true\"" : ""}${ldAttrs}>${html}${footnotes.length ? `<div class="bt-notes" id="${escAttr(notesId)}">${notes ? `<p data-notes>${esc(notes)}</p>` : ""}<ol data-footnotes>${footnotes.map((f, i) => `<li id="${escAttr(t.id ?? "tbl")}-fn-${i + 1}" data-key="${escAttr(f._key)}">${esc(f.text)}</li>`).join("")}</ol></div>` : notes ? `<p data-notes id="${escAttr(notesId)}">${esc(notes)}</p>` : ""}</figure>`;
|
|
357
693
|
}
|
|
358
694
|
/** The footnote markers closing a cell (`<sup data-footnote>` holding only text), and the cell without them. */
|
|
359
695
|
function splitMarks(c) {
|
|
@@ -371,6 +707,7 @@ function splitMarks(c) {
|
|
|
371
707
|
}
|
|
372
708
|
/** A cell the table value can hold: text, line breaks, or one link around its text, then any footnote markers. */
|
|
373
709
|
var plainCell = (cell) => {
|
|
710
|
+
if (cell.hasAttribute("data-value") || cell.hasAttribute("data-empty")) return true;
|
|
374
711
|
const c = splitMarks(cell).rest;
|
|
375
712
|
return Array.from(c.childNodes).every((n) => n.nodeType === 3 || n.nodeType === 1 && n.tagName === "BR") || c.children.length === 1 && c.firstElementChild.tagName === "A" && c.firstElementChild.children.length === 0 && (c.textContent ?? "").trim() === (c.firstElementChild.textContent ?? "").trim();
|
|
376
713
|
};
|
|
@@ -469,6 +806,16 @@ function parseIsland(kind, el) {
|
|
|
469
806
|
if (extra) m.extra = extra;
|
|
470
807
|
return m;
|
|
471
808
|
}
|
|
809
|
+
case "embed": {
|
|
810
|
+
const m = {};
|
|
811
|
+
const url = attrOf(el, "data-url");
|
|
812
|
+
const title = attrOf(el, "data-title");
|
|
813
|
+
if (url !== void 0) m.url = url;
|
|
814
|
+
if (title !== void 0) m.title = title;
|
|
815
|
+
const extra = attrOf(el, "data-extra");
|
|
816
|
+
if (extra) m.extra = extra;
|
|
817
|
+
return m;
|
|
818
|
+
}
|
|
472
819
|
case "file": {
|
|
473
820
|
const m = {};
|
|
474
821
|
const url = attrOf(el, "data-url");
|
|
@@ -541,7 +888,7 @@ function hydrate(root) {
|
|
|
541
888
|
root.append(p);
|
|
542
889
|
}
|
|
543
890
|
}
|
|
544
|
-
var BLOCK_TAGS = new Set([
|
|
891
|
+
var BLOCK_TAGS = /* @__PURE__ */ new Set([
|
|
545
892
|
"P",
|
|
546
893
|
"H1",
|
|
547
894
|
"H2",
|
|
@@ -603,7 +950,7 @@ function sanitize(html) {
|
|
|
603
950
|
});
|
|
604
951
|
return doc.body.innerHTML;
|
|
605
952
|
}
|
|
606
|
-
var TEXT_BLOCKS = new Set([
|
|
953
|
+
var TEXT_BLOCKS = /* @__PURE__ */ new Set([
|
|
607
954
|
"P",
|
|
608
955
|
"H1",
|
|
609
956
|
"H2",
|
|
@@ -665,26 +1012,8 @@ function rangeRect(r, fallback) {
|
|
|
665
1012
|
if (rect && (rect.width || rect.height)) return rect;
|
|
666
1013
|
return ((r.startContainer.nodeType === 1 ? r.startContainer : r.startContainer.parentElement) ?? fallback ?? document.body).getBoundingClientRect();
|
|
667
1014
|
}
|
|
668
|
-
var NOT_COUNTED = "[data-rt=component],[data-rt=pullquote],[data-rt=takeaways],[data-rt=video],[data-rt=file]";
|
|
669
|
-
var WORDS = (s) => s.replace(/\u200b/g, "").trim().split(/\s+/).filter(Boolean).length;
|
|
670
|
-
function countWords(html) {
|
|
671
|
-
if (!html) return 0;
|
|
672
|
-
if (!/data-rt="(?:component|pullquote|takeaways|video|file)"/.test(html) || typeof DOMParser === "undefined") return WORDS(html.replace(/<\/(p|li|h[1-6]|blockquote|pre|figcaption|td|th|summary)>/g, " ").replace(/<[^>]+>/g, " ").replace(/ |&[a-z]+;/g, " "));
|
|
673
|
-
const doc = new DOMParser().parseFromString(`<body>${html}</body>`, "text/html");
|
|
674
|
-
doc.body.querySelectorAll(NOT_COUNTED).forEach((n) => n.remove());
|
|
675
|
-
doc.body.querySelectorAll("p,li,h1,h2,h3,h4,h5,h6,td,th,figcaption,summary,pre,blockquote,div").forEach((n) => n.append(" "));
|
|
676
|
-
return WORDS(doc.body.textContent ?? "");
|
|
677
|
-
}
|
|
678
|
-
/** Linked component instances in the body. */
|
|
679
|
-
var countComponents = (html) => (html.match(/data-rt="component"/g) ?? []).length;
|
|
680
|
-
/** "1,840 words · 3 components" */
|
|
681
|
-
var bodyCountLabel = (html) => {
|
|
682
|
-
const w = countWords(html);
|
|
683
|
-
const c = countComponents(html);
|
|
684
|
-
return `${w.toLocaleString("en-US")} ${w === 1 ? "word" : "words"}${c ? ` · ${c} ${c === 1 ? "component" : "components"}` : ""}`;
|
|
685
|
-
};
|
|
686
1015
|
var isEmptyHtml = (html) => !html.replace(/<(?!img|hr|figure|table|details|div data-rt)[^>]*>/g, "").replace(/ /g, "").trim();
|
|
687
1016
|
//#endregion
|
|
688
|
-
export { CALLOUT_TONES,
|
|
1017
|
+
export { CALLOUT_TONES, IMAGE_ALIGNS, IMAGE_SIZES, ISLAND_KINDS, STORED_COLUMN_TYPES, TEXT_BLOCKS, cloneModel, closestBlock, colAttrs, colSettingsOf, columnSettings, createIsland, defaultModel, detectEmbed, detectKind, editingHost, editorRoundTrip, esc, escAttr, hydrate, isEmptyHtml, isValueType, parasToText, parseIsland, parseStoredTable, placeCaret, rangeRect, renderStatic, renderStoredTable, rid, sanitize, serialize, textBeforeCaret, textToParas, topBlock, typeAttrOf, typedCellView, typedValueOf, typedWords };
|
|
689
1018
|
|
|
690
1019
|
//# sourceMappingURL=dom.js.map
|