@bettercms-ai/kit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/{adapters → dist/adapters}/icons.js +2 -2
- package/dist/adapters/icons.js.map +1 -0
- package/{adapters → dist/adapters}/lossy.d.ts +90 -31
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
- package/{adapters → dist/adapters}/prod-types.js +71 -3
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +996 -179
- package/dist/adapters/schema.js.map +1 -0
- package/{adapters → dist/adapters}/values.d.ts +26 -5
- package/{adapters → dist/adapters}/values.js +87 -17
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/{context.d.ts → dist/context.d.ts} +92 -2
- package/{context.js → dist/context.js} +5 -2
- package/dist/context.js.map +1 -0
- package/{controls → dist/controls}/button.d.ts +19 -5
- package/{controls → dist/controls}/button.js +125 -54
- package/dist/controls/button.js.map +1 -0
- package/{controls → dist/controls}/c1.js +1 -1
- package/dist/controls/c1.js.map +1 -0
- package/{controls → dist/controls}/c2.js +1 -1
- package/dist/controls/c2.js.map +1 -0
- package/{controls → dist/controls}/choice.d.ts +7 -2
- package/{controls → dist/controls}/choice.js +71 -18
- package/dist/controls/choice.js.map +1 -0
- package/{controls → dist/controls}/code-register.js +1 -1
- package/dist/controls/code-register.js.map +1 -0
- package/{controls → dist/controls}/code.js +10 -9
- package/dist/controls/code.js.map +1 -0
- package/{controls → dist/controls}/color.js +8 -8
- package/dist/controls/color.js.map +1 -0
- package/{controls → dist/controls}/component-services.d.ts +42 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/{controls → dist/controls}/date-register.js +1 -1
- package/dist/controls/date-register.js.map +1 -0
- package/{controls → dist/controls}/date-zone.js +8 -2
- package/dist/controls/date-zone.js.map +1 -0
- package/{controls → dist/controls}/date.js +32 -24
- package/dist/controls/date.js.map +1 -0
- package/{controls → dist/controls}/form-picker-register.js +1 -1
- package/dist/controls/form-picker-register.js.map +1 -0
- package/{controls → dist/controls}/form-picker.js +11 -9
- package/dist/controls/form-picker.js.map +1 -0
- package/{controls → dist/controls}/icon-register.js +1 -1
- package/dist/controls/icon-register.js.map +1 -0
- package/{controls → dist/controls}/icon.d.ts +4 -2
- package/{controls → dist/controls}/icon.js +32 -27
- package/dist/controls/icon.js.map +1 -0
- package/{controls → dist/controls}/index.d.ts +1 -1
- package/{controls → dist/controls}/index.js +4 -3
- package/dist/controls/index.js.map +1 -0
- package/{controls → dist/controls}/json-register.js +1 -1
- package/dist/controls/json-register.js.map +1 -0
- package/{controls → dist/controls}/json.js +13 -3
- package/dist/controls/json.js.map +1 -0
- package/{controls → dist/controls}/link.js +6 -6
- package/dist/controls/link.js.map +1 -0
- package/{controls → dist/controls}/location-register.js +1 -1
- package/dist/controls/location-register.js.map +1 -0
- package/{controls → dist/controls}/location.js +64 -40
- package/dist/controls/location.js.map +1 -0
- package/{controls → dist/controls}/media-register.js +1 -1
- package/dist/controls/media-register.js.map +1 -0
- package/{controls → dist/controls}/media-services.d.ts +6 -0
- package/dist/controls/media-services.js +0 -0
- package/{controls → dist/controls}/media.d.ts +35 -4
- package/{controls → dist/controls}/media.js +491 -171
- package/dist/controls/media.js.map +1 -0
- package/{controls → dist/controls}/number.js +10 -9
- package/dist/controls/number.js.map +1 -0
- package/{controls → dist/controls}/reference-register.js +1 -1
- package/dist/controls/reference-register.js.map +1 -0
- package/{controls → dist/controls}/reference-services.d.ts +4 -0
- package/dist/controls/reference-services.js +0 -0
- package/{controls → dist/controls}/reference.d.ts +1 -1
- package/{controls → dist/controls}/reference.js +93 -77
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/{controls → dist/controls}/rich-text/blocks.js +471 -144
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
- package/{controls → dist/controls}/rich-text/catalog.js +75 -65
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +3 -1
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
- package/{controls → dist/controls}/rich-text/component-card.js +417 -99
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
- package/{controls → dist/controls}/rich-text/control.js +84 -42
- package/dist/controls/rich-text/control.js.map +1 -0
- package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
- package/{controls → dist/controls}/rich-text/dom.js +379 -50
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
- package/{controls → dist/controls}/rich-text/editor.js +148 -48
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
- package/{controls → dist/controls}/rich-text/floating.js +35 -18
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/{controls → dist/controls}/rich-text/index.js +1 -1
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/{controls → dist/controls}/rich-text/markdown.js +4 -2
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/{controls → dist/controls}/rich-text/ops.js +17 -15
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
- package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/{controls → dist/controls}/scale.js +5 -5
- package/dist/controls/scale.js.map +1 -0
- package/{controls → dist/controls}/slot-register.js +1 -1
- package/dist/controls/slot-register.js.map +1 -0
- package/{controls → dist/controls}/slot-services.d.ts +25 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/{controls → dist/controls}/slot.js +42 -24
- package/dist/controls/slot.js.map +1 -0
- package/{controls → dist/controls}/table/index.js +1 -1
- package/dist/controls/table/index.js.map +1 -0
- package/{controls → dist/controls}/table/prod.js +3 -3
- package/dist/controls/table/prod.js.map +1 -0
- package/{controls → dist/controls}/table/refs.js +13 -2
- package/dist/controls/table/refs.js.map +1 -0
- package/{controls → dist/controls}/table/stored.js +1 -1
- package/dist/controls/table/stored.js.map +1 -0
- package/{controls → dist/controls}/table/table-editor.js +51 -48
- package/dist/controls/table/table-editor.js.map +1 -0
- package/{controls → dist/controls}/table/table-link.js +3 -3
- package/dist/controls/table/table-link.js.map +1 -0
- package/{controls → dist/controls}/table/table.js +3 -3
- package/dist/controls/table/table.js.map +1 -0
- package/{controls → dist/controls}/text.d.ts +2 -2
- package/{controls → dist/controls}/text.js +78 -43
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/{engine → dist/engine}/array.js +34 -21
- package/dist/engine/array.js.map +1 -0
- package/{engine → dist/engine}/bits.js +1 -1
- package/dist/engine/bits.js.map +1 -0
- package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
- package/{engine → dist/engine}/breadcrumb.js +12 -36
- package/dist/engine/breadcrumb.js.map +1 -0
- package/{engine → dist/engine}/expand.d.ts +2 -4
- package/{engine → dist/engine}/expand.js +5 -22
- package/dist/engine/expand.js.map +1 -0
- package/{engine → dist/engine}/field-list.js +1 -1
- package/dist/engine/field-list.js.map +1 -0
- package/{engine → dist/engine}/field-shell.js +249 -121
- package/dist/engine/field-shell.js.map +1 -0
- package/{engine → dist/engine}/frame.d.ts +3 -1
- package/{engine → dist/engine}/frame.js +16 -14
- package/dist/engine/frame.js.map +1 -0
- package/{engine → dist/engine}/group-summary.d.ts +2 -1
- package/{engine → dist/engine}/group-summary.js +7 -3
- package/dist/engine/group-summary.js.map +1 -0
- package/{engine → dist/engine}/grouping.d.ts +19 -5
- package/{engine → dist/engine}/grouping.js +193 -21
- package/dist/engine/grouping.js.map +1 -0
- package/{engine → dist/engine}/item-list.d.ts +11 -1
- package/{engine → dist/engine}/item-list.js +35 -13
- package/dist/engine/item-list.js.map +1 -0
- package/{engine → dist/engine}/kit-field.js +45 -10
- package/dist/engine/kit-field.js.map +1 -0
- package/{engine → dist/engine}/schema-form.d.ts +27 -2
- package/{engine → dist/engine}/schema-form.js +182 -40
- package/dist/engine/schema-form.js.map +1 -0
- package/{engine → dist/engine}/slot.js +5 -15
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/{kit.css → dist/kit.css} +19 -0
- package/{lib → dist/lib}/cn.js +7 -4
- package/dist/lib/cn.js.map +1 -0
- package/{lib → dist/lib}/columns.js +4 -1
- package/dist/lib/columns.js.map +1 -0
- package/{lib → dist/lib}/frames.js +2 -2
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/{lib → dist/lib}/icons.js +4 -3
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/{lib → dist/lib}/path.js +4 -2
- package/dist/lib/path.js.map +1 -0
- package/{lib → dist/lib}/schema.d.ts +34 -3
- package/{lib → dist/lib}/schema.js +110 -13
- package/dist/lib/schema.js.map +1 -0
- package/{lib → dist/lib}/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -0
- package/{lib → dist/lib}/validate.d.ts +11 -1
- package/{lib → dist/lib}/validate.js +85 -11
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/{schema → dist/schema}/adapters.js +1 -2
- package/dist/schema/adapters.js.map +1 -0
- package/{schema → dist/schema}/help.d.ts +2 -0
- package/{schema → dist/schema}/help.js +6 -4
- package/dist/schema/help.js.map +1 -0
- package/{schema → dist/schema}/scale.js +1 -1
- package/dist/schema/scale.js.map +1 -0
- package/{schema → dist/schema}/sources.js +1 -1
- package/dist/schema/sources.js.map +1 -0
- package/{schema → dist/schema}/table.js +11 -10
- package/dist/schema/table.js.map +1 -0
- package/{schema → dist/schema}/types.d.ts +29 -1
- package/{schema → dist/schema}/types.js +1 -1
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +22 -0
- package/dist/theme.js +43 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.js +0 -0
- package/{ui → dist/ui}/action-tray.d.ts +1 -1
- package/{ui → dist/ui}/action-tray.js +20 -19
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +6 -7
- package/dist/ui/button.js.map +1 -0
- package/{ui → dist/ui}/choice-switch.js +1 -1
- package/dist/ui/choice-switch.js.map +1 -0
- package/{ui → dist/ui}/controls.js +51 -39
- package/dist/ui/controls.js.map +1 -0
- package/{ui → dist/ui}/display.d.ts +10 -3
- package/{ui → dist/ui}/display.js +57 -46
- package/dist/ui/display.js.map +1 -0
- package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
- package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/{ui → dist/ui}/field-context.js +1 -1
- package/dist/ui/field-context.js.map +1 -0
- package/{ui → dist/ui}/floating-panel.d.ts +1 -1
- package/{ui → dist/ui}/floating-panel.js +28 -12
- package/dist/ui/floating-panel.js.map +1 -0
- package/{ui → dist/ui}/index.d.ts +4 -0
- package/dist/ui/index.js +18 -0
- package/{ui → dist/ui}/input.d.ts +1 -1
- package/{ui → dist/ui}/input.js +9 -9
- package/dist/ui/input.js.map +1 -0
- package/{ui → dist/ui}/mode-bar.js +3 -3
- package/dist/ui/mode-bar.js.map +1 -0
- package/{ui → dist/ui}/overlay.d.ts +77 -5
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/{ui → dist/ui}/path-crumbs.js +37 -3
- package/dist/ui/path-crumbs.js.map +1 -0
- package/{ui → dist/ui}/presence.js +2 -2
- package/dist/ui/presence.js.map +1 -0
- package/{ui → dist/ui}/select.js +89 -87
- package/dist/ui/select.js.map +1 -0
- package/{ui → dist/ui}/shortcut-hint.js +1 -1
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/{ui → dist/ui}/surfaces.js +1 -1
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
- package/{ui → dist/ui}/tooltip-root.js +9 -8
- package/dist/ui/tooltip-root.js.map +1 -0
- package/{ui → dist/ui}/variants.js +1 -1
- package/dist/ui/variants.js.map +1 -0
- package/package.json +77 -23
- package/adapters/icons.js.map +0 -1
- package/adapters/lossy.js +0 -233
- package/adapters/lossy.js.map +0 -1
- package/adapters/prod-types.js.map +0 -1
- package/adapters/schema.js.map +0 -1
- package/adapters/values.js.map +0 -1
- package/brand/logo.js +0 -9
- package/brand/logo.js.map +0 -1
- package/context.js.map +0 -1
- package/controls/button.js.map +0 -1
- package/controls/c1.js.map +0 -1
- package/controls/c2.js.map +0 -1
- package/controls/choice.js.map +0 -1
- package/controls/code-register.js.map +0 -1
- package/controls/code.js.map +0 -1
- package/controls/color.js.map +0 -1
- package/controls/date-register.js.map +0 -1
- package/controls/date-zone.js.map +0 -1
- package/controls/date.js.map +0 -1
- package/controls/form-picker-register.js.map +0 -1
- package/controls/form-picker.js.map +0 -1
- package/controls/icon-register.js.map +0 -1
- package/controls/icon.js.map +0 -1
- package/controls/index.js.map +0 -1
- package/controls/json-register.js.map +0 -1
- package/controls/json.js.map +0 -1
- package/controls/link.js.map +0 -1
- package/controls/location-register.js.map +0 -1
- package/controls/location.js.map +0 -1
- package/controls/media-register.js.map +0 -1
- package/controls/media.js.map +0 -1
- package/controls/number.js.map +0 -1
- package/controls/reference-register.js.map +0 -1
- package/controls/reference.js.map +0 -1
- package/controls/rich-text/blocks.d.ts +0 -28
- package/controls/rich-text/blocks.js.map +0 -1
- package/controls/rich-text/catalog.js.map +0 -1
- package/controls/rich-text/codec.js.map +0 -1
- package/controls/rich-text/component-card.js.map +0 -1
- package/controls/rich-text/control.js.map +0 -1
- package/controls/rich-text/dom.js.map +0 -1
- package/controls/rich-text/editor.js.map +0 -1
- package/controls/rich-text/floating.js.map +0 -1
- package/controls/rich-text/index.js.map +0 -1
- package/controls/rich-text/link-form.js +0 -111
- package/controls/rich-text/link-form.js.map +0 -1
- package/controls/rich-text/markdown.js.map +0 -1
- package/controls/rich-text/ops.js.map +0 -1
- package/controls/rich-text/toolbar.js.map +0 -1
- package/controls/scale.js.map +0 -1
- package/controls/slot-register.js.map +0 -1
- package/controls/slot-services.js +0 -38
- package/controls/slot-services.js.map +0 -1
- package/controls/slot.js.map +0 -1
- package/controls/table/index.js.map +0 -1
- package/controls/table/prod.js.map +0 -1
- package/controls/table/refs.js.map +0 -1
- package/controls/table/stored.js.map +0 -1
- package/controls/table/table-editor.js.map +0 -1
- package/controls/table/table-link.js.map +0 -1
- package/controls/table/table.js.map +0 -1
- package/controls/text.js.map +0 -1
- package/engine/array.js.map +0 -1
- package/engine/bits.js.map +0 -1
- package/engine/breadcrumb.js.map +0 -1
- package/engine/expand.js.map +0 -1
- package/engine/field-list.js.map +0 -1
- package/engine/field-shell.js.map +0 -1
- package/engine/frame.js.map +0 -1
- package/engine/group-summary.js.map +0 -1
- package/engine/grouping.js.map +0 -1
- package/engine/item-list.js.map +0 -1
- package/engine/kit-field.js.map +0 -1
- package/engine/schema-form.js.map +0 -1
- package/engine/slot.js.map +0 -1
- package/index.js +0 -55
- package/index.js.map +0 -1
- package/lib/cn.js.map +0 -1
- package/lib/columns.js.map +0 -1
- package/lib/frames.js.map +0 -1
- package/lib/icons.js.map +0 -1
- package/lib/path.js.map +0 -1
- package/lib/schema.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/lib/validate.js.map +0 -1
- package/schema/adapters.js.map +0 -1
- package/schema/help.js.map +0 -1
- package/schema/scale.js.map +0 -1
- package/schema/sources.js.map +0 -1
- package/schema/table.js.map +0 -1
- package/schema/types.js.map +0 -1
- package/ui/action-tray.js.map +0 -1
- package/ui/button.js.map +0 -1
- package/ui/choice-switch.js.map +0 -1
- package/ui/controls.js.map +0 -1
- package/ui/display.js.map +0 -1
- package/ui/expanded-editor-modal.js.map +0 -1
- package/ui/field-context.js.map +0 -1
- package/ui/floating-panel.js.map +0 -1
- package/ui/index.js +0 -13
- package/ui/input.js.map +0 -1
- package/ui/mode-bar.js.map +0 -1
- package/ui/overlay.js +0 -378
- package/ui/overlay.js.map +0 -1
- package/ui/path-crumbs.js.map +0 -1
- package/ui/presence.js.map +0 -1
- package/ui/select.js.map +0 -1
- package/ui/shortcut-hint.js.map +0 -1
- package/ui/surfaces.js.map +0 -1
- package/ui/tooltip-root.js.map +0 -1
- package/ui/variants.js.map +0 -1
- /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
- /package/{adapters → dist/adapters}/icons.d.ts +0 -0
- /package/{brand → dist/brand}/logo.d.ts +0 -0
- /package/{controls → dist/controls}/c1.d.ts +0 -0
- /package/{controls → dist/controls}/c2.d.ts +0 -0
- /package/{controls → dist/controls}/code-register.d.ts +0 -0
- /package/{controls → dist/controls}/code.d.ts +0 -0
- /package/{controls → dist/controls}/color.d.ts +0 -0
- /package/{controls → dist/controls}/date-register.d.ts +0 -0
- /package/{controls → dist/controls}/date-zone.d.ts +0 -0
- /package/{controls → dist/controls}/date.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker.d.ts +0 -0
- /package/{controls → dist/controls}/icon-register.d.ts +0 -0
- /package/{controls → dist/controls}/json-register.d.ts +0 -0
- /package/{controls → dist/controls}/json.d.ts +0 -0
- /package/{controls → dist/controls}/link.d.ts +0 -0
- /package/{controls → dist/controls}/location-register.d.ts +0 -0
- /package/{controls → dist/controls}/location.d.ts +0 -0
- /package/{controls → dist/controls}/media-register.d.ts +0 -0
- /package/{controls → dist/controls}/number.d.ts +0 -0
- /package/{controls → dist/controls}/reference-register.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
- /package/{controls → dist/controls}/scale.d.ts +0 -0
- /package/{controls → dist/controls}/slot-register.d.ts +0 -0
- /package/{controls → dist/controls}/slot.d.ts +0 -0
- /package/{controls → dist/controls}/table/index.d.ts +0 -0
- /package/{controls → dist/controls}/table/prod.d.ts +0 -0
- /package/{controls → dist/controls}/table/refs.d.ts +0 -0
- /package/{controls → dist/controls}/table/stored.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
- /package/{controls → dist/controls}/table/table.d.ts +0 -0
- /package/{engine → dist/engine}/array.d.ts +0 -0
- /package/{engine → dist/engine}/bits.d.ts +0 -0
- /package/{engine → dist/engine}/field-list.d.ts +0 -0
- /package/{engine → dist/engine}/field-shell.d.ts +0 -0
- /package/{engine → dist/engine}/kit-field.d.ts +0 -0
- /package/{engine → dist/engine}/slot.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/cn.d.ts +0 -0
- /package/{lib → dist/lib}/columns.d.ts +0 -0
- /package/{lib → dist/lib}/frames.d.ts +0 -0
- /package/{lib → dist/lib}/icons.d.ts +0 -0
- /package/{lib → dist/lib}/path.d.ts +0 -0
- /package/{lib → dist/lib}/utils.d.ts +0 -0
- /package/{schema → dist/schema}/adapters.d.ts +0 -0
- /package/{schema → dist/schema}/scale.d.ts +0 -0
- /package/{schema → dist/schema}/sources.d.ts +0 -0
- /package/{schema → dist/schema}/table.d.ts +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
- /package/{ui → dist/ui}/controls.d.ts +0 -0
- /package/{ui → dist/ui}/field-context.d.ts +0 -0
- /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
- /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
- /package/{ui → dist/ui}/presence.d.ts +0 -0
- /package/{ui → dist/ui}/select.d.ts +0 -0
- /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
- /package/{ui → dist/ui}/surfaces.d.ts +0 -0
- /package/{ui → dist/ui}/variants.d.ts +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { GENERAL_TABLE, boolLabels, cellNote, cellText, cellType, cellValue, coerce, isCellObject, isEmptyCell, isObjLike, normalizeTable, orderedRows, parseDelimited, parseTableElement, pasteRange, tableFromRows, tableToRows, tkey, toBool, toNumber, withValue } from "../../schema/table.js";
|
|
1
2
|
import { cn } from "../../lib/cn.js";
|
|
2
3
|
import { useKitServices } from "../../context.js";
|
|
3
4
|
import { Button, IconButton } from "../../ui/button.js";
|
|
4
5
|
import { Segmented, Switch } from "../../ui/controls.js";
|
|
5
6
|
import { Menu, MenuCheckItem, MenuContent, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Popover, PopoverAnchor, PopoverContent } from "../../ui/overlay.js";
|
|
6
|
-
import { GENERAL_TABLE, boolLabels, cellNote, cellText, cellType, cellValue, coerce, isCellObject, isEmptyCell, isObjLike, normalizeTable, orderedRows, parseDelimited, parseTableElement, pasteRange, tableFromRows, tableToRows, tkey, toBool, toNumber, withValue } from "../../schema/table.js";
|
|
7
|
-
import { Input, Textarea } from "../../ui/input.js";
|
|
8
7
|
import { FieldSection, FieldUnit, FieldUnitRow } from "../../engine/grouping.js";
|
|
8
|
+
import { Input, Textarea } from "../../ui/input.js";
|
|
9
9
|
import { Select } from "../../ui/select.js";
|
|
10
10
|
import { LinkField, hrefOf, linkText, normLink } from "../link.js";
|
|
11
11
|
import { SharedSortProvider, useSharedSort } from "../../engine/item-list.js";
|
|
@@ -16,10 +16,10 @@ import { ChoiceSwitch } from "../../ui/choice-switch.js";
|
|
|
16
16
|
import { LinkAddressButton, isScriptHref, tableLink } from "./table-link.js";
|
|
17
17
|
import { refLabel, useRefSearch } from "./refs.js";
|
|
18
18
|
import * as React from "react";
|
|
19
|
-
import { IconAlignLeft, IconArrowDown, IconArrowUp, IconArrowsMaximize, IconCheck, IconChevronDown, IconCurrencyDollar, IconDots, IconFileDatabase, IconFolder, IconGripVertical, IconHash, IconLayoutColumns, IconLetterT, IconLink, IconList, IconPlus, IconStar, IconTable, IconToggleRight } from "@tabler/icons-react";
|
|
20
19
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
+
import { IconAlignLeft, IconArrowDown, IconArrowUp, IconArrowsMaximize, IconCheck, IconChevronDown, IconCurrencyDollar, IconDots, IconFileDatabase, IconFolder, IconGripVertical, IconHash, IconLayoutColumns, IconLetterT, IconLink, IconList, IconPlus, IconStar, IconTable, IconToggleRight } from "@tabler/icons-react";
|
|
21
21
|
import { ContextMenu } from "@base-ui/react/context-menu";
|
|
22
|
-
//#region src/
|
|
22
|
+
//#region src/controls/table/table-editor.tsx
|
|
23
23
|
/**
|
|
24
24
|
* TABLE EDITOR (CPO D42, D49, D50, D52; port of V2 src/components/table/table-editor.tsx) — calm by default.
|
|
25
25
|
*
|
|
@@ -93,8 +93,6 @@ var TypeIcon = ({ type, className }) => {
|
|
|
93
93
|
"aria-hidden": true
|
|
94
94
|
});
|
|
95
95
|
};
|
|
96
|
-
/** A ⋯ trigger: shown on hover / focus of its group, always on touch. */
|
|
97
|
-
var DOTS = "flex size-6 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 outline-none hover:bg-kit-hover hover:text-kit-fg data-[popup-open]:bg-kit-hover data-[popup-open]:text-kit-fg";
|
|
98
96
|
var mapRow = (key, f) => (t) => ({
|
|
99
97
|
...t,
|
|
100
98
|
rows: t.rows.map((r) => r._key === key ? f(r) : r)
|
|
@@ -512,7 +510,7 @@ function Grid({ ctx, label, full }) {
|
|
|
512
510
|
};
|
|
513
511
|
return /* @__PURE__ */ jsxs("div", {
|
|
514
512
|
ref: host,
|
|
515
|
-
className: cn("min-w-0 overflow-x-auto rounded-kit-lg border border-kit-
|
|
513
|
+
className: cn("min-w-0 overflow-x-auto rounded-kit-lg border border-kit-field-border bg-kit-surface", full && "max-h-full min-h-0 flex-1 overflow-auto"),
|
|
516
514
|
"data-full": full ? "" : void 0,
|
|
517
515
|
children: [
|
|
518
516
|
/* @__PURE__ */ jsxs("table", {
|
|
@@ -781,8 +779,9 @@ function GridCell({ ctx, row, col, r, c, onMove, onPaste, full }) {
|
|
|
781
779
|
]
|
|
782
780
|
});
|
|
783
781
|
}
|
|
782
|
+
const cls = cn("relative border-l border-t border-kit-line p-0 align-top", head && "bg-[var(--kit-subtle-2)]", full && c === 0 && "sticky left-8 z-[1] bg-kit-surface", row.highlight && "bg-kit-accent-softer", col.highlight && "bg-kit-subtle");
|
|
784
783
|
return /* @__PURE__ */ jsxs("td", {
|
|
785
|
-
className:
|
|
784
|
+
className: cls,
|
|
786
785
|
children: [readOnly ? body : /* @__PURE__ */ jsx(CellMenu, {
|
|
787
786
|
ctx,
|
|
788
787
|
row,
|
|
@@ -1040,13 +1039,13 @@ function ColumnMenu({ ctx, col, index, onInsert, children }) {
|
|
|
1040
1039
|
open,
|
|
1041
1040
|
onOpenChange: setOpen,
|
|
1042
1041
|
children: [/* @__PURE__ */ jsx(MenuTrigger, {
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
className: "
|
|
1048
|
-
|
|
1049
|
-
})
|
|
1042
|
+
render: /* @__PURE__ */ jsx(IconButton, {
|
|
1043
|
+
size: "xs",
|
|
1044
|
+
tabIndex: -1,
|
|
1045
|
+
label: `Options for column ${col.label || index + 1}`,
|
|
1046
|
+
className: "shrink-0 opacity-0 focus-visible:opacity-100 group-hover/col:opacity-100 group-focus-within/col:opacity-100 data-[popup-open]:opacity-100 [@media(pointer:coarse)]:opacity-100"
|
|
1047
|
+
}),
|
|
1048
|
+
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
1050
1049
|
}), /* @__PURE__ */ jsxs(MenuContent, {
|
|
1051
1050
|
align: "end",
|
|
1052
1051
|
className: "min-w-52",
|
|
@@ -1274,15 +1273,15 @@ function RowMenu({ ctx, row, index, count, onInsert, children }) {
|
|
|
1274
1273
|
ctx.undoable("Row deleted", prev);
|
|
1275
1274
|
};
|
|
1276
1275
|
const groups = offered(ctx.options).groups ? t.rowGroups ?? [] : [];
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1276
|
+
const trigger = /* @__PURE__ */ jsx(MenuTrigger, {
|
|
1277
|
+
render: /* @__PURE__ */ jsx(IconButton, {
|
|
1278
|
+
size: "xs",
|
|
1279
|
+
tabIndex: -1,
|
|
1280
|
+
label: `Options for row ${index + 1}`
|
|
1281
|
+
}),
|
|
1282
|
+
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
1283
|
+
});
|
|
1284
|
+
return /* @__PURE__ */ jsxs(Menu, { children: [children(trigger), /* @__PURE__ */ jsxs(MenuContent, {
|
|
1286
1285
|
className: "min-w-52",
|
|
1287
1286
|
children: [
|
|
1288
1287
|
/* @__PURE__ */ jsx(MenuItem, {
|
|
@@ -1360,7 +1359,8 @@ function CellMenu({ ctx, row, col, cell, onWrite, onNote, children }) {
|
|
|
1360
1359
|
const asText = own === "text";
|
|
1361
1360
|
const atMax = !!ctx.options.maxRows && !row.footer && t.rows.filter((r) => !r.footer).length >= ctx.options.maxRows;
|
|
1362
1361
|
const setOwn = (type) => {
|
|
1363
|
-
const
|
|
1362
|
+
const raw = cellText(col, row, cell, ctx.resolveRef);
|
|
1363
|
+
const value = coerce(raw, {
|
|
1364
1364
|
type: type ?? colType,
|
|
1365
1365
|
max: col.max
|
|
1366
1366
|
});
|
|
@@ -1971,15 +1971,18 @@ function RowsPart({ ctx, basePath, onOpen }) {
|
|
|
1971
1971
|
role: "group",
|
|
1972
1972
|
"aria-label": run.totals ? "Totals" : run.group.label || "Untitled group",
|
|
1973
1973
|
className: "flex flex-col gap-1.5",
|
|
1974
|
-
children: [
|
|
1975
|
-
className: "
|
|
1976
|
-
children: "
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1974
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
1975
|
+
className: "rounded-kit-md transition-colors",
|
|
1976
|
+
children: run.totals ? /* @__PURE__ */ jsx("span", {
|
|
1977
|
+
className: "flex h-7 items-center px-0.5 text-kit-sm font-medium text-kit-fg-2",
|
|
1978
|
+
children: "Totals"
|
|
1979
|
+
}) : /* @__PURE__ */ jsx(GroupHeading, {
|
|
1980
|
+
ctx,
|
|
1981
|
+
group: run.group,
|
|
1982
|
+
index: groups.indexOf(run.group),
|
|
1983
|
+
count: groups.length,
|
|
1984
|
+
rows: run.items.length
|
|
1985
|
+
})
|
|
1983
1986
|
}), /* @__PURE__ */ jsx("div", {
|
|
1984
1987
|
className: "ml-1.5 border-l border-kit-line pl-3",
|
|
1985
1988
|
children: list
|
|
@@ -2045,14 +2048,14 @@ function GroupHeading({ ctx, group, index, count, rows }) {
|
|
|
2045
2048
|
setDraft(group.label);
|
|
2046
2049
|
}
|
|
2047
2050
|
},
|
|
2048
|
-
className: "-mx-0.5 h-7 min-w-0 flex-1 truncate rounded-kit-md bg-transparent px-0.5 text-
|
|
2051
|
+
className: "-mx-0.5 h-7 min-w-0 flex-1 truncate rounded-kit-md bg-transparent px-0.5 text-[13px] font-medium text-kit-fg-2 outline-none transition-colors placeholder:font-normal placeholder:text-kit-fg-4 hover:bg-kit-hover focus:bg-kit-surface focus:px-2 focus:text-kit-fg focus:shadow-[inset_0_0_0_1px_var(--kit-line-strong)]"
|
|
2049
2052
|
}), readOnly ? null : /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, {
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
className: "
|
|
2054
|
-
|
|
2055
|
-
})
|
|
2053
|
+
render: /* @__PURE__ */ jsx(IconButton, {
|
|
2054
|
+
size: "xs",
|
|
2055
|
+
label: `Options for ${group.label || "this group"}`,
|
|
2056
|
+
className: "opacity-0 focus-visible:opacity-100 group-hover/gh:opacity-100 group-focus-within/gh:opacity-100 data-[popup-open]:opacity-100 [@media(pointer:coarse)]:opacity-100"
|
|
2057
|
+
}),
|
|
2058
|
+
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
2056
2059
|
}), /* @__PURE__ */ jsxs(MenuContent, {
|
|
2057
2060
|
align: "end",
|
|
2058
2061
|
className: "min-w-44",
|
|
@@ -2336,12 +2339,12 @@ function CellField({ ctx, row, col, ci, needsName, onWrite }) {
|
|
|
2336
2339
|
}) : null,
|
|
2337
2340
|
/* @__PURE__ */ jsx("span", { className: "flex-1" }),
|
|
2338
2341
|
canWords || canNote || !readOnly && !isEmptyCell(v) ? /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, {
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
className: "
|
|
2343
|
-
|
|
2344
|
-
})
|
|
2342
|
+
render: /* @__PURE__ */ jsx(IconButton, {
|
|
2343
|
+
size: "xs",
|
|
2344
|
+
label: `Options for ${name}`,
|
|
2345
|
+
className: "-my-1 opacity-0 focus-visible:opacity-100 group-hover/cell:opacity-100 group-focus-within/cell:opacity-100 data-[popup-open]:opacity-100 [@media(pointer:coarse)]:opacity-100"
|
|
2346
|
+
}),
|
|
2347
|
+
children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
|
|
2345
2348
|
}), /* @__PURE__ */ jsxs(MenuContent, {
|
|
2346
2349
|
align: "end",
|
|
2347
2350
|
className: "min-w-52",
|
|
@@ -2717,6 +2720,6 @@ function TableSettings({ ctx }) {
|
|
|
2717
2720
|
}
|
|
2718
2721
|
var dropUndefined = (o) => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== void 0));
|
|
2719
2722
|
//#endregion
|
|
2720
|
-
export { TableEditor, TableFullScreenButton, TableItemEditor };
|
|
2723
|
+
export { TYPE_UI, TableEditor, TableFullScreenButton, TableItemEditor, linkNote, moveRowTo, offered, retype, setTotals, typedCell, unlinkNote };
|
|
2721
2724
|
|
|
2722
2725
|
//# sourceMappingURL=table-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-editor.js","names":[],"sources":["../../../src/controls/table/table-editor.tsx"],"sourcesContent":["/**\n * TABLE EDITOR (CPO D42, D49, D50, D52; port of V2 src/components/table/table-editor.tsx) — calm by default.\n *\n * Default nested array UX (D50): Title, Columns (an array list), Rows (nested under their groups, each the kit's own\n * array row: first cell, summary, ⋯, ›), Note under the table, then a collapsed Table settings. A row or column\n * drills through the kit form's navigation (standard breadcrumb + frame header, TableFrame); outside a form,\n * through a local drill with the same trail. A row is one field per column; the column's type picks the\n * control; per-cell exceptions (words instead, footnote, clear) sit behind a quiet ⋯ by the cell's label.\n * Expanded the spreadsheet lives ONLY in the expanded-editor modal (D49), opened by ⤢ in the field's label row: click a\n * cell and type, Tab / arrows / Enter move, \"+\" adds a column, grips reorder, ⋯ / Shift+F10 / right-click for\n * column, row and cell options.\n * Settings (D52) only presentation and structure, only what `field.table.settings` offers this kind.\n *\n * Kit deviations from V2 (no @dnd-kit / Radix in the kit): rows reorder inside their run with the kit's useDragReorder\n * (pointer + ↑/↓ on the grip); moving a row to another group is the row's ⋯ › Move to group (V2 also allowed dragging it\n * across). The cell context menu is Base UI's ContextMenu. Toasts come from KitServices (absent → silent). Link cells use\n * the table's own address editor (table-link.tsx) in the spreadsheet and the global LinkField in a drilled row (as V2); reference cells search through the host (refs.ts).\n */\nimport * as React from \"react\";\nimport { ContextMenu } from \"@base-ui/react/context-menu\";\nimport {\n IconAlignLeft, IconArrowDown, IconArrowUp, IconArrowsMaximize, IconCheck, IconChevronDown, IconCurrencyDollar, IconDots, IconFileDatabase, IconFolder,\n IconGripVertical, IconHash, IconLayoutColumns, IconLetterT, IconLink, IconList, IconPlus, IconStar, IconTable, IconToggleRight,\n} from \"@tabler/icons-react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button, IconButton } from \"../../ui/button\";\nimport { Input, Textarea } from \"../../ui/input\";\nimport { Segmented, Switch } from \"../../ui/controls\";\nimport { Select } from \"../../ui/select\";\nimport { ChoiceSwitch } from \"../../ui/choice-switch\";\nimport {\n Menu, MenuCheckItem, MenuContent, MenuItem, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger,\n Popover, PopoverAnchor, PopoverContent,\n} from \"../../ui/overlay\";\nimport { ExpandedEditorModal } from \"../../ui/expanded-editor-modal\";\nimport { PathCrumbs } from \"../../ui/path-crumbs\";\nimport { RowList, type RowModel, type ListOps } from \"../../engine/array\";\nimport { SharedSortProvider, useSharedSort } from \"../../engine/item-list\";\nimport { FieldSection, FieldUnit, FieldUnitRow } from \"../../engine/grouping\";\nimport { useKitServices, type KitToast } from \"../../context\";\nimport type { FieldPath, FieldSchema } from \"../../schema/types\";\nimport {\n GENERAL_TABLE, boolLabels, cellNote, cellText, cellType, cellValue, coerce, isCellObject, isEmptyCell, isObjLike, normalizeTable,\n orderedRows, parseDelimited, parseTableElement, pasteRange, tableFromRows, tableToRows, tkey, toBool, toNumber, withValue,\n type RefResolver, type TableCell, type TableCellValue, type TableColumn, type TableColumnType, type TableFieldOptions, type TableGroup,\n type TableJsonLdType, type TableLink, type TableRef, type TableResponsive, type TableRow, type TableValue,\n} from \"../../schema/table\";\nimport { LinkAddressButton, isScriptHref, tableLink } from \"./table-link\";\nimport { LinkField, hrefOf, linkText, normLink, type LinkValue } from \"../link\";\nimport { refLabel, useRefSearch, type TableRefOption } from \"./refs\";\n\nexport interface TableEditorProps {\n value: TableValue;\n onChange: (v: TableValue) => void;\n readOnly?: boolean;\n /** Trailing actions on the Title row (Remove table in rich text, V2). */\n actions?: React.ReactNode;\n options?: TableFieldOptions;\n /** Show developer-only settings (hide the title, sticky header, stripes, compact, rich text / reference types). */\n developer?: boolean;\n /** Names a reference id the stored cell does not carry a label for (the host's lookup); absent → stored label / id. */\n resolveRef?: RefResolver;\n label?: string;\n /** The page or block name, first crumb of the full-screen breadcrumb (\"Competitor comparison › Comparison\"). */\n parentTitle?: string;\n /** D50: inside a kit form, rows and columns drill through the form's own navigation (standard breadcrumb + frame). */\n nav?: TableNav;\n /** Controlled full-screen state, when the host shows the ⤢ button itself (the kit field's label row). */\n fullScreen?: { open: boolean; onOpenChange: (open: boolean) => void; returnFocus?: () => HTMLElement | null };\n}\n\nexport interface TableNav {\n /** stable id of this table field (focus returns to the row that was open) */\n id: string;\n /** the table field's path in the form; rows live at [...basePath, \"rows\", i], columns at [...basePath, \"columns\", i] */\n basePath: FieldPath;\n open: (kind: \"rows\" | \"columns\", index: number) => void;\n}\n\n/* ── Plain words for types (no jargon) ─────────────────────────────── */\ntype IconCmp = React.ComponentType<{ className?: string; stroke?: number }>;\nexport const TYPE_UI: Record<TableColumnType, { label: string; icon: IconCmp; dev?: boolean }> = {\n text: { label: \"Text\", icon: IconLetterT },\n number: { label: \"Number\", icon: IconHash },\n money: { label: \"Price\", icon: IconCurrencyDollar },\n boolean: { label: \"Yes / No\", icon: IconToggleRight },\n link: { label: \"Link\", icon: IconLink },\n rating: { label: \"Rating\", icon: IconStar },\n \"richtext-inline\": { label: \"Rich text\", icon: IconAlignLeft, dev: true },\n reference: { label: \"Page or CMS item\", icon: IconFileDatabase, dev: true },\n};\nconst NUMERIC: TableColumnType[] = [\"number\", \"money\", \"rating\"];\nconst CURRENCIES = [\"USD\", \"EUR\", \"GBP\", \"INR\"];\nconst TypeIcon = ({ type, className }: { type: TableColumnType; className?: string }) => {\n const I = TYPE_UI[type].icon;\n return <I className={cn(\"size-3.5 shrink-0 text-kit-fg-4\", className)} stroke={1.75} aria-hidden />;\n};\n\n/* ── Pure edits ────────────────────────────────────────────────────── */\ntype Edit = (t: TableValue) => TableValue;\nconst mapRow = (key: string, f: (r: TableRow) => TableRow): Edit => (t) => ({ ...t, rows: t.rows.map((r) => (r._key === key ? f(r) : r)) });\nconst clean = (r: TableRow): TableRow => {\n const x = { ...r };\n ([\"group\", \"footer\", \"type\", \"highlight\"] as const).forEach((k) => !x[k] && delete x[k]);\n return x;\n};\n/** What a person typed → the cell. A value that doesn't fit its column (e.g. \"Partly\" in Yes / No) becomes a text cell. */\nexport function typedCell(prev: TableCell | undefined, col: TableColumn, row: TableRow, raw: string): TableCell {\n const colType = row.type ?? col.type;\n const own = isCellObject(prev) ? prev.type : undefined;\n const plain = raw.trim();\n const note = cellNote(prev);\n const fits = (ty: TableColumnType) =>\n !plain || (((ty !== \"number\" && ty !== \"money\" && ty !== \"rating\") || toNumber(plain.replace(/(USD|EUR|GBP|JPY|INR|AUD|CAD|CHF)$/i, \"\")) != null) && (ty !== \"boolean\" || toBool(plain) != null));\n let type: TableColumnType | undefined = own;\n if (own === \"text\" && fits(colType)) type = undefined; // back to the column's type when it fits again\n else if (!own && !fits(colType)) type = \"text\";\n const ty = type ?? colType;\n let v: TableCellValue;\n if (ty === \"link\") {\n const p = cellValue(prev);\n const l = isObjLike(p) && !(\"ref\" in p) ? (p as TableLink) : null;\n v = plain ? { ...(l ?? {}), label: plain, href: l?.href ?? \"\" } : null;\n } else v = coerce(raw, { type: ty, max: col.max });\n return type || note ? { value: v, ...(type ? { type } : {}), ...(note ? { note } : {}) } : v;\n}\n/** Change a column's type; filled cells are re-read as the new type (words that don't fit become a text cell). */\nexport function retype(t: TableValue, key: string, type: TableColumnType, resolveRef?: RefResolver): TableValue {\n const col = t.columns.find((c) => c._key === key);\n if (!col || col.type === type) return t;\n const next: TableColumn = { ...col, type, ...(type === \"money\" && !col.currency ? { currency: \"USD\" } : {}) };\n // keys that only mean something for the old type go with it (the backend keeps whatever is sent; stale keys mislead)\n if (type !== \"number\") delete next.unit;\n if (type !== \"money\") delete next.currency;\n if (type !== \"rating\") delete next.max;\n if (type !== \"boolean\") {\n delete next.trueLabel;\n delete next.falseLabel;\n }\n if (type !== \"reference\") delete next.refTo;\n if (type !== \"number\" && type !== \"money\") delete next.decimals;\n return {\n ...t,\n columns: t.columns.map((c) => (c._key === key ? next : c)),\n rows: t.rows.map((r) => {\n const cell = r.cells[key];\n if ((isCellObject(cell) && cell.type) || r.type) return r;\n const v = cellValue(cell);\n if (isEmptyCell(v)) return r;\n const raw = col.type === \"link\" && isObjLike(v) ? (v as TableLink).label : col.type === \"reference\" && isObjLike(v) ? refLabel(v as TableRef) : cellText(col, r, cell, resolveRef);\n // a reference only comes from the picker: typed words in a reference column are words\n const written = type === \"reference\" ? (raw ? { value: raw, type: \"text\" as const } : null) : typedCell(cell, next, r, raw);\n return { ...r, cells: { ...r.cells, [key]: written } };\n }),\n };\n}\nconst displayRows = (t: TableValue) => {\n const { bodies, foot } = orderedRows(t);\n const out: { row: TableRow; groupStart?: TableGroup; footStart?: boolean }[] = [];\n bodies.forEach((b) => b.rows.forEach((row, i) => out.push({ row, groupStart: i === 0 ? b.group : undefined })));\n foot.forEach((row, i) => out.push({ row, footStart: i === 0 }));\n return out;\n};\n/** Move a row to a displayed position; crossing into another group (or the totals) takes on that place. */\nexport function moveRowTo(t: TableValue, from: number, to: number): TableValue {\n const order = displayRows(t).map((d) => d.row);\n if (to < 0 || to >= order.length || from === to) return t;\n const [r] = order.splice(from, 1);\n const target = order[Math.min(to, order.length - 1)] ?? r;\n order.splice(to, 0, clean({ ...r, group: target.group, footer: target.footer }));\n return { ...t, rows: order };\n}\nconst rowTitle = (t: TableValue, r: TableRow, i: number, resolveRef?: RefResolver) => {\n const c = t.columns[0];\n return (c && cellText(c, r, r.cells[c._key], resolveRef)) || `Row ${i + 1}`;\n};\nconst moveItem = <T,>(list: T[], from: number, to: number) => {\n const next = list.slice();\n const [x] = next.splice(from, 1);\n next.splice(to, 0, x);\n return next;\n};\nconst dropColumn = (t: TableValue, key: string): TableValue => ({\n ...t,\n columns: t.columns.filter((c) => c._key !== key),\n rows: t.rows.map((r) => ({ ...r, cells: Object.fromEntries(Object.entries(r.cells).filter(([k]) => k !== key)) })),\n});\nconst copyColumn = (t: TableValue, i: number): TableValue => {\n const c = t.columns[i];\n const k = tkey(\"c\");\n const columns = [...t.columns.slice(0, i + 1), { ...c, _key: k, label: c.label ? `${c.label} copy` : \"\", ...(c.highlight ? { highlight: undefined } : {}) }, ...t.columns.slice(i + 1)];\n return { ...t, columns, rows: t.rows.map((r) => (r.cells[c._key] === undefined ? r : { ...r, cells: { ...r.cells, [k]: r.cells[c._key] } })) };\n};\n\n/** CPO D49: the ONE way into the spreadsheet — opens it in the shared ExpandedEditorModal. Place it next to the title. */\nexport function TableFullScreenButton({ onOpen, className }: { onOpen: () => void; className?: string }) {\n return (\n <IconButton size=\"sm\" label=\"Edit in full screen\" className={className} onClick={onOpen}>\n <IconArrowsMaximize stroke={1.5} />\n </IconButton>\n );\n}\n\n/* ════════════════════════════════════════════════════════════════════ */\nexport function TableEditor(props: TableEditorProps) {\n const { value, onChange, readOnly, actions, label, options = GENERAL_TABLE, developer, resolveRef, nav, fullScreen } = props;\n const t = React.useMemo(() => normalizeTable(value), [value]);\n const [fullInner, setFullInner] = React.useState(false);\n const full = fullScreen?.open ?? fullInner;\n const setFull = fullScreen?.onOpenChange ?? setFullInner;\n const root = React.useRef<HTMLDivElement>(null);\n const { toast } = useKitServices();\n const ctx = makeCtx({ t, onChange, options, developer, resolveRef, readOnly, toast });\n const head = (\n <>\n {readOnly || fullScreen ? null : <TableFullScreenButton className=\"-my-1\" onOpen={() => setFull(true)} />}\n {actions}\n </>\n );\n return (\n <div\n ref={root}\n className=\"flex min-w-0 flex-col\"\n data-table-editor=\"\"\n // a host editor (rich text, canvas) must never act on keys, pastes or cuts made inside the table. Keys on a drag\n // handle pass (the sortable reads them on the grip itself).\n onKeyDown={(e) => e.key !== \"Escape\" && !(e.target as HTMLElement).closest?.('[aria-roledescription=\"sortable\"]') && e.stopPropagation()}\n onPaste={(e) => e.stopPropagation()}\n onCut={(e) => e.stopPropagation()}\n onCopy={(e) => e.stopPropagation()}\n >\n <TableBody ctx={ctx} label={label} nav={nav} head={head} />\n <ExpandedEditorModal\n open={full}\n onOpenChange={setFull}\n layout=\"wide\"\n crumbs={[props.parentTitle, label || \"Table\", t.caption || undefined].filter(Boolean) as string[]}\n meta={`${t.rows.length} ${t.rows.length === 1 ? \"row\" : \"rows\"} · ${t.columns.length} ${t.columns.length === 1 ? \"column\" : \"columns\"}`}\n returnFocus={() => fullScreen?.returnFocus?.() ?? root.current?.querySelector<HTMLElement>('button[aria-label=\"Edit in full screen\"]') ?? null}\n initialFocus={() => document.querySelector<HTMLElement>('[role=dialog] [data-cell=\"0:0\"], [role=dialog] [data-cell=\"-1:0\"]')}\n >\n {full ? (\n <div data-table-editor=\"\" className=\"flex min-h-0 flex-1 flex-col\" onPaste={(e) => e.stopPropagation()}>\n <Grid ctx={ctx} label={label} full />\n </div>\n ) : null}\n </ExpandedEditorModal>\n </div>\n );\n}\n\ninterface Ctx {\n t: TableValue;\n set: (t: TableValue) => void;\n edit: (f: Edit) => void;\n options: TableFieldOptions;\n developer: boolean;\n types: TableColumnType[];\n resolveRef?: RefResolver;\n lock: boolean;\n readOnly: boolean;\n /** a change with Undo (a delete, a move between groups); silent when the host has no toaster */\n undoable: (message: string, prev: TableValue, description?: string) => void;\n}\nfunction makeCtx({\n t, onChange, options = {}, developer, resolveRef, readOnly, toast,\n}: { t: TableValue; onChange: (v: TableValue) => void; options?: TableFieldOptions; developer?: boolean; resolveRef?: RefResolver; readOnly?: boolean; toast?: KitToast }): Ctx {\n const types = (Object.keys(TYPE_UI) as TableColumnType[]).filter((ty) => (options.columnTypes ? options.columnTypes.includes(ty) : !TYPE_UI[ty].dev || developer));\n return {\n t,\n set: onChange,\n edit: (f) => onChange(f(t)),\n options,\n developer: !!developer,\n types,\n resolveRef,\n lock: !!options.lockColumns || !!readOnly,\n readOnly: !!readOnly,\n undoable: (message, prev, description) => toast?.(message, { description, action: { label: \"Undo\", onClick: () => onChange(prev) }, duration: 10_000 }),\n };\n}\n\n/**\n * One row or one column of a table, as the body of a drilled frame (D50). The kit form shows it under the standard\n * breadcrumb and frame header, exactly like an FAQ item; hosts without a form get the same body from TableEditor.\n */\nexport function TableItemEditor({\n kind, index, value, onChange, options, developer, resolveRef, readOnly,\n}: Pick<TableEditorProps, \"value\" | \"onChange\" | \"options\" | \"developer\" | \"resolveRef\" | \"readOnly\"> & { kind: \"row\" | \"column\"; index: number }) {\n const t = React.useMemo(() => normalizeTable(value), [value]);\n const { toast } = useKitServices();\n const ctx = makeCtx({ t, onChange, options, developer, resolveRef, readOnly, toast });\n if (kind === \"row\") {\n const row = t.rows[index];\n return row ? <RowFields ctx={ctx} row={row} /> : <Gone kind=\"row\" />;\n }\n const col = t.columns[index];\n return col ? <ColumnFields ctx={ctx} col={col} /> : <Gone kind=\"column\" />;\n}\n/** A frame restored onto a row or column that was deleted elsewhere says so, never an empty body. */\nconst Gone = ({ kind }: { kind: \"row\" | \"column\" }) => <p role=\"note\" className=\"text-kit-sm text-kit-fg-3\">This {kind} is no longer in the table.</p>;\n\n/* ── Wide: the spreadsheet ─────────────────────────────────────────── */\n/** A column's minimum width: its longest header word + the type icon and ⋯ never break mid-word (≥ 96px, ≤ 240px). */\nconst colMinWidth = (c: TableColumn, full?: boolean) => {\n const longest = Math.max(0, ...c.label.split(/\\s+/).map((w) => w.length));\n return Math.min(240, Math.max(full ? 150 : 96, Math.ceil(longest * 7.6) + 58));\n};\ntype Dir = \"up\" | \"down\" | \"left\" | \"right\";\n\nfunction Grid({ ctx, label, full }: { ctx: Ctx; label?: string; full?: boolean }) {\n const { t, set, lock, readOnly } = ctx;\n const { toast } = useKitServices();\n const rows = displayRows(t);\n const cols = t.columns;\n const host = React.useRef<HTMLDivElement>(null);\n const pending = React.useRef<string | null>(null);\n const [, bump] = React.useReducer((n: number) => n + 1, 0);\n const focus = (r: number, c: number) => {\n pending.current = `${r}:${c}`;\n bump();\n };\n React.useLayoutEffect(() => {\n const p = pending.current;\n if (!p) return;\n const el = host.current?.querySelector<HTMLElement>(`[data-cell=\"${p}\"]`);\n if (!el) return;\n pending.current = null;\n el.focus({ preventScroll: true });\n el.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n if (el instanceof HTMLTextAreaElement) el.setSelectionRange(el.value.length, el.value.length);\n });\n const bodyCount = t.rows.filter((r) => !r.footer).length;\n const atMaxRows = !!ctx.options.maxRows && bodyCount >= ctx.options.maxRows;\n const atMaxCols = !!ctx.options.maxColumns && cols.length >= ctx.options.maxColumns;\n const addRow = (at = rows.length) => {\n if (readOnly) return;\n const anchor = rows[Math.min(at, rows.length) - 1]?.row;\n const intoTotals = !!anchor?.footer && at < rows.length;\n if (atMaxRows && !intoTotals) return toast?.(\"Limit reached\", { description: `This table allows ${ctx.options.maxRows} rows at most.` });\n const order = rows.map((d) => d.row);\n order.splice(at, 0, { _key: tkey(\"r\"), cells: {}, ...(anchor?.group ? { group: anchor.group } : {}), ...(intoTotals ? { footer: true } : {}) });\n set({ ...t, rows: order });\n focus(at, 0);\n };\n const addCol = (at = cols.length) => {\n if (lock) return;\n if (atMaxCols) return toast?.(\"Limit reached\", { description: `This table allows ${ctx.options.maxColumns} columns at most.` });\n const next = [...cols];\n next.splice(at, 0, { _key: tkey(\"c\"), label: \"\", type: \"text\" });\n set({ ...t, columns: next });\n focus(-1, at);\n };\n const move = (from: { r: number; c: number }, dir: Dir) => {\n const r = from.r + (dir === \"down\" ? 1 : dir === \"up\" ? -1 : 0);\n const c = from.c + (dir === \"right\" ? 1 : dir === \"left\" ? -1 : 0);\n if (c < 0 || c >= cols.length || r < -1) return;\n if (r >= rows.length) return addRow();\n focus(r, c);\n };\n const onPaste = (e: React.ClipboardEvent, r: number, c: number) => {\n if (readOnly) return false;\n const html = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n let range: string[][] = [];\n if (html && /<table[\\s>]/i.test(html) && typeof DOMParser !== \"undefined\") {\n const tbl = new DOMParser().parseFromString(html, \"text/html\").querySelector(\"table\");\n if (tbl) range = tableToRows(parseTableElement(tbl)).slice(r < 0 ? 0 : 1);\n }\n if (!range.length && /[\\t\\n]/.test(text.trim())) range = parseDelimited(text);\n if (!range.length) return false; // plain text: let the cell take it\n e.preventDefault();\n const blank = t.rows.every((x) => Object.values(x.cells).every((v) => isEmptyCell(cellValue(v)))) && cols.every((x) => !x.label.trim());\n let next: TableValue;\n if (blank && !lock && range.length > 1) {\n const n = tableFromRows(range, { header: true });\n next = { ...t, columns: n.columns, rows: n.rows, headerColumn: n.headerColumn || t.headerColumn };\n } else next = pasteRange({ ...t, rows: rows.map((d) => d.row) }, { row: r, col: c }, range, { lockColumns: lock });\n // the field's limits hold for a paste too: refuse it by name rather than store a table the backend refuses\n const body = next.rows.filter((x) => !x.footer).length;\n if (ctx.options.maxRows && body > ctx.options.maxRows) {\n toast?.(\"Paste not applied\", { description: `It would make ${body} rows; this table allows ${ctx.options.maxRows}.` });\n return true;\n }\n if (ctx.options.maxColumns && next.columns.length > ctx.options.maxColumns) {\n toast?.(\"Paste not applied\", { description: `It would make ${next.columns.length} columns; this table allows ${ctx.options.maxColumns}.` });\n return true;\n }\n set(next);\n toast?.(`Pasted ${range.length} ${range.length === 1 ? \"row\" : \"rows\"}`);\n return true;\n };\n // drag to reorder (grips); the ⋯ menus offer the same moves for keyboard users\n const drag = React.useRef<{ kind: \"row\" | \"col\"; i: number } | null>(null);\n // one id per grid: a label is not an id (spaces split it, two tables may share it)\n const helpId = `${React.useId()}-grid-help`;\n const [over, setOver] = React.useState<{ kind: \"row\" | \"col\"; i: number } | null>(null);\n const drop = (kind: \"row\" | \"col\", i: number) => {\n const d = drag.current;\n drag.current = null;\n setOver(null);\n if (!d || d.kind !== kind || d.i === i) return;\n if (kind === \"row\") set(moveRowTo(t, d.i, i));\n else if (!lock) set({ ...t, columns: moveItem(cols, d.i, i) });\n };\n return (\n <div ref={host} className={cn(\"min-w-0 overflow-x-auto rounded-kit-lg border border-kit-field-border bg-kit-surface\", full && \"max-h-full min-h-0 flex-1 overflow-auto\")} data-full={full ? \"\" : undefined}>\n <table role=\"grid\" aria-label={label || t.caption || \"Table\"} aria-describedby={helpId} className=\"w-full border-separate border-spacing-0 text-kit-sm\">\n <thead>\n <tr>\n <th className={cn(\"w-8 border-b border-kit-line bg-kit-subtle\", full && \"sticky left-0 top-0 z-[3]\")} aria-hidden />\n {cols.map((c, ci) => (\n <th\n key={c._key}\n scope=\"col\"\n style={{ minWidth: colMinWidth(c, full) }}\n className={cn(\n \"group/col relative border-b border-l border-kit-line bg-kit-subtle p-0 text-left align-bottom font-medium\",\n full && \"sticky top-0 z-[2]\",\n full && ci === 0 && \"left-8 z-[3]\",\n over?.kind === \"col\" && over.i === ci && \"shadow-[inset_2px_0_0_var(--kit-fg-2)]\",\n )}\n onDragOver={(e) => drag.current?.kind === \"col\" && (e.preventDefault(), setOver({ kind: \"col\", i: ci }))}\n onDrop={() => drop(\"col\", ci)}\n >\n <ColumnMenu ctx={ctx} col={c} index={ci} onInsert={(right) => addCol(right ? ci + 1 : ci)}>\n {(openMenu) => (\n <>\n {lock ? null : (\n <span draggable onDragStart={(e) => ((drag.current = { kind: \"col\", i: ci }), e.dataTransfer.setData(\"text/plain\", c.label))} className=\"-ml-1 hidden cursor-grab text-kit-fg-4 group-hover/col:block\" aria-hidden>\n <IconGripVertical className=\"size-3.5\" stroke={1.5} />\n </span>\n )}\n <TypeIcon type={c.type} />\n <CellInput\n cell={`-1:${ci}`}\n value={c.label}\n display={c.label}\n placeholder={ci === 0 && t.headerColumn ? \"Row names\" : \"Column name\"}\n readOnly={lock}\n className={cn(\"font-medium text-kit-fg\", !t.headerRow && \"text-kit-fg-3\")}\n ariaLabel={`Column ${ci + 1} name${t.headerRow ? \"\" : \" (not shown on the page)\"}`}\n onCommit={(v) => set({ ...t, columns: t.columns.map((x) => (x._key === c._key ? { ...x, label: v.replace(/\\s+/g, \" \").trim() } : x)) })}\n onMove={(dir) => move({ r: -1, c: ci }, dir)}\n onMenu={openMenu}\n onPaste={(e) => onPaste(e, -1, ci)}\n />\n </>\n )}\n </ColumnMenu>\n </th>\n ))}\n <th className=\"w-9 border-b border-l border-kit-line bg-kit-subtle p-0\">\n {lock ? null : (\n <IconButton size=\"xs\" label=\"Add column\" className=\"mx-auto\" disabled={atMaxCols} onClick={() => addCol()}>\n <IconPlus stroke={1.75} />\n </IconButton>\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ row, groupStart, footStart }, ri) => (\n <React.Fragment key={row._key}>\n {groupStart || footStart ? (\n <tr aria-hidden>\n <td colSpan={cols.length + 2} className=\"border-t border-kit-line bg-[var(--kit-subtle-2)] px-2 py-1 text-kit-2xs font-medium text-kit-fg-3\">\n {groupStart ? groupStart.label || \"Untitled group\" : \"Totals\"}\n </td>\n </tr>\n ) : null}\n <tr\n className={cn(\"group/row\", over?.kind === \"row\" && over.i === ri && \"shadow-[inset_0_2px_0_var(--kit-fg-2)]\")}\n onDragOver={(e) => drag.current?.kind === \"row\" && (e.preventDefault(), setOver({ kind: \"row\", i: ri }))}\n onDrop={() => drop(\"row\", ri)}\n >\n <td className={cn(\"w-8 border-t border-kit-line bg-[var(--kit-subtle-2)] p-0 align-middle\", full && \"sticky left-0 z-[1] bg-kit-subtle\")}>\n {readOnly ? (\n <div className=\"flex h-8 items-center justify-center text-kit-2xs text-kit-fg-4\">{ri + 1}</div>\n ) : (\n <RowMenu ctx={ctx} row={row} index={ri} count={rows.length} onInsert={(below) => addRow(below ? ri + 1 : ri)}>\n {(trigger) => (\n <div\n draggable\n onDragStart={(e) => ((drag.current = { kind: \"row\", i: ri }), e.dataTransfer.setData(\"text/plain\", String(ri)))}\n className=\"flex h-8 cursor-grab items-center justify-center text-kit-2xs text-kit-fg-4\"\n >\n <span className=\"group-hover/row:hidden group-focus-within/row:hidden\">{ri + 1}</span>\n <span className=\"hidden group-hover/row:flex group-focus-within/row:flex\">{trigger}</span>\n </div>\n )}\n </RowMenu>\n )}\n </td>\n {cols.map((c, ci) => (\n <GridCell key={c._key} full={full} ctx={ctx} row={row} col={c} r={ri} c={ci} onMove={(dir) => move({ r: ri, c: ci }, dir)} onPaste={(e) => onPaste(e, ri, ci)} />\n ))}\n <td className=\"border-l border-t border-kit-line\" />\n </tr>\n </React.Fragment>\n ))}\n </tbody>\n </table>\n <p id={helpId} className=\"sr-only\">Tab and the arrow keys move between cells. Shift+F10 on a column, row or cell opens its options.</p>\n {readOnly ? null : (\n <button\n type=\"button\"\n onClick={() => addRow()}\n disabled={atMaxRows}\n className=\"flex h-8 w-full items-center gap-1.5 border-t border-kit-line px-2.5 text-left text-kit-xs text-kit-fg-3 hover:bg-kit-subtle hover:text-kit-fg disabled:opacity-45\"\n >\n <IconPlus className=\"size-3.5\" stroke={1.75} aria-hidden /> {atMaxRows ? `Add row · ${ctx.options.maxRows} at most` : \"Add row\"}\n </button>\n )}\n </div>\n );\n}\n\n/** A grid cell: always editable (no select-then-edit mode). Yes / No is a check toggle; links and references open a small editor. */\nfunction GridCell({ ctx, row, col, r, c, onMove, onPaste, full }: { full?: boolean; ctx: Ctx; row: TableRow; col: TableColumn; r: number; c: number; onMove: (d: Dir) => void; onPaste: (e: React.ClipboardEvent) => boolean }) {\n const { t, edit, resolveRef, readOnly } = ctx;\n const cell = row.cells[col._key];\n const v = cellValue(cell);\n const declared = cellType(col, row, cell);\n // words sitting in a Yes / No cell (older or imported data) are edited as words, never hidden behind a dash\n const ty: TableColumnType = declared === \"boolean\" && !isEmptyCell(v) && toBool(v) == null ? \"text\" : declared;\n const write = (next: TableCell | undefined) => edit(mapRow(row._key, (x) => ({ ...x, cells: { ...x.cells, [col._key]: next ?? null } })));\n const head = t.headerColumn && c === 0;\n const note = cellNote(cell);\n const n = note ? (t.footnotes ?? []).findIndex((f) => f._key === note) + 1 : 0;\n const fn = note ? (t.footnotes ?? []).find((f) => f._key === note) : undefined;\n const [noteOpen, setNoteOpen] = React.useState(false);\n const name = `${col.label || `Column ${c + 1}`}, ${rowTitle(t, row, r, resolveRef)}`;\n let body: React.ReactNode;\n if (ty === \"boolean\") {\n const b = toBool(v);\n const { yes, no } = boolLabels(col);\n body = (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={b === true}\n aria-label={`${name}: ${b == null ? \"not set\" : b ? yes : no}`}\n aria-readonly={readOnly || undefined}\n data-cell={`${r}:${c}`}\n onClick={() => !readOnly && write(withValue(cell, b !== true))}\n onKeyDown={(e) => {\n const k = e.key;\n if (k === \"ArrowUp\" || k === \"ArrowDown\" || k === \"ArrowLeft\" || k === \"ArrowRight\") { e.preventDefault(); onMove(k.slice(5).toLowerCase() as Dir); }\n else if (k === \"Enter\") { e.preventDefault(); onMove(\"down\"); }\n else if (readOnly) return;\n else if (k === \"Delete\" || k === \"Backspace\") { e.preventDefault(); write(withValue(cell, null)); }\n else if (/^[yn]$/i.test(k)) { e.preventDefault(); write(withValue(cell, /y/i.test(k))); }\n }}\n onPaste={(e) => onPaste(e)}\n className=\"flex h-8 w-full items-center px-2 outline-none focus-visible:shadow-[inset_0_0_0_2px_var(--kit-fg-3)]\"\n >\n {b == null ? (\n <span className=\"text-kit-fg-4\">—</span>\n ) : (\n <span className={cn(\"flex size-4 items-center justify-center rounded-kit-sm border\", b ? \"border-kit-inverse bg-kit-inverse text-kit-fg-inverse\" : \"border-kit-line-strong\")}>\n {b ? <IconCheck className=\"size-3\" stroke={3} aria-hidden /> : null}\n </span>\n )}\n </button>\n );\n } else if (ty === \"reference\") {\n body = <RefCell ctx={ctx} cell={cell} col={col} cellId={`${r}:${c}`} name={name} onWrite={write} onMove={onMove} />;\n } else {\n const draft = isEmptyCell(v) ? \"\" : NUMERIC.includes(ty) ? String(toNumber(v) ?? cellText(col, row, cell)) : ty === \"link\" && isObjLike(v) ? (v as TableLink).label : ty === \"richtext-inline\" ? String(v) : cellText(col, row, cell, resolveRef);\n const link: TableLink | null = ty === \"link\" ? (isObjLike(v) && !(\"ref\" in v) ? (v as TableLink) : { label: typeof v === \"string\" ? v : \"\", href: \"\" }) : null;\n body = (\n <div className=\"relative flex items-start\">\n {ty === \"rating\" && !isEmptyCell(v) ? <IconStar className=\"ml-2 mt-2 size-3 shrink-0 text-kit-warning\" stroke={2} aria-hidden /> : null}\n <CellInput\n cell={`${r}:${c}`}\n value={draft}\n display={isEmptyCell(v) ? \"\" : ty === \"rating\" ? draft : cellText(col, row, cell, resolveRef)}\n placeholder=\"—\"\n numeric={NUMERIC.includes(ty)}\n readOnly={readOnly}\n className={cn(head && \"font-medium\", NUMERIC.includes(ty) && \"text-right tabular-nums\")}\n ariaLabel={name}\n onCommit={(raw) => raw !== draft && write(typedCell(cell, col, row, raw))}\n onMove={onMove}\n onPaste={onPaste}\n />\n {link ? <LinkAddressButton className=\"mr-1 mt-1.5\" link={link} readOnly={readOnly} onSave={(l) => write(withValue(cell, l))} /> : null}\n </div>\n );\n }\n const cls = cn(\n \"relative border-l border-t border-kit-line p-0 align-top\",\n head && \"bg-[var(--kit-subtle-2)]\",\n full && c === 0 && \"sticky left-8 z-[1] bg-kit-surface\",\n row.highlight && \"bg-kit-accent-softer\",\n col.highlight && \"bg-kit-subtle\",\n );\n return (\n <td className={cls}>\n {readOnly ? body : <CellMenu ctx={ctx} row={row} col={col} cell={cell} onWrite={write} onNote={() => window.setTimeout(() => setNoteOpen(true))}>{body}</CellMenu>}\n {/* D52: a footnote is written at its cell; in the spreadsheet that is a small popover from the cell's number */}\n <Popover open={noteOpen && !!fn} onOpenChange={setNoteOpen}>\n <PopoverAnchor\n render={\n n > 0 ? (\n <button type=\"button\" tabIndex={-1} aria-label={`Footnote ${n}`} onClick={() => setNoteOpen(true)} className=\"absolute right-0.5 top-0.5 rounded-kit-xs px-0.5 text-kit-2xs leading-3 text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg\" />\n ) : (\n <span className=\"pointer-events-none absolute right-1 top-1 size-0\" aria-hidden />\n )\n }\n >\n {n > 0 ? n : null}\n </PopoverAnchor>\n <PopoverContent align=\"end\" className=\"w-72 p-2\">\n {fn ? (\n <Input\n size=\"sm\"\n autoFocus\n value={fn.text}\n readOnly={readOnly}\n placeholder=\"What the footnote says\"\n aria-label={`Footnote ${n}`}\n onChange={(e) => ctx.set({ ...t, footnotes: (t.footnotes ?? []).map((x) => (x._key === fn._key ? { ...x, text: e.target.value } : x)) })}\n onKeyDown={(e) => e.key === \"Enter\" && (e.preventDefault(), setNoteOpen(false))}\n />\n ) : null}\n </PopoverContent>\n </Popover>\n </td>\n );\n}\n\n/** One cell's text. Shows the written value at rest (\"$39\", \"2.4 kg\") and the raw value while typing; commits on leave. */\nfunction CellInput({\n cell, value, display, onCommit, onMove, onMenu, onPaste, placeholder, numeric, className, ariaLabel, readOnly,\n}: {\n cell: string; value: string; display: string; onCommit: (v: string) => void; onMove: (d: Dir) => void; onMenu?: () => void;\n onPaste?: (e: React.ClipboardEvent) => boolean; placeholder?: string; numeric?: boolean; className?: string; ariaLabel: string; readOnly?: boolean;\n}) {\n const [focused, setFocused] = React.useState(false);\n const [draft, setDraft] = React.useState(value);\n const ref = React.useRef<HTMLTextAreaElement>(null);\n const shown = focused ? draft : display;\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"0px\";\n el.style.height = `${Math.max(32, el.scrollHeight)}px`;\n }, [shown]);\n return (\n <textarea\n ref={ref}\n rows={1}\n data-cell={cell}\n data-cell-editing={focused && draft !== value ? \"\" : undefined}\n value={shown}\n readOnly={readOnly}\n placeholder={placeholder}\n aria-label={ariaLabel}\n inputMode={numeric ? \"decimal\" : undefined}\n spellCheck={!numeric}\n onFocus={() => {\n setDraft(value);\n setFocused(true);\n }}\n onBlur={() => {\n setFocused(false);\n if (!readOnly && draft !== value) onCommit(draft);\n }}\n onChange={(e) => setDraft(e.target.value)}\n onPaste={(e) => onPaste?.(e)}\n onKeyDown={(e) => {\n const el = e.currentTarget;\n const k = e.key;\n const atStart = el.selectionStart === 0 && el.selectionEnd === 0;\n const atEnd = el.selectionStart === el.value.length && el.selectionEnd === el.value.length;\n const oneLine = !el.value.includes(\"\\n\");\n if ((k === \"F10\" && e.shiftKey) || k === \"ContextMenu\") {\n if (onMenu) { e.preventDefault(); onMenu(); }\n } else if (k === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n onMove(\"down\");\n } else if (k === \"Escape\" && draft !== value) {\n e.preventDefault();\n e.stopPropagation();\n setDraft(value);\n } else if (k === \"ArrowUp\" && (oneLine || atStart)) { e.preventDefault(); onMove(\"up\"); }\n else if (k === \"ArrowDown\" && (oneLine || atEnd)) { e.preventDefault(); onMove(\"down\"); }\n else if (k === \"ArrowLeft\" && atStart) { e.preventDefault(); onMove(\"left\"); }\n else if (k === \"ArrowRight\" && atEnd) { e.preventDefault(); onMove(\"right\"); }\n }}\n className={cn(\n \"block min-h-8 w-full resize-none overflow-hidden bg-transparent px-2 py-1.5 text-kit-sm leading-5 text-kit-fg outline-none [overflow-wrap:normal] [word-break:normal] placeholder:text-kit-fg-4 focus:bg-kit-surface focus:shadow-[inset_0_0_0_2px_var(--kit-fg-3)]\",\n className,\n )}\n />\n );\n}\n\n/**\n * A reference cell: a page or entry chosen from the host's search (refs.ts). Stores `{ ref, label, href? }`: the label and\n * public path travel with the id so the published table reads without a lookup.\n */\nfunction RefCell({ ctx, cell, col, cellId, name, onWrite, onMove }: { ctx: Ctx; cell: TableCell | undefined; col: TableColumn; cellId: string; name: string; onWrite: (c: TableCell) => void; onMove: (d: Dir) => void }) {\n const [open, setOpen] = React.useState(false);\n const [q, setQ] = React.useState(\"\");\n const v = cellValue(cell);\n const r: TableRef | null = isObjLike(v) && \"ref\" in v ? (v as TableRef) : null;\n const label = r ? (ctx.resolveRef?.(r.ref)?.label ?? refLabel(r)) : typeof v === \"string\" ? v : \"\";\n const search = useRefSearch(open, col.refTo?.length ? col.refTo : null, q);\n const pick = (o: TableRefOption) => {\n onWrite(withValue(cell, { ref: o.id, label: o.title, ...(o.href ? { href: o.href } : {}) }));\n setOpen(false);\n };\n return (\n <Popover open={open} onOpenChange={(o) => (setOpen(o), o || setQ(\"\"))}>\n <PopoverAnchor\n render={\n <button\n type=\"button\"\n data-cell={cellId}\n aria-label={`${name}: ${label || \"not chosen\"}`}\n aria-haspopup=\"dialog\"\n disabled={ctx.readOnly}\n onClick={() => setOpen(true)}\n onKeyDown={(e) => {\n const k = e.key;\n if (k.startsWith(\"Arrow\")) { e.preventDefault(); onMove(k.slice(5).toLowerCase() as Dir); }\n else if (!ctx.readOnly && (k === \"Delete\" || k === \"Backspace\") && !isEmptyCell(v)) { e.preventDefault(); onWrite(withValue(cell, null)); }\n }}\n className=\"flex min-h-8 w-full items-center px-2 text-left text-kit-sm text-kit-fg outline-none focus-visible:shadow-[inset_0_0_0_2px_var(--kit-fg-3)]\"\n />\n }\n >\n {label ? <span className=\"truncate underline decoration-kit-fg-4 underline-offset-2\">{label}</span> : <span className=\"text-kit-fg-4\">Choose…</span>}\n </PopoverAnchor>\n <PopoverContent align=\"start\" className=\"w-72 p-1.5\">\n <Input size=\"sm\" autoFocus value={q} placeholder=\"Search…\" aria-label=\"Find a page or entry\" onChange={(e) => setQ(e.target.value)} />\n <div role=\"status\" className=\"sr-only\">\n {search.status === \"ready\" ? `${search.options.length} results` : search.status === \"loading\" ? \"Searching\" : \"\"}\n </div>\n <ul className=\"mt-1 max-h-56 overflow-auto\" aria-label=\"Pages and entries\">\n {search.status === \"ready\"\n ? search.options.map((o) => (\n <li key={o.id}>\n <button type=\"button\" className=\"flex w-full flex-col rounded-kit-md px-2 py-1.5 text-left hover:bg-kit-hover\" onClick={() => pick(o)}>\n <span className=\"truncate text-kit-sm text-kit-fg\">{o.title}</span>\n {o.subtitle ? <span className=\"truncate text-kit-xs text-kit-fg-3\">{o.subtitle}</span> : null}\n </button>\n </li>\n ))\n : null}\n {search.status === \"ready\" && !search.options.length ? <li className=\"px-2 py-1.5 text-kit-xs text-kit-fg-3\">Nothing found{q.trim() ? ` for “${q.trim()}”` : \"\"}.</li> : null}\n {search.status === \"loading\" ? <li className=\"px-2 py-1.5 text-kit-xs text-kit-fg-3\">Searching…</li> : null}\n {search.status === \"error\" ? <li role=\"alert\" className=\"px-2 py-1.5 text-kit-xs text-kit-danger-fg\">Couldn't search: {search.message}</li> : null}\n {search.status === \"unavailable\" ? <li role=\"note\" className=\"px-2 py-1.5 text-kit-xs text-kit-fg-3\">This view can't search pages or entries, so the cell can't change here.</li> : null}\n </ul>\n {r && !ctx.readOnly ? (\n <Button size=\"sm\" variant=\"ghost\" className=\"mt-1 w-full justify-start text-kit-fg-2\" onClick={() => (onWrite(withValue(cell, null)), setOpen(false))}>\n Clear\n </Button>\n ) : null}\n </PopoverContent>\n </Popover>\n );\n}\n\n/* ── Menus ─────────────────────────────────────────────────────────── */\nfunction ColumnMenu({ ctx, col, index, onInsert, children }: { ctx: Ctx; col: TableColumn; index: number; onInsert: (right: boolean) => void; children: (open: () => void) => React.ReactNode }) {\n const { t, set, edit, lock, types, readOnly } = ctx;\n const [open, setOpen] = React.useState(false);\n const [details, setDetails] = React.useState(false);\n const n = t.columns.length;\n const atMax = !!ctx.options.maxColumns && n >= ctx.options.maxColumns;\n const remove = () => {\n if (n <= 1) return;\n const prev = t;\n set(dropColumn(t, col._key));\n ctx.undoable(\"Column deleted\", prev);\n };\n const shownTypes = types.includes(col.type) ? types : [...types, col.type];\n const hasDetails = !lock && (col.type === \"number\" || col.type === \"money\" || col.type === \"boolean\" || col.type === \"rating\");\n return (\n <Popover open={details} onOpenChange={setDetails}>\n <PopoverAnchor render={<div className=\"flex items-center gap-1 pl-1.5 pr-0.5\" />}>\n <div className=\"flex min-w-0 flex-1 items-center gap-1\">{children(() => setOpen(true))}</div>\n {readOnly ? null : (\n <Menu open={open} onOpenChange={setOpen}>\n <MenuTrigger\n render={\n <IconButton\n size=\"xs\"\n tabIndex={-1}\n label={`Options for column ${col.label || index + 1}`}\n className=\"shrink-0 opacity-0 focus-visible:opacity-100 group-hover/col:opacity-100 group-focus-within/col:opacity-100 data-[popup-open]:opacity-100 [@media(pointer:coarse)]:opacity-100\"\n />\n }\n >\n <IconDots stroke={1.5} />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"min-w-52\">\n {lock ? null : (\n <MenuSub>\n <MenuSubTrigger icon={<TypeIcon type={col.type} className=\"text-kit-fg-2\" />}>Type: {TYPE_UI[col.type].label}</MenuSubTrigger>\n <MenuSubContent>\n <MenuRadioGroup value={col.type} onValueChange={(v) => edit((x) => retype(x, col._key, v as TableColumnType, ctx.resolveRef))}>\n {shownTypes.map((ty) => (\n <MenuRadioItem key={ty} value={ty}>\n <span className=\"flex items-center gap-2\"><TypeIcon type={ty} className=\"text-kit-fg-2\" />{TYPE_UI[ty].label}</span>\n </MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuSubContent>\n </MenuSub>\n )}\n {hasDetails ? (\n <MenuItem onClick={() => window.setTimeout(() => setDetails(true))}>\n {col.type === \"number\" ? \"Unit…\" : col.type === \"money\" ? \"Currency…\" : col.type === \"rating\" ? \"Scale…\" : \"Words for yes and no…\"}\n </MenuItem>\n ) : null}\n {lock ? null : (\n <>\n <MenuSeparator />\n <MenuItem disabled={atMax} onClick={() => onInsert(false)}>Insert column left</MenuItem>\n <MenuItem disabled={atMax} onClick={() => onInsert(true)}>Insert column right</MenuItem>\n <MenuItem disabled={atMax} onClick={() => set(copyColumn(t, index))}>Duplicate column</MenuItem>\n <MenuItem disabled={index === 0} onClick={() => set({ ...t, columns: moveItem(t.columns, index, index - 1) })}>Move left</MenuItem>\n <MenuItem disabled={index === n - 1} onClick={() => set({ ...t, columns: moveItem(t.columns, index, index + 1) })}>Move right</MenuItem>\n </>\n )}\n <MenuSeparator />\n <MenuCheckItem checked={t.headerRow} onCheckedChange={(v) => set({ ...t, headerRow: v })}>Show column names</MenuCheckItem>\n <MenuCheckItem checked={t.headerColumn} onCheckedChange={(v) => set({ ...t, headerColumn: v })}>First column names each row</MenuCheckItem>\n <MenuCheckItem checked={!!col.highlight} onCheckedChange={(v) => set({ ...t, columns: t.columns.map((c) => ({ ...c, highlight: c._key === col._key && v ? true : undefined })) })}>Highlight this column</MenuCheckItem>\n {lock ? null : (\n <>\n <MenuSeparator />\n <MenuItem danger disabled={n <= 1} onClick={remove}>{n <= 1 ? \"Delete column · a table keeps one\" : \"Delete column\"}</MenuItem>\n </>\n )}\n </MenuContent>\n </Menu>\n )}\n </PopoverAnchor>\n <PopoverContent align=\"end\" className=\"w-64 p-3\">\n <ColumnDetails col={col} onPatch={(p) => set({ ...t, columns: t.columns.map((c) => (c._key === col._key ? withPatch(c, p) : c)) })} />\n </PopoverContent>\n </Popover>\n );\n}\n/** A stored TableLink as the global link field's value (V2 tableLinkValue). */\nconst tableLinkValue = (l: TableLink): LinkValue => ({ ...normLink(l.href), newTab: !!l.newTab, target: l.newTab ? \"_blank\" : \"_self\", rel: l.rel ?? \"follow\" });\n/** Patch a column; a key set to undefined is removed (the stored value never carries an empty key). */\nfunction withPatch<T extends object>(c: T, p: Partial<T>): T {\n const next = { ...c, ...p } as Record<string, unknown>;\n for (const k of Object.keys(p)) if (next[k] === undefined) delete next[k];\n return next as T;\n}\n\nfunction ColumnDetails({ col, onPatch, compact = true, readOnly }: { col: TableColumn; onPatch: (p: Partial<TableColumn>) => void; compact?: boolean; readOnly?: boolean }) {\n const id = React.useId();\n const row = (key: string, label: string, node: React.ReactNode, help?: string) => (\n // one <label> around the name, the control and its help, like V2 (the panel walk measures the whole block)\n <label htmlFor={`${id}-${key}`} className={cn(\"flex flex-col\", compact ? \"gap-1\" : \"gap-1.5\")}>\n <span className={cn(\"font-medium text-kit-fg-2\", compact ? \"text-kit-xs\" : \"text-kit-sm\")}>{label}</span>\n {node}\n {help ? <span className=\"text-kit-2xs leading-4 text-kit-fg-3\">{help}</span> : null}\n </label>\n );\n return (\n <div className={cn(\"flex flex-col\", compact ? \"gap-2.5\" : \"gap-4\")}>\n {col.type === \"number\"\n ? row(\"unit\", \"Unit\", <Input id={`${id}-unit`} size=\"sm\" autoFocus={compact} readOnly={readOnly} maxLength={16} value={col.unit ?? \"\"} placeholder=\"kg, %, min\" onChange={(e) => onPatch({ unit: e.target.value || undefined })} />, \"Written after every value.\")\n : null}\n {col.type === \"money\" ? (\n // a row() like V2; its htmlFor names no element, so a click on \"Currency\" never picks the first currency\n row(\"currency\", \"Currency\", <Segmented size=\"sm\" aria-label=\"Currency\" value={col.currency ?? \"USD\"} onChange={(currency) => !readOnly && onPatch({ currency })} items={(CURRENCIES.includes(col.currency ?? \"USD\") ? CURRENCIES : [...CURRENCIES, col.currency!]).map((c) => ({ value: c, label: c }))} />)\n ) : null}\n {col.type === \"rating\"\n ? row(\n \"max\",\n \"Out of\",\n <Input\n id={`${id}-max`}\n size=\"sm\"\n autoFocus={compact}\n readOnly={readOnly}\n type=\"number\"\n min={1}\n max={10}\n value={col.max ?? 5}\n // the backend takes a whole number from 1 to 10 (min/max say so; V2 writes no help line here)\n onChange={(e) => {\n const n = Math.round(Number(e.target.value));\n onPatch({ max: Number.isFinite(n) && n >= 1 ? Math.min(10, n) : undefined });\n }}\n />,\n )\n : null}\n {col.type === \"boolean\" ? (\n <>\n {row(\"yes\", \"Yes says\", <Input id={`${id}-yes`} size=\"sm\" autoFocus={compact} readOnly={readOnly} maxLength={300} value={col.trueLabel ?? \"\"} placeholder=\"Included\" onChange={(e) => onPatch({ trueLabel: e.target.value || undefined })} />, \"People who can't see the check mark hear these words.\")}\n {row(\"no\", \"No says\", <Input id={`${id}-no`} size=\"sm\" readOnly={readOnly} maxLength={300} value={col.falseLabel ?? \"\"} placeholder=\"Not included\" onChange={(e) => onPatch({ falseLabel: e.target.value || undefined })} />)}\n </>\n ) : null}\n </div>\n );\n}\n\nfunction RowMenu({ ctx, row, index, count, onInsert, children }: { ctx: Ctx; row: TableRow; index: number; count: number; onInsert: (below: boolean) => void; children: (trigger: React.ReactNode) => React.ReactNode }) {\n const { t, set, edit } = ctx;\n const atMax = !!ctx.options.maxRows && !row.footer && t.rows.filter((r) => !r.footer).length >= ctx.options.maxRows;\n const duplicate = () => {\n const order = displayRows(t).map((d) => d.row);\n order.splice(index + 1, 0, { ...row, _key: tkey(\"r\"), cells: { ...row.cells } });\n set({ ...t, rows: order });\n };\n const remove = () => {\n const prev = t;\n set({ ...t, rows: t.rows.filter((r) => r._key !== row._key) });\n ctx.undoable(\"Row deleted\", prev);\n };\n const groups = offered(ctx.options).groups ? t.rowGroups ?? [] : [];\n const trigger = (\n <MenuTrigger render={<IconButton size=\"xs\" tabIndex={-1} label={`Options for row ${index + 1}`} />}>\n <IconDots stroke={1.5} />\n </MenuTrigger>\n );\n return (\n <Menu>\n {children(trigger)}\n <MenuContent className=\"min-w-52\">\n <MenuItem disabled={atMax} onClick={() => onInsert(false)}>Insert row above</MenuItem>\n <MenuItem disabled={atMax} onClick={() => onInsert(true)}>Insert row below</MenuItem>\n <MenuItem disabled={atMax} onClick={duplicate}>Duplicate row</MenuItem>\n <MenuItem disabled={index === 0} onClick={() => set(moveRowTo(t, index, index - 1))}>Move up</MenuItem>\n <MenuItem disabled={index === count - 1} onClick={() => set(moveRowTo(t, index, index + 1))}>Move down</MenuItem>\n {groups.length ? (\n <MenuSub>\n <MenuSubTrigger>Move to group</MenuSubTrigger>\n <MenuSubContent>\n <MenuRadioGroup value={row.group ?? \"\"} onValueChange={(g) => edit(mapRow(row._key, (x) => clean({ ...x, group: (g as string) || undefined, footer: undefined })))}>\n <MenuRadioItem value=\"\">No group</MenuRadioItem>\n {groups.map((g) => (\n <MenuRadioItem key={g._key} value={g._key}>{g.label || \"Untitled group\"}</MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuSubContent>\n </MenuSub>\n ) : null}\n {offered(ctx.options).highlight ? <MenuCheckItem checked={!!row.highlight} onCheckedChange={(v) => edit(mapRow(row._key, (x) => clean({ ...x, highlight: v })))}>Highlight this row</MenuCheckItem> : null}\n {offered(ctx.options).totals ? <MenuCheckItem checked={!!row.footer} onCheckedChange={(v) => edit(mapRow(row._key, (x) => clean({ ...x, footer: v, group: undefined })))}>Totals row</MenuCheckItem> : null}\n <MenuSeparator />\n <MenuItem danger onClick={remove}>Delete row</MenuItem>\n </MenuContent>\n </Menu>\n );\n}\n\n/** Right-click (or Shift+F10 / the menu key) on a cell: words instead of the column's type, a footnote, clear. */\nfunction CellMenu({ ctx, row, col, cell, onWrite, onNote, children }: { ctx: Ctx; row: TableRow; col: TableColumn; cell: TableCell | undefined; onWrite: (c: TableCell | undefined) => void; onNote: () => void; children: React.ReactNode }) {\n const { t, set } = ctx;\n const own = isCellObject(cell) ? cell.type : undefined;\n const note = cellNote(cell);\n const colType = row.type ?? col.type;\n const asText = own === \"text\";\n const atMax = !!ctx.options.maxRows && !row.footer && t.rows.filter((r) => !r.footer).length >= ctx.options.maxRows;\n const setOwn = (type: TableColumnType | undefined) => {\n const raw = cellText(col, row, cell, ctx.resolveRef);\n const value = coerce(raw, { type: type ?? colType, max: col.max });\n onWrite(type || note ? { value, ...(type ? { type } : {}), ...(note ? { note } : {}) } : value);\n };\n const insertRow = (below: boolean) => {\n const order = displayRows(t).map((d) => d.row);\n const at = order.findIndex((r) => r._key === row._key) + (below ? 1 : 0);\n order.splice(at, 0, clean({ _key: tkey(\"r\"), cells: {}, group: row.group, footer: row.footer }));\n set({ ...t, rows: order });\n };\n return (\n <ContextMenu.Root>\n <ContextMenu.Trigger render={<div />}>{children}</ContextMenu.Trigger>\n <MenuContent className=\"min-w-52\">\n {colType !== \"text\" && colType !== \"reference\" && colType !== \"richtext-inline\" ? (\n <MenuItem onClick={() => setOwn(asText ? undefined : \"text\")}>{asText ? `Use ${TYPE_UI[colType].label} like the column` : \"Write words in this cell instead\"}</MenuItem>\n ) : null}\n {offered(ctx.options).footnotes ? (\n note ? (\n <>\n <MenuItem onClick={onNote}>Edit footnote</MenuItem>\n <MenuItem onClick={() => set(unlinkNote(t, row._key, col._key))}>Remove footnote</MenuItem>\n </>\n ) : (\n <MenuItem onClick={() => (set(linkNote(t, row._key, col._key)[0]), onNote())}>Add a footnote</MenuItem>\n )\n ) : null}\n <MenuSeparator />\n <MenuItem disabled={atMax} onClick={() => insertRow(true)}>Insert row below</MenuItem>\n <MenuItem disabled={atMax} onClick={() => insertRow(false)}>Insert row above</MenuItem>\n <MenuItem onClick={() => onWrite(withValue(cell, null))}>Clear cell</MenuItem>\n <MenuItem\n danger\n onClick={() => {\n const prev = t;\n set({ ...t, rows: t.rows.filter((r) => r._key !== row._key) });\n ctx.undoable(\"Row deleted\", prev);\n }}\n >\n Delete row\n </MenuItem>\n </MenuContent>\n </ContextMenu.Root>\n );\n}\n\n/* ── The form view (D50, D52): a table field reads like any nested array. No tinted container: Title, Columns, Rows (groups\n live in the row list), Note under the table, then a collapsed Table settings with only the settings this kind offers. ── */\nconst hasName = (t: TableValue, r: TableRow) => !!t.columns[0] && !isEmptyCell(cellValue(r.cells[t.columns[0]._key]));\n/** The row that was open when its drill closed, per table: focus lands back on it (form frames and the local drill). */\nconst returnTo = new Map<string, string>();\nconst ROWS_FIELD: FieldSchema = { name: \"rows\", title: \"Rows\", type: \"table\", icon: \"list\" };\nconst COLUMNS_FIELD: FieldSchema = { name: \"columns\", title: \"Columns\", type: \"table\", icon: \"layout-columns\" };\nconst noop = () => undefined;\nconst colSummary = (c: TableColumn) =>\n [TYPE_UI[c.type].label, c.type === \"number\" ? c.unit : c.type === \"money\" ? c.currency ?? \"USD\" : c.type === \"rating\" ? `out of ${c.max ?? 5}` : undefined].filter(Boolean).join(\" · \");\n/** D52: the whole table is ONE group, shown the way every nested group is shown: a single 1px inset line on the left. */\nconst TABLE_GROUP = \"ml-1.5 border-l border-kit-line pl-3\";\n/** A sub-part of the table field: the same label style as every field label (13/500, fg-2; fg while focus is inside). */\nconst PART_LABEL = \"text-kit-sm font-medium text-kit-fg-2 transition-colors group-focus-within/part:text-kit-fg\";\n\n/** CPO D52: the settings a table kind offers, with their defaults (schema/table.ts › TableSettingsOptions). */\nconst PHONES: { value: TableResponsive; label: string }[] = [\n { value: \"scroll\", label: \"Scroll\" },\n { value: \"stack\", label: \"Stack\" },\n { value: \"cards\", label: \"Cards\" },\n];\nexport function offered(options: TableFieldOptions) {\n const s = options.settings ?? {};\n const phones = PHONES.filter((p) => !s.phones || s.phones.includes(p.value));\n return {\n headers: s.headers !== false,\n totals: s.totals !== false,\n phones: phones.length > 1 ? phones : [],\n highlight: s.highlight !== false,\n sticky: s.sticky !== false,\n sort: !!s.sort,\n search: !!s.search,\n jsonLd: (options.jsonLd ?? []).filter((x) => x !== \"none\"),\n groups: options.allowGroups !== false,\n footnotes: options.allowFootnotes !== false,\n note: options.allowNote !== false,\n };\n}\n\n/** Unlink a footnote from one cell; the footnote itself goes when no other cell points at it. */\nexport function unlinkNote(t: TableValue, rowKey: string, colKey: string): TableValue {\n let note: string | undefined;\n const rows = t.rows.map((r) => {\n if (r._key !== rowKey) return r;\n const c = r.cells[colKey];\n if (!isCellObject(c) || !c.note) return r;\n note = c.note;\n return { ...r, cells: { ...r.cells, [colKey]: c.type ? { value: c.value, type: c.type } : c.value } };\n });\n if (!note) return t;\n const used = rows.some((r) => Object.values(r.cells).some((c) => isCellObject(c) && c.note === note));\n return { ...t, rows, footnotes: used ? t.footnotes : (t.footnotes ?? []).filter((f) => f._key !== note) };\n}\n/** Link a new, empty footnote to one cell. Returns the table and the footnote's key (its input takes focus). */\nexport function linkNote(t: TableValue, rowKey: string, colKey: string): [TableValue, string] {\n const f = { _key: tkey(\"f\"), text: \"\" };\n return [\n {\n ...t,\n footnotes: [...(t.footnotes ?? []), f],\n rows: t.rows.map((r) => {\n if (r._key !== rowKey) return r;\n const c = r.cells[colKey];\n const own = isCellObject(c) ? c.type : undefined;\n return { ...r, cells: { ...r.cells, [colKey]: { value: cellValue(c), ...(own ? { type: own } : {}), note: f._key } } };\n }),\n },\n f._key,\n ];\n}\nconst focusSoon = (selector: string) => requestAnimationFrame(() => document.querySelector<HTMLElement>(selector)?.focus());\n\ntype Open = { kind: \"rows\" | \"columns\"; key: string } | null;\n\nfunction TableBody({ ctx, label, nav, head }: { ctx: Ctx; label?: string; nav?: TableNav; head: React.ReactNode }) {\n const { t, set, readOnly, options } = ctx;\n const [open, setOpen] = React.useState<Open>(null);\n const host = React.useRef<HTMLDivElement>(null);\n const localId = React.useId();\n const id = nav?.id ?? localId;\n const focusRow = (key: string) => host.current?.querySelector<HTMLElement>(`[data-row-open=\"${CSS.escape(key)}\"]`)?.focus({ preventScroll: false });\n // coming back from a row (Esc, ←, or a crumb): focus returns to that row, after the form has placed its own focus\n React.useEffect(() => {\n if (open || !returnTo.has(id)) return;\n const raf = requestAnimationFrame(() => {\n const key = returnTo.get(id);\n returnTo.delete(id);\n const a = document.activeElement;\n if (key && (!a || a === document.body || a.matches(\"[data-frame-body]\") || host.current?.contains(a) || !a.isConnected)) focusRow(key);\n });\n return () => cancelAnimationFrame(raf);\n }, [open, id]);\n const go = (kind: \"rows\" | \"columns\", index: number, key: string) => {\n returnTo.set(id, key);\n if (nav) window.setTimeout(() => nav.open(kind, index), 0);\n else setOpen({ kind, key });\n };\n const list = open ? (open.kind === \"rows\" ? t.rows : t.columns) : [];\n const at = open ? list.findIndex((x) => x._key === open.key) : -1;\n if (open && at >= 0)\n return (\n <div className={TABLE_GROUP}>\n <LocalDrill ctx={ctx} label={label} open={open} index={at} onBack={() => setOpen(null)} onGo={(key) => setOpen({ kind: open.kind, key })} />\n </div>\n );\n const base = nav?.basePath ?? [];\n const titleId = `${id}-title`;\n const noteId = `${id}-note`;\n return (\n // mb-2: the collapsed Table settings ends the field, so the next field starts a section's distance away (24px)\n <div ref={host} role=\"group\" aria-label={label || \"Table\"} className={cn(TABLE_GROUP, \"flex flex-col gap-4 @max-[360px]:gap-3\", !readOnly && \"mb-2\")}>\n <div className=\"group/part flex flex-col gap-1.5\">\n <div className=\"flex min-h-5 items-center gap-1.5\">\n <label htmlFor={titleId} className={PART_LABEL}>Title</label>\n {options.requireCaption !== false && !t.caption.trim() ? <span className=\"text-kit-xs text-kit-fg-3\">Required</span> : null}\n <span className=\"flex-1\" />\n {head}\n </div>\n <Textarea id={titleId} rows={1} maxLength={300} value={t.caption} readOnly={readOnly} placeholder=\"What the table shows\" onChange={(e) => set({ ...t, caption: e.target.value.replace(/\\n/g, \" \") })} className=\"min-h-8 resize-none py-1.5\" />\n </div>\n <ColumnsPart ctx={ctx} basePath={base} onOpen={(i, key) => go(\"columns\", i, key)} />\n <RowsPart ctx={ctx} basePath={base} onOpen={(i, key) => go(\"rows\", i, key)} />\n {offered(options).note ? (\n <div className=\"group/part flex flex-col gap-1.5\">\n <label htmlFor={noteId} className={PART_LABEL}>Note under the table</label>\n <Textarea id={noteId} rows={2} maxLength={2000} value={t.notes ?? \"\"} readOnly={readOnly} placeholder=\"Source: our own tests, September 2026.\" onChange={(e) => set({ ...t, notes: e.target.value || undefined })} />\n </div>\n ) : null}\n {readOnly ? null : <TableSettings ctx={ctx} />}\n </div>\n );\n}\n\n/** Columns: an array list like any other (type icon, name, \"Yes / No\" summary, ⋯, ›). */\nfunction ColumnsPart({ ctx, basePath, onOpen }: { ctx: Ctx; basePath: FieldPath; onOpen: (index: number, key: string) => void }) {\n const { t, set, lock, options } = ctx;\n const n = t.columns.length;\n const atMax = !!options.maxColumns && n >= options.maxColumns;\n const write = (columns: TableColumn[]) => set({ ...t, columns });\n const add = () => {\n if (atMax) return;\n const col: TableColumn = { _key: tkey(\"c\"), label: \"\", type: \"text\" };\n write([...t.columns, col]);\n onOpen(n, col._key);\n };\n const ops = {\n atMax,\n atMin: n <= 1,\n add,\n duplicate: (i: number) => !atMax && set(copyColumn(t, i)),\n move: (i: number, d: -1 | 1) => i + d >= 0 && i + d < n && write(moveItem(t.columns, i, i + d)),\n reorder: (from: number, to: number) => write(moveItem(t.columns, from, to)),\n remove: (i: number, title: string) => {\n if (n <= 1) return;\n const prev = t;\n set(dropColumn(t, t.columns[i]._key));\n ctx.undoable(`“${title}” removed`, prev);\n },\n insertBlank: noop,\n };\n const rows: RowModel[] = t.columns.map((c, i) => ({\n id: c._key,\n index: i,\n item: c,\n path: [...basePath, \"columns\", i],\n preview: { title: c.label || \"Untitled column\", subtitle: colSummary(c), empty: !c.label },\n }));\n return (\n <div role=\"group\" aria-label=\"Columns\" className=\"group/part flex flex-col gap-1.5\">\n <span className={PART_LABEL}>Columns</span>\n <RowList\n field={{ ...COLUMNS_FIELD, validation: { min: 1 } }}\n rows={rows}\n readOnly={lock}\n layout=\"list\"\n mode=\"drill\"\n openId={null}\n onOpen={(r) => onOpen(r.index, r.id)}\n onCloseInline={noop}\n ops={ops as unknown as ListOps}\n renderInline={() => null}\n emptyLabel=\"No columns yet.\"\n leading={(r) => (\n <span className=\"flex size-7 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2\">\n <TypeIcon type={(r.item as TableColumn).type} className=\"size-4 text-kit-fg-2\" />\n </span>\n )}\n addButton={\n <Button size=\"sm\" variant=\"ghost\" className=\"text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={atMax} onClick={add}>\n {atMax ? `Add column · ${options.maxColumns} at most` : \"Add column\"}\n </Button>\n }\n />\n </div>\n );\n}\n\n/**\n * Rows (D52): groups live in the row list itself. Loose rows first, then each group under a heading you rename in place\n * (its ⋯ moves or removes it), then Totals. \"Add group\" sits next to the last \"Add row\"; a row changes group by its ⋯ ›\n * Move to group. Every list is the kit's array row list; drag (and ↑/↓ on the grip) reorders inside a group.\n */\nfunction RowsPart({ ctx, basePath, onOpen }: { ctx: Ctx; basePath: FieldPath; onOpen: (index: number, key: string) => void }) {\n const { t, set, resolveRef, readOnly, options } = ctx;\n const can = offered(options);\n const groups = can.groups ? t.rowGroups ?? [] : [];\n const known = new Set(groups.map((g) => g._key));\n const body = t.rows.filter((r) => !r.footer);\n type Run = { key: string; group?: TableGroup; totals?: boolean; items: TableRow[] };\n const runs: Run[] = [];\n const loose = body.filter((r) => !r.group || !known.has(r.group));\n if (loose.length || !groups.length) runs.push({ key: \"loose\", items: loose });\n groups.forEach((g) => runs.push({ key: g._key, group: g, items: body.filter((r) => r.group === g._key) }));\n const foot = t.rows.filter((r) => r.footer);\n if (foot.length) runs.push({ key: \"totals\", totals: true, items: foot });\n const lastBody = runs.filter((r) => !r.totals).length - 1;\n const atMax = !!options.maxRows && body.length >= options.maxRows;\n // a row keeps a group key the field does not show (groups turned off) instead of losing it on a reorder\n const place = (r: Run, x: TableRow) => clean({ ...x, group: r.group?._key ?? (r.key === \"loose\" && x.group && !known.has(x.group) ? x.group : undefined), footer: r.totals || undefined });\n const writeRuns = (next: Run[]) => set({ ...t, rows: next.flatMap((r) => r.items.map((x) => place(r, x))) });\n const writeRun = (ri: number, items: TableRow[]) => writeRuns(runs.map((r, j) => (j === ri ? { ...r, items } : r)));\n const add = (ri: number) => {\n if (atMax && !runs[ri].totals) return;\n const run = runs[ri];\n const row = place(run, { _key: tkey(\"r\"), cells: {} });\n const rows = runs.flatMap((r, j) => (j === ri ? [...r.items.map((x) => place(r, x)), row] : r.items.map((x) => place(r, x))));\n set({ ...t, rows });\n onOpen(rows.indexOf(row), row._key);\n };\n const addGroup = () => {\n const g = { _key: tkey(\"rg\"), label: \"\" };\n set({ ...t, rowGroups: [...(t.rowGroups ?? []), g] });\n focusSoon(`[data-group-name=\"${g._key}\"]`);\n };\n const placeName = (k: string) => (k === \"totals\" ? \"Totals\" : k === \"loose\" ? \"No group\" : groups.find((g) => g._key === k)?.label || \"Untitled group\");\n /** Move a row to the end of another run (a group, no group, or Totals). */\n const moveTo = (row: TableRow, target: { group?: string; totals?: boolean }) => {\n const prev = t;\n const rest = t.rows.filter((r) => r._key !== row._key);\n set({ ...t, rows: [...rest, clean({ ...row, group: target.totals ? undefined : target.group, footer: target.totals || undefined })] });\n ctx.undoable(`Moved to ${placeName(target.totals ? \"totals\" : target.group ?? \"loose\")}`, prev);\n };\n const opsFor = (ri: number) => {\n const items = runs[ri].items;\n const runMax = atMax && !runs[ri].totals;\n return {\n atMax: runMax,\n atMin: false,\n add: () => add(ri),\n duplicate: (i: number) => !runMax && writeRun(ri, [...items.slice(0, i + 1), { ...items[i], _key: tkey(\"r\"), cells: { ...items[i].cells } }, ...items.slice(i + 1)]),\n move: (i: number, d: -1 | 1) => i + d >= 0 && i + d < items.length && writeRun(ri, moveItem(items, i, i + d)),\n reorder: (from: number, to: number) => writeRun(ri, moveItem(items, from, to)),\n remove: (i: number, title: string) => {\n const prev = t;\n writeRun(ri, items.filter((_, j) => j !== i));\n ctx.undoable(`“${title}” removed`, prev);\n },\n insertBlank: noop,\n };\n };\n const sub = (r: TableRow) =>\n t.columns\n .slice(1, 3)\n .map((c) => {\n const s = cellText(c, r, r.cells[c._key], resolveRef);\n return s ? `${c.label || \"Untitled\"}: ${s}` : \"\";\n })\n .filter(Boolean)\n .join(\" · \");\n const model = (row: TableRow, i: number): RowModel => {\n const named = hasName(t, row);\n return {\n id: row._key,\n index: i,\n item: row,\n path: [...basePath, \"rows\", t.rows.indexOf(row)],\n preview: { title: named ? rowTitle(t, row, i, resolveRef) : \"Untitled row\", subtitle: sub(row) || undefined, empty: !named },\n };\n };\n // \"Move to group\" in a row's ⋯: every other place the row could live\n const moveMenu = (r: RowModel) => {\n const row = r.item as TableRow;\n const here = row.footer ? \"totals\" : row.group && known.has(row.group) ? row.group : \"\";\n const places = [\n ...(groups.length ? [{ value: \"\", label: \"No group\" }] : []),\n ...groups.map((g) => ({ value: g._key, label: g.label || \"Untitled group\" })),\n ...(can.totals && (foot.length || groups.length) ? [{ value: \"totals\", label: \"Totals\" }] : []),\n ];\n if (!places.some((p) => p.value !== here)) return null;\n return (\n <MenuSub>\n <MenuSubTrigger icon={<IconFolder stroke={1.5} />}>Move to group</MenuSubTrigger>\n <MenuSubContent className=\"min-w-44\">\n <MenuRadioGroup value={here} onValueChange={(v) => v !== here && moveTo(row, v === \"totals\" ? { totals: true } : { group: (v as string) || undefined })}>\n {places.map((p) => (\n <MenuRadioItem key={p.value || \"none\"} value={p.value}>{p.label}</MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuSubContent>\n </MenuSub>\n );\n };\n // only a row that has values but no name is a problem; a fresh empty row is just unfinished\n // V2 sorts every run inside ONE DndContext: one set of drag instructions and one live region, after the runs\n const sharedSort = useSharedSort();\n const unnamed = t.rows.find((r) => !hasName(t, r) && t.columns.slice(1).some((c) => !isEmptyCell(cellValue(r.cells[c._key]))));\n const addRowButton = (ri: number) => (\n <Button size=\"sm\" variant=\"ghost\" className=\"text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={atMax && !runs[ri].totals} onClick={() => add(ri)}>\n {atMax && !runs[ri].totals ? `Add row · ${options.maxRows} at most` : \"Add row\"}\n </Button>\n );\n return (\n <div role=\"group\" aria-label=\"Rows\" className=\"group/part flex flex-col gap-1.5\">\n <span className={PART_LABEL}>Rows</span>\n {unnamed && !readOnly ? (\n <button type=\"button\" onClick={() => onOpen(t.rows.indexOf(unnamed), unnamed._key)} className=\"self-start text-left text-kit-xs text-kit-warning-fg underline-offset-2 hover:underline\">\n A row has values but no name. Open it\n </button>\n ) : null}\n <SharedSortProvider value={sharedSort.value}>\n <div className=\"flex flex-col gap-3\">\n {runs.map((run, ri) => {\n const list = (\n <RowList\n field={ROWS_FIELD}\n rows={run.items.map(model)}\n readOnly={readOnly}\n layout=\"list\"\n mode=\"drill\"\n openId={null}\n onOpen={(r) => onOpen(t.rows.indexOf(r.item as TableRow), r.id)}\n onCloseInline={noop}\n ops={opsFor(ri) as unknown as ListOps}\n renderInline={() => null}\n menuExtra={moveMenu}\n emptyLabel={run.totals ? \"No totals yet.\" : run.group ? \"No rows in this group yet.\" : \"No rows yet.\"}\n addButton={\n ri === lastBody && can.groups ? (\n <span className=\"flex flex-wrap items-center gap-1\">\n {addRowButton(ri)}\n <Button size=\"sm\" variant=\"ghost\" className=\"text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} onClick={addGroup}>\n Add group\n </Button>\n </span>\n ) : (\n addRowButton(ri)\n )\n }\n />\n );\n if (!run.group && !run.totals) return <div key={run.key}>{list}</div>;\n return (\n <div key={run.key} role=\"group\" aria-label={run.totals ? \"Totals\" : run.group!.label || \"Untitled group\"} className=\"flex flex-col gap-1.5\">\n {/* V2 table-editor.tsx:1352 HeadingDrop's box (there a drop target; the kit's sort has no heading drop) */}\n <div className=\"rounded-kit-md transition-colors\">\n {run.totals ? (\n <span className=\"flex h-7 items-center px-0.5 text-kit-sm font-medium text-kit-fg-2\">Totals</span>\n ) : (\n <GroupHeading ctx={ctx} group={run.group!} index={groups.indexOf(run.group!)} count={groups.length} rows={run.items.length} />\n )}\n </div>\n <div className=\"ml-1.5 border-l border-kit-line pl-3\">{list}</div>\n </div>\n );\n })}\n </div>\n </SharedSortProvider>\n {sharedSort.a11y}\n </div>\n );\n}\n\n/** A row group's heading, renamed in place. It reads as a label at rest; its ⋯ moves or removes the group. */\nfunction GroupHeading({ ctx, group, index, count, rows }: { ctx: Ctx; group: TableGroup; index: number; count: number; rows: number }) {\n const { t, set, readOnly } = ctx;\n const [draft, setDraft] = React.useState(group.label);\n // a rename elsewhere (undo, another save) replaces the draft\n const [seen, setSeen] = React.useState(group.label);\n if (seen !== group.label) {\n setSeen(group.label);\n setDraft(group.label);\n }\n const rename = (label: string) => label !== group.label && set({ ...t, rowGroups: (t.rowGroups ?? []).map((g) => (g._key === group._key ? { ...g, label } : g)) });\n const moveGroup = (d: -1 | 1) => set({ ...t, rowGroups: moveItem(t.rowGroups ?? [], index, index + d) });\n const remove = () => {\n const prev = t;\n set({ ...t, rowGroups: (t.rowGroups ?? []).filter((g) => g._key !== group._key), rows: t.rows.map((r) => (r.group === group._key ? clean({ ...r, group: undefined }) : r)) });\n ctx.undoable(`“${group.label || \"Untitled group\"}” removed`, prev, rows ? `Its ${rows === 1 ? \"row stays\" : `${rows} rows stay`} in the table.` : undefined);\n };\n return (\n <div className=\"group/gh flex min-w-0 items-center gap-1\">\n <input\n data-group-name={group._key}\n value={draft}\n readOnly={readOnly}\n maxLength={300}\n placeholder=\"Group name\"\n aria-label=\"Group name\"\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => rename(draft.replace(/\\s+/g, \" \").trim())}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { e.preventDefault(); e.currentTarget.blur(); }\n else if (e.key === \"Escape\" && draft !== group.label) { e.preventDefault(); e.stopPropagation(); setDraft(group.label); }\n }}\n className=\"-mx-0.5 h-7 min-w-0 flex-1 truncate rounded-kit-md bg-transparent px-0.5 text-[13px] font-medium text-kit-fg-2 outline-none transition-colors placeholder:font-normal placeholder:text-kit-fg-4 hover:bg-kit-hover focus:bg-kit-surface focus:px-2 focus:text-kit-fg focus:shadow-[inset_0_0_0_1px_var(--kit-line-strong)]\"\n />\n {readOnly ? null : (\n <Menu>\n <MenuTrigger\n render={\n <IconButton\n size=\"xs\"\n label={`Options for ${group.label || \"this group\"}`}\n className=\"opacity-0 focus-visible:opacity-100 group-hover/gh:opacity-100 group-focus-within/gh:opacity-100 data-[popup-open]:opacity-100 [@media(pointer:coarse)]:opacity-100\"\n />\n }\n >\n <IconDots stroke={1.5} />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"min-w-44\">\n <MenuItem icon={<IconArrowUp stroke={1.5} />} disabled={index === 0} onClick={() => moveGroup(-1)}>Move up</MenuItem>\n <MenuItem icon={<IconArrowDown stroke={1.5} />} disabled={index >= count - 1} onClick={() => moveGroup(1)}>Move down</MenuItem>\n <MenuSeparator />\n <MenuItem danger onClick={remove}>Remove group</MenuItem>\n </MenuContent>\n </Menu>\n )}\n </div>\n );\n}\n\n/**\n * Height of the sticky bars pinned above a table in its scroll area: the rich-text editor publishes\n * --rt-sticky-top (field tabs + its toolbar), a kit form --kit-sticky-top (field tabs).\n */\nconst STICKY_TOP = \"var(--rt-sticky-top, var(--kit-sticky-top, 0px))\";\n/** Scroll only the nearest scroll area (never the shell) so `el`'s top clears the sticky bars (its scroll-margin-top). */\nfunction revealBelowStickies(el: HTMLElement | null) {\n if (!el) return;\n let area = el.parentElement;\n while (area && !/(auto|scroll)/.test(getComputedStyle(area).overflowY)) area = area.parentElement;\n const top = area ? area.getBoundingClientRect().top : 0;\n const hidden = top + (parseFloat(getComputedStyle(el).scrollMarginTop) || 0) - el.getBoundingClientRect().top;\n if (hidden > 1) (area ?? document.scrollingElement)?.scrollBy?.({ top: -hidden });\n}\n\n/** Tables outside a kit form (the /style-guide/kit sandbox, demos): the same drill, with the same breadcrumb and header. */\nfunction LocalDrill({ ctx, label, open, index, onBack, onGo }: { ctx: Ctx; label?: string; open: NonNullable<Open>; index: number; onBack: () => void; onGo: (key: string) => void }) {\n const { t, resolveRef } = ctx;\n const rows = open.kind === \"rows\";\n const list = rows ? t.rows : t.columns;\n const titleAt = (i: number) => (rows ? (hasName(t, t.rows[i]) ? rowTitle(t, t.rows[i], i, resolveRef) : \"Untitled row\") : t.columns[i].label || \"Untitled column\");\n const row = rows ? t.rows[index] : undefined;\n const group = row?.group && !row.footer ? t.rowGroups?.find((g) => g._key === row.group) : undefined;\n const title = titleAt(index);\n const noun = rows ? \"row\" : \"column\";\n const rootRef = React.useRef<HTMLDivElement>(null);\n const headRef = React.useRef<HTMLDivElement>(null);\n React.useLayoutEffect(() => {\n headRef.current?.focus({ preventScroll: true });\n // the drill takes the table's place, whose top was often scrolled away; bring its head out from under the sticky bars\n const raf = requestAnimationFrame(() => revealBelowStickies(rootRef.current));\n return () => cancelAnimationFrame(raf);\n }, [index]);\n const step = (d: -1 | 1) => list[index + d] && onGo(list[index + d]._key);\n return (\n <div\n ref={rootRef}\n className=\"flex flex-col gap-4\"\n style={{ scrollMarginTop: `calc(${STICKY_TOP} + 8px)` }}\n onKeyDown={(e) => e.key === \"Escape\" && !e.defaultPrevented && (e.preventDefault(), onBack())}\n >\n <div className=\"sticky z-[2] -my-1 bg-kit-surface py-1\" style={{ top: STICKY_TOP }}>\n <PathCrumbs\n size=\"sm\"\n label=\"Table path\"\n items={[\n { id: \"table\", label: label || \"Table\", icon: <IconTable />, onSelect: onBack },\n ...(group ? [{ id: \"group\", label: group.label || \"Untitled group\", icon: <IconFolder />, onSelect: onBack }] : []),\n { id: \"current\", label: title, icon: rows ? <IconList /> : <IconLayoutColumns /> },\n ]}\n />\n </div>\n <div ref={headRef} tabIndex={-1} className=\"flex items-start gap-2.5 outline-none\">\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-kit-base font-semibold leading-6 text-kit-fg\">{title}</h2>\n <p className=\"truncate text-kit-xs leading-4 text-kit-fg-3\">{`${rows ? \"Row\" : \"Column\"} ${index + 1} of ${list.length} in ${label || \"the table\"}`}</p>\n </div>\n <div className=\"-mr-1 flex shrink-0 items-center gap-0.5 pt-0.5\">\n <IconButton size=\"sm\" label={index > 0 ? `Previous ${noun}: ${titleAt(index - 1)}` : `First ${noun}`} disabled={index === 0} onClick={() => step(-1)}>\n <IconArrowUp stroke={1.5} />\n </IconButton>\n <IconButton size=\"sm\" label={index < list.length - 1 ? `Next ${noun}: ${titleAt(index + 1)}` : `Last ${noun}`} disabled={index >= list.length - 1} onClick={() => step(1)}>\n <IconArrowDown stroke={1.5} />\n </IconButton>\n </div>\n </div>\n {rows ? <RowFields ctx={ctx} row={t.rows[index]} /> : <ColumnFields ctx={ctx} col={t.columns[index]} />}\n </div>\n );\n}\n\n/* ── A row's cells: one field per column, the column's type decides the control ── */\nfunction RowFields({ ctx, row }: { ctx: Ctx; row: TableRow }) {\n const { t, edit, readOnly, options } = ctx;\n const write = (col: TableColumn, next: TableCell | undefined) => edit(mapRow(row._key, (x) => ({ ...x, cells: { ...x.cells, [col._key]: next ?? null } })));\n const named = hasName(t, row);\n return (\n <div className=\"flex flex-col gap-4\">\n {t.columns.map((col, ci) => (\n <CellField key={col._key} ctx={ctx} row={row} col={col} ci={ci} needsName={ci === 0 && !named} onWrite={(c) => write(col, c)} />\n ))}\n {readOnly || !offered(options).highlight ? null : (\n <SwitchRow label=\"Highlight this row\" checked={!!row.highlight} onChange={(v) => edit(mapRow(row._key, (x) => clean({ ...x, highlight: v })))} />\n )}\n </div>\n );\n}\n\n/**\n * One cell as a field. Per-cell exceptions are quiet: a ⋯ by the label (shown on hover or focus) offers \"Write words\n * instead\" for a typed column, a footnote and Clear. A footnote is written right here, under the cell (D52).\n */\nfunction CellField({ ctx, row, col, ci, needsName, onWrite }: { ctx: Ctx; row: TableRow; col: TableColumn; ci: number; needsName: boolean; onWrite: (c: TableCell | undefined) => void }) {\n const { t, set, resolveRef, readOnly, options } = ctx;\n const cell = row.cells[col._key];\n const declared = cellType(col, row, cell);\n const v = cellValue(cell);\n // words sitting in a Yes / No cell (older or imported data) are edited as words, never hidden\n const ty: TableColumnType = declared === \"boolean\" && !isEmptyCell(v) && toBool(v) == null ? \"text\" : declared;\n const colType = row.type ?? col.type;\n const asWords = ty === \"text\" && colType !== \"text\";\n const note = cellNote(cell);\n const fn = note ? (t.footnotes ?? []).find((f) => f._key === note) : undefined;\n const fi = fn ? (t.footnotes ?? []).indexOf(fn) : -1;\n const id = `${row._key}-${col._key}`;\n const name = col.label || `Column ${ci + 1}`;\n const canWords = !readOnly && colType !== \"text\" && colType !== \"reference\" && colType !== \"richtext-inline\";\n const canNote = !readOnly && offered(options).footnotes;\n const setWords = (on: boolean) => {\n const raw = cellText(col, row, cell, resolveRef);\n const type = on ? (\"text\" as const) : undefined;\n const value = coerce(raw, { type: type ?? colType, max: col.max });\n onWrite(type || note ? { value, ...(type ? { type } : {}), ...(note ? { note } : {}) } : value);\n };\n const addNote = () => {\n const [next, key] = linkNote(t, row._key, col._key);\n set(next);\n focusSoon(`[data-footnote=\"${key}\"]`);\n };\n const b = toBool(v);\n let control: React.ReactNode;\n if (ty === \"boolean\") {\n control = (\n // a <label> like V2; the switch is still named by its column (aria-labelledby beats the wrapping label)\n <label className=\"flex h-8 items-center gap-2.5\">\n <Switch id={id} size=\"sm\" aria-labelledby={`${id}-name`} aria-describedby={`${id}-says`} disabled={readOnly} checked={b === true} onCheckedChange={(x) => onWrite(withValue(cell, x))} />\n <span id={`${id}-says`} className={cn(\"text-kit-sm\", b == null ? \"text-kit-fg-4\" : \"text-kit-fg-2\")}>{b == null ? \"Not set\" : b ? boolLabels(col).yes : boolLabels(col).no}</span>\n </label>\n );\n } else if (ty === \"reference\") {\n control = (\n <div className=\"rounded-kit-md border border-kit-field-border bg-kit-field-bg\">\n <RefCell ctx={ctx} cell={cell} col={col} cellId={id} name={name} onWrite={onWrite} onMove={noop} />\n </div>\n );\n } else if (ty === \"link\") {\n const l: TableLink = isObjLike(v) && !(\"ref\" in v) ? (v as TableLink) : { label: typeof v === \"string\" ? v : \"\", href: \"\" };\n const inputCls = \"h-9 w-full min-w-0 bg-transparent px-2 text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-4\";\n // founder rule: a label and its link are one unit; the link row is the global link field (D57), as in V2\n control = (\n <FieldUnit>\n <FieldUnitRow>\n <input id={id} className={inputCls} readOnly={readOnly} defaultValue={l.label} key={`l${l.label}`} placeholder=\"Link text\" aria-label={`${name} link text`} onBlur={(e) => e.target.value !== l.label && onWrite(withValue(cell, { ...l, label: e.target.value }))} />\n </FieldUnitRow>\n <FieldUnitRow>\n <LinkField\n aria-label={`${name} link`}\n value={tableLinkValue(l)}\n readOnly={readOnly}\n className=\"border-0 bg-transparent shadow-none\"\n onChange={(n) => {\n const o = n && typeof n === \"object\" ? n : null;\n // BE TableLink keeps only { label, href, newTab?, rel? }; a script address is refused (the field names why)\n if (o && isScriptHref(hrefOf(o))) return;\n onWrite(withValue(cell, o ? tableLink(l.label || linkText(o), hrefOf(o), o.newTab, o.rel) : { label: l.label, href: \"\" }));\n }}\n />\n </FieldUnitRow>\n </FieldUnit>\n );\n } else {\n control = (\n <FormText\n id={id}\n readOnly={readOnly}\n autoFocus={needsName}\n value={isEmptyCell(v) ? \"\" : NUMERIC.includes(ty) ? String(toNumber(v) ?? cellText(col, row, cell)) : ty === \"richtext-inline\" ? String(v) : cellText(col, row, cell, resolveRef)}\n suffix={ty === \"number\" ? col.unit : ty === \"money\" ? col.currency ?? \"USD\" : ty === \"rating\" ? `/ ${col.max ?? 5}` : undefined}\n numeric={NUMERIC.includes(ty)}\n onCommit={(raw) => onWrite(typedCell(cell, col, row, raw))}\n />\n );\n }\n return (\n <div className=\"group/cell flex min-w-0 flex-col gap-1.5\">\n <div className=\"flex min-h-5 min-w-0 items-center gap-1.5\">\n <label id={`${id}-name`} htmlFor={id} className=\"truncate text-kit-sm font-medium text-kit-fg-2 transition-colors group-focus-within/cell:text-kit-fg\">{name}</label>\n {needsName ? <span className=\"shrink-0 text-kit-xs text-kit-warning-fg\">Needs a name</span> : null}\n <span className=\"flex-1\" />\n {canWords || canNote || (!readOnly && !isEmptyCell(v)) ? (\n <Menu>\n <MenuTrigger\n render={\n <IconButton\n size=\"xs\"\n label={`Options for ${name}`}\n className=\"-my-1 opacity-0 focus-visible:opacity-100 group-hover/cell:opacity-100 group-focus-within/cell:opacity-100 data-[popup-open]:opacity-100 [@media(pointer:coarse)]:opacity-100\"\n />\n }\n >\n <IconDots stroke={1.5} />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"min-w-52\">\n {canWords ? <MenuItem onClick={() => setWords(!asWords)}>{asWords ? `Use ${TYPE_UI[colType].label} like the column` : \"Write words instead\"}</MenuItem> : null}\n {canNote ? note ? <MenuItem onClick={() => set(unlinkNote(t, row._key, col._key))}>Remove footnote</MenuItem> : <MenuItem onClick={addNote}>Add a footnote</MenuItem> : null}\n {!isEmptyCell(v) ? (\n <>\n {canWords || canNote ? <MenuSeparator /> : null}\n <MenuItem onClick={() => onWrite(withValue(cell, null))}>Clear</MenuItem>\n </>\n ) : null}\n </MenuContent>\n </Menu>\n ) : null}\n </div>\n {control}\n {fn ? (\n <div className=\"flex items-center gap-2\">\n <span className=\"shrink-0 text-kit-xs text-kit-fg-3\">Footnote {fi + 1}</span>\n <Input\n size=\"sm\"\n data-footnote={fn._key}\n value={fn.text}\n readOnly={readOnly}\n maxLength={2000}\n placeholder=\"What the footnote says\"\n aria-label={`${name}: footnote ${fi + 1}`}\n onChange={(e) => set({ ...t, footnotes: (t.footnotes ?? []).map((x) => (x._key === fn._key ? { ...x, text: e.target.value } : x)) })}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction SwitchRow({ label, checked, onChange, disabled }: { label: string; checked: boolean; onChange: (v: boolean) => void; disabled?: boolean }) {\n return (\n // a <label> like V2 (the panel walk reads it as the row's label); the switch's own aria-label names it, so it is read once\n <label className=\"flex min-h-8 items-center justify-between gap-2 text-kit-sm text-kit-fg-2\">\n {label}\n <Switch size=\"sm\" checked={checked} disabled={disabled} onCheckedChange={onChange} aria-label={label} />\n </label>\n );\n}\n\n/* ── A column: name, type and format. The type lives here, so every cell in it gets the right control. ── */\nfunction ColumnFields({ ctx, col }: { ctx: Ctx; col: TableColumn }) {\n const { t, set, lock, types, readOnly } = ctx;\n const id = React.useId();\n const patch = (p: Partial<TableColumn>) => set({ ...t, columns: t.columns.map((c) => (c._key === col._key ? withPatch(c, p) : c)) });\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor={id} className=\"text-kit-sm font-medium text-kit-fg-2\">Name</label>\n <Input id={id} size=\"sm\" autoFocus={!col.label && !lock} readOnly={lock} maxLength={300} value={col.label} placeholder=\"Column name\" onChange={(e) => patch({ label: e.target.value })} />\n {lock && !readOnly ? <span className=\"text-kit-2xs leading-4 text-kit-fg-3\">This table's columns are set by its developer.</span> : null}\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-kit-sm font-medium text-kit-fg-2\">Type</span>\n {lock ? (\n <span className=\"flex h-8 items-center gap-2 text-kit-sm text-kit-fg-2\"><TypeIcon type={col.type} className=\"text-kit-fg-2\" />{TYPE_UI[col.type].label}</span>\n ) : (\n <Menu>\n <MenuTrigger render={<Button size=\"sm\" variant=\"secondary\" className=\"justify-between\" leftIcon={<TypeIcon type={col.type} className=\"text-kit-fg-2\" />} rightIcon={<IconChevronDown stroke={1.5} />} />}>\n <span className=\"flex-1 text-left\">{TYPE_UI[col.type].label}</span>\n </MenuTrigger>\n <MenuContent align=\"start\" className=\"min-w-52\">\n <MenuRadioGroup value={col.type} onValueChange={(v) => ctx.edit((x) => retype(x, col._key, v as TableColumnType, ctx.resolveRef))}>\n {(types.includes(col.type) ? types : [...types, col.type]).map((ty) => (\n <MenuRadioItem key={ty} value={ty}>\n <span className=\"flex items-center gap-2\"><TypeIcon type={ty} className=\"text-kit-fg-2\" />{TYPE_UI[ty].label}</span>\n </MenuRadioItem>\n ))}\n </MenuRadioGroup>\n </MenuContent>\n </Menu>\n )}\n </div>\n <ColumnDetails col={col} onPatch={patch} compact={false} readOnly={lock} />\n </div>\n );\n}\n\nfunction FormText({ id, value, onCommit, suffix, numeric, readOnly, autoFocus }: { id: string; value: string; onCommit: (v: string) => void; suffix?: string; numeric?: boolean; readOnly?: boolean; autoFocus?: boolean }) {\n const [draft, setDraft] = React.useState(value);\n const [seen, setSeen] = React.useState(value);\n if (seen !== value) {\n setSeen(value);\n setDraft(value);\n }\n return (\n <div className=\"relative\">\n <Textarea\n id={id}\n rows={1}\n value={draft}\n readOnly={readOnly}\n autoFocus={autoFocus}\n maxLength={5000}\n inputMode={numeric ? \"decimal\" : undefined}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => draft !== value && onCommit(draft)}\n className={cn(\"min-h-8 resize-none py-1.5\", suffix && \"pr-12\")}\n />\n {suffix ? <span className=\"pointer-events-none absolute right-2.5 top-1.5 text-kit-xs text-kit-fg-3\">{suffix}</span> : null}\n </div>\n );\n}\n\n/* ── Table settings (D52): only presentation and structure, only what this table kind offers ── */\nconst SEARCH: { value: TableJsonLdType; label: string }[] = [\n { value: \"none\", label: \"Nothing special\" },\n { value: \"ItemList\", label: \"A comparison\" },\n { value: \"Dataset\", label: \"A data report\" },\n { value: \"Offers\", label: \"A price list\" },\n];\nconst NO_COLUMN = \"__none\";\n/** Totals on: an empty totals row appears at the end of the list. Off: empty totals rows go, filled ones rejoin the body. */\nexport function setTotals(t: TableValue, on: boolean): TableValue {\n if (on) return t.rows.some((r) => r.footer) ? t : { ...t, rows: [...t.rows, { _key: tkey(\"r\"), cells: {}, footer: true }] };\n return { ...t, rows: t.rows.filter((r) => !r.footer || Object.values(r.cells).some((c) => !isEmptyCell(cellValue(c)))).map((r) => (r.footer ? clean({ ...r, footer: undefined }) : r)) };\n}\nfunction TableSettings({ ctx }: { ctx: Ctx }) {\n const { t, set, developer, options } = ctx;\n const can = offered(options);\n const d: NonNullable<TableValue[\"design\"]> = t.design ?? {};\n const sortable = t.columns.some((c) => c.sortable);\n const totals = t.rows.some((r) => r.footer);\n const phones = d.responsive ?? \"scroll\";\n const highlighted = t.columns.find((c) => c.highlight);\n const pickable = t.columns.filter((_, i) => !(t.headerColumn && i === 0));\n const jsonOffered = SEARCH.filter((x) => x.value === \"none\" || can.jsonLd.includes(x.value));\n const showJson = can.jsonLd.length > 0 || (!!t.jsonLd && t.jsonLd.type !== \"none\");\n const anything = can.headers || can.totals || can.phones.length || can.highlight || can.sort || can.search || showJson || developer;\n if (!anything) return null;\n const design = (p: Partial<NonNullable<TableValue[\"design\"]>>) => set({ ...t, design: withPatch(d, p) });\n const summary = [\n can.phones.length ? `${PHONES.find((p) => p.value === phones)?.label ?? \"Scroll\"} on phones` : \"\",\n can.highlight && highlighted ? `${highlighted.label || \"A column\"} highlighted` : \"\",\n can.totals && totals ? \"Totals row\" : \"\",\n ]\n .filter(Boolean)\n .join(\" · \");\n const pick = (label: string, node: React.ReactNode) => (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-kit-sm font-medium text-kit-fg-2\">{label}</span>\n {node}\n </div>\n );\n return (\n // before:hidden: the table's own group line is the only line; the section's focus edge would draw a second one beside it\n <FieldSection title=\"Table settings\" defaultOpen={false} summary={summary} className=\"before:hidden\">\n {can.headers ? (\n <div className=\"flex flex-col\">\n <SwitchRow label=\"Show column names\" checked={t.headerRow} onChange={(v) => set({ ...t, headerRow: v })} />\n <SwitchRow label=\"First column names each row\" checked={t.headerColumn} onChange={(v) => set({ ...t, headerColumn: v })} />\n {can.totals ? <SwitchRow label=\"Totals row\" checked={totals} onChange={(v) => set(setTotals(t, v))} /> : null}\n </div>\n ) : can.totals ? (\n <SwitchRow label=\"Totals row\" checked={totals} onChange={(v) => set(setTotals(t, v))} />\n ) : null}\n {can.highlight\n ? pick(\n \"Highlight column\",\n <Select\n aria-label=\"Highlight column\"\n value={highlighted?._key ?? NO_COLUMN}\n onValueChange={(k) => set({ ...t, columns: t.columns.map((c) => withPatch(c, { highlight: c._key === k ? true : undefined })) })}\n options={[{ value: NO_COLUMN, label: \"None\" }, ...pickable.map((c) => ({ value: c._key, label: c.label || \"Untitled column\" }))]}\n />,\n )\n : null}\n {can.phones.length ? pick(\"On phones\", <ChoiceSwitch aria-label=\"On phones\" value={phones} onChange={(responsive) => design({ responsive })} items={can.phones} />) : null}\n {can.sort || can.search ? (\n <div className=\"flex flex-col\">\n {can.sort ? (\n <SwitchRow label=\"Visitors can sort columns\" checked={sortable} onChange={(v) => set({ ...t, columns: t.columns.map((c, i) => withPatch(c, { sortable: v && !(t.headerColumn && i === 0) ? true : undefined })) })} />\n ) : null}\n {can.search ? <SwitchRow label=\"Visitors can search rows\" checked={!!t.filterable} onChange={(v) => set(dropUndefined({ ...t, filterable: v || undefined }))} /> : null}\n </div>\n ) : null}\n {showJson ? (\n <>\n {pick(\n \"Help search engines read this as\",\n <ChoiceSwitch\n aria-label=\"Help search engines read this as\"\n value={t.jsonLd?.type ?? \"none\"}\n onChange={(type) => set(dropUndefined({ ...t, jsonLd: type === \"none\" ? undefined : { ...t.jsonLd, type, ...(type === \"ItemList\" ? { axis: t.jsonLd?.axis ?? \"rows\" } : {}) } }))}\n items={jsonOffered}\n />,\n )}\n {t.jsonLd?.type === \"ItemList\" && developer\n ? pick(\n \"The things compared are the\",\n <ChoiceSwitch\n aria-label=\"The things compared are the\"\n value={t.jsonLd.axis ?? \"rows\"}\n onChange={(axis) => set({ ...t, jsonLd: { ...t.jsonLd!, axis } })}\n items={[\n { value: \"rows\", label: \"Rows\" },\n { value: \"columns\", label: \"Columns\" },\n ]}\n />,\n )\n : null}\n </>\n ) : null}\n {developer ? (\n <div className=\"flex flex-col\">\n <SwitchRow label=\"Hide the title on the page\" checked={!!d.hideCaption} onChange={(v) => design({ hideCaption: v || undefined })} />\n {can.sticky ? <SwitchRow label=\"Keep column names in view\" checked={!!d.sticky} onChange={(v) => design({ sticky: v || undefined })} /> : null}\n <SwitchRow label=\"Striped rows\" checked={!!d.striped} onChange={(v) => design({ striped: v || undefined })} />\n <SwitchRow label=\"Compact\" checked={d.density === \"compact\"} onChange={(v) => design({ density: v ? \"compact\" : undefined })} />\n </div>\n ) : null}\n </FieldSection>\n );\n}\nconst dropUndefined = <T extends object>(o: T): T => Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as T;\n"],"mappings":"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"}
|