@bettercms-ai/kit 1.0.0 → 2.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/adapters/dock-values.d.ts +28 -0
- package/dist/adapters/dock-values.js +41 -0
- package/dist/adapters/dock-values.js.map +1 -0
- package/{adapters → dist/adapters}/icons.js +2 -2
- package/dist/adapters/icons.js.map +1 -0
- package/{adapters → dist/adapters}/lossy.d.ts +94 -31
- package/dist/adapters/lossy.js +419 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/{adapters → dist/adapters}/prod-types.d.ts +91 -26
- package/{adapters → dist/adapters}/prod-types.js +82 -13
- package/dist/adapters/prod-types.js.map +1 -0
- package/{adapters → dist/adapters}/schema.d.ts +40 -1
- package/{adapters → dist/adapters}/schema.js +1038 -204
- package/dist/adapters/schema.js.map +1 -0
- package/{adapters → dist/adapters}/values.d.ts +26 -5
- package/{adapters → dist/adapters}/values.js +87 -17
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/{context.d.ts → dist/context.d.ts} +131 -2
- package/{context.js → dist/context.js} +44 -2
- package/dist/context.js.map +1 -0
- package/{controls → dist/controls}/button.d.ts +19 -5
- package/{controls → dist/controls}/button.js +125 -54
- package/dist/controls/button.js.map +1 -0
- package/{controls → dist/controls}/c1.js +1 -1
- package/dist/controls/c1.js.map +1 -0
- package/{controls → dist/controls}/c2.js +1 -1
- package/dist/controls/c2.js.map +1 -0
- package/{controls → dist/controls}/choice.d.ts +7 -2
- package/{controls → dist/controls}/choice.js +71 -18
- package/dist/controls/choice.js.map +1 -0
- package/{controls → dist/controls}/code-register.js +1 -1
- package/dist/controls/code-register.js.map +1 -0
- package/{controls → dist/controls}/code.js +10 -9
- package/dist/controls/code.js.map +1 -0
- package/{controls → dist/controls}/color.js +8 -8
- package/dist/controls/color.js.map +1 -0
- package/{controls → dist/controls}/component-services.d.ts +42 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/{controls → dist/controls}/date-register.js +1 -1
- package/dist/controls/date-register.js.map +1 -0
- package/{controls → dist/controls}/date-zone.js +8 -2
- package/dist/controls/date-zone.js.map +1 -0
- package/{controls → dist/controls}/date.js +32 -24
- package/dist/controls/date.js.map +1 -0
- package/dist/controls/form-picker-register.d.ts +7 -0
- package/{controls → dist/controls}/form-picker-register.js +2 -6
- package/dist/controls/form-picker-register.js.map +1 -0
- package/{controls → dist/controls}/form-picker.js +11 -9
- package/dist/controls/form-picker.js.map +1 -0
- package/{controls → dist/controls}/icon-register.js +1 -1
- package/dist/controls/icon-register.js.map +1 -0
- package/{controls → dist/controls}/icon.d.ts +4 -2
- package/{controls → dist/controls}/icon.js +32 -27
- package/dist/controls/icon.js.map +1 -0
- package/{controls → dist/controls}/index.d.ts +1 -1
- package/{controls → dist/controls}/index.js +4 -3
- package/dist/controls/index.js.map +1 -0
- package/{controls → dist/controls}/json-register.js +1 -1
- package/dist/controls/json-register.js.map +1 -0
- package/{controls → dist/controls}/json.js +13 -3
- package/dist/controls/json.js.map +1 -0
- package/{controls → dist/controls}/link.js +116 -200
- package/dist/controls/link.js.map +1 -0
- package/{controls → dist/controls}/location-register.js +1 -1
- package/dist/controls/location-register.js.map +1 -0
- package/{controls → dist/controls}/location.js +59 -40
- package/dist/controls/location.js.map +1 -0
- package/{controls → dist/controls}/media-register.js +1 -1
- package/dist/controls/media-register.js.map +1 -0
- package/{controls → dist/controls}/media-services.d.ts +6 -0
- package/dist/controls/media-services.js +0 -0
- package/{controls → dist/controls}/media.d.ts +21 -4
- package/{controls → dist/controls}/media.js +407 -130
- package/dist/controls/media.js.map +1 -0
- package/{controls → dist/controls}/number.js +10 -9
- package/dist/controls/number.js.map +1 -0
- package/{controls → dist/controls}/reference-register.js +1 -1
- package/dist/controls/reference-register.js.map +1 -0
- package/{controls → dist/controls}/reference-services.d.ts +4 -0
- package/dist/controls/reference-services.js +0 -0
- package/{controls → dist/controls}/reference.d.ts +1 -1
- package/{controls → dist/controls}/reference.js +93 -77
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/article-shell.d.ts +145 -0
- package/dist/controls/rich-text/article-shell.js +510 -0
- package/dist/controls/rich-text/article-shell.js.map +1 -0
- package/dist/controls/rich-text/author.d.ts +25 -0
- package/dist/controls/rich-text/author.js +104 -0
- package/dist/controls/rich-text/author.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +60 -0
- package/{controls → dist/controls}/rich-text/blocks.js +164 -389
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/dist/controls/rich-text/button.d.ts +23 -0
- package/dist/controls/rich-text/button.js +85 -0
- package/dist/controls/rich-text/button.js.map +1 -0
- package/{controls → dist/controls}/rich-text/catalog.d.ts +7 -4
- package/{controls → dist/controls}/rich-text/catalog.js +94 -68
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/dist/controls/rich-text/checklist.d.ts +24 -0
- package/dist/controls/rich-text/checklist.js +115 -0
- package/dist/controls/rich-text/checklist.js.map +1 -0
- package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
- package/{controls → dist/controls}/rich-text/codec.js +7 -2
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/dist/controls/rich-text/columns.d.ts +41 -0
- package/dist/controls/rich-text/columns.js +181 -0
- package/dist/controls/rich-text/columns.js.map +1 -0
- package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
- package/{controls → dist/controls}/rich-text/component-card.js +417 -99
- package/dist/controls/rich-text/component-card.js.map +1 -0
- package/dist/controls/rich-text/component-panel.d.ts +47 -0
- package/dist/controls/rich-text/component-panel.js +141 -0
- package/dist/controls/rich-text/component-panel.js.map +1 -0
- package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
- package/{controls → dist/controls}/rich-text/control.js +84 -42
- package/dist/controls/rich-text/control.js.map +1 -0
- package/{controls → dist/controls}/rich-text/dom.d.ts +53 -9
- package/{controls → dist/controls}/rich-text/dom.js +388 -50
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
- package/{controls → dist/controls}/rich-text/editor.js +226 -44
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/dist/controls/rich-text/embed.d.ts +28 -0
- package/dist/controls/rich-text/embed.js +210 -0
- package/dist/controls/rich-text/embed.js.map +1 -0
- package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
- package/{controls → dist/controls}/rich-text/floating.js +35 -18
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/dist/controls/rich-text/footnote.d.ts +41 -0
- package/dist/controls/rich-text/footnote.js +185 -0
- package/dist/controls/rich-text/footnote.js.map +1 -0
- package/dist/controls/rich-text/gallery.d.ts +28 -0
- package/dist/controls/rich-text/gallery.js +167 -0
- package/dist/controls/rich-text/gallery.js.map +1 -0
- package/{controls → dist/controls}/rich-text/index.js +1 -1
- package/dist/controls/rich-text/index.js.map +1 -0
- package/{controls → dist/controls}/rich-text/link-form.d.ts +3 -1
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/{controls → dist/controls}/rich-text/markdown.js +4 -2
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/{controls → dist/controls}/rich-text/ops.js +17 -15
- package/dist/controls/rich-text/ops.js.map +1 -0
- package/dist/controls/rich-text/plain.d.ts +17 -0
- package/dist/controls/rich-text/plain.js +44 -0
- package/dist/controls/rich-text/plain.js.map +1 -0
- package/dist/controls/rich-text/related.d.ts +36 -0
- package/dist/controls/rich-text/related.js +213 -0
- package/dist/controls/rich-text/related.js.map +1 -0
- package/dist/controls/rich-text/toc.d.ts +46 -0
- package/dist/controls/rich-text/toc.js +161 -0
- package/dist/controls/rich-text/toc.js.map +1 -0
- package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
- package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/{controls → dist/controls}/scale.js +5 -5
- package/dist/controls/scale.js.map +1 -0
- package/dist/controls/slot-register.d.ts +6 -0
- package/{controls → dist/controls}/slot-register.js +2 -5
- package/dist/controls/slot-register.js.map +1 -0
- package/{controls → dist/controls}/slot-services.d.ts +25 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/{controls → dist/controls}/slot.js +42 -24
- package/dist/controls/slot.js.map +1 -0
- package/{controls → dist/controls}/table/index.js +1 -1
- package/dist/controls/table/index.js.map +1 -0
- package/{controls → dist/controls}/table/prod.js +3 -3
- package/dist/controls/table/prod.js.map +1 -0
- package/{controls → dist/controls}/table/refs.js +13 -2
- package/dist/controls/table/refs.js.map +1 -0
- package/{controls → dist/controls}/table/stored.js +1 -1
- package/dist/controls/table/stored.js.map +1 -0
- package/{controls → dist/controls}/table/table-editor.js +51 -48
- package/dist/controls/table/table-editor.js.map +1 -0
- package/{controls → dist/controls}/table/table-link.js +3 -3
- package/dist/controls/table/table-link.js.map +1 -0
- package/{controls → dist/controls}/table/table.js +3 -3
- package/dist/controls/table/table.js.map +1 -0
- package/{controls → dist/controls}/text.d.ts +2 -2
- package/{controls → dist/controls}/text.js +78 -43
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +70 -0
- package/dist/core/core.js +187 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +355 -0
- package/dist/core/facets.js +342 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/{engine → dist/engine}/array.js +34 -21
- package/dist/engine/array.js.map +1 -0
- package/{engine → dist/engine}/bits.js +1 -1
- package/dist/engine/bits.js.map +1 -0
- package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
- package/{engine → dist/engine}/breadcrumb.js +12 -36
- package/dist/engine/breadcrumb.js.map +1 -0
- package/{engine → dist/engine}/expand.d.ts +2 -4
- package/{engine → dist/engine}/expand.js +5 -22
- package/dist/engine/expand.js.map +1 -0
- package/{engine → dist/engine}/field-list.js +1 -1
- package/dist/engine/field-list.js.map +1 -0
- package/{engine → dist/engine}/field-shell.js +249 -121
- package/dist/engine/field-shell.js.map +1 -0
- package/{engine → dist/engine}/frame.d.ts +3 -1
- package/{engine → dist/engine}/frame.js +16 -14
- package/dist/engine/frame.js.map +1 -0
- package/{engine → dist/engine}/group-summary.d.ts +2 -1
- package/{engine → dist/engine}/group-summary.js +7 -3
- package/dist/engine/group-summary.js.map +1 -0
- package/{engine → dist/engine}/grouping.d.ts +19 -5
- package/{engine → dist/engine}/grouping.js +193 -21
- package/dist/engine/grouping.js.map +1 -0
- package/{engine → dist/engine}/item-list.d.ts +11 -1
- package/{engine → dist/engine}/item-list.js +35 -13
- package/dist/engine/item-list.js.map +1 -0
- package/{engine → dist/engine}/kit-field.js +45 -10
- package/dist/engine/kit-field.js.map +1 -0
- package/{engine → dist/engine}/schema-form.d.ts +27 -2
- package/{engine → dist/engine}/schema-form.js +182 -40
- package/dist/engine/schema-form.js.map +1 -0
- package/{engine → dist/engine}/slot.js +5 -15
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/{kit.css → dist/kit.css} +19 -0
- package/{lib → dist/lib}/cn.js +7 -4
- package/dist/lib/cn.js.map +1 -0
- package/{lib → dist/lib}/columns.js +4 -1
- package/dist/lib/columns.js.map +1 -0
- package/{lib → dist/lib}/frames.js +2 -2
- package/dist/lib/frames.js.map +1 -0
- package/dist/lib/icon-image.d.ts +10 -0
- package/dist/lib/icon-image.js +8 -0
- package/dist/lib/icon-image.js.map +1 -0
- package/{lib → dist/lib}/icons.js +4 -3
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/input-modality.d.ts +11 -0
- package/dist/lib/input-modality.js +47 -0
- package/dist/lib/input-modality.js.map +1 -0
- package/dist/lib/key-event.d.ts +11 -0
- package/dist/lib/key-event.js +16 -0
- package/dist/lib/key-event.js.map +1 -0
- package/{lib → dist/lib}/path.js +4 -2
- package/dist/lib/path.js.map +1 -0
- package/{lib → dist/lib}/schema.d.ts +34 -3
- package/{lib → dist/lib}/schema.js +110 -13
- package/dist/lib/schema.js.map +1 -0
- package/{lib → dist/lib}/utils.js +1 -1
- package/dist/lib/utils.js.map +1 -0
- package/{lib → dist/lib}/validate.d.ts +11 -1
- package/{lib → dist/lib}/validate.js +85 -11
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1511 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/{schema → dist/schema}/adapters.js +1 -2
- package/dist/schema/adapters.js.map +1 -0
- package/{schema → dist/schema}/help.d.ts +2 -0
- package/{schema → dist/schema}/help.js +6 -4
- package/dist/schema/help.js.map +1 -0
- package/{schema → dist/schema}/scale.js +1 -1
- package/dist/schema/scale.js.map +1 -0
- package/{schema → dist/schema}/sources.js +1 -1
- package/dist/schema/sources.js.map +1 -0
- package/{schema → dist/schema}/table.js +11 -10
- package/dist/schema/table.js.map +1 -0
- package/{schema → dist/schema}/types.d.ts +36 -1
- package/{schema → dist/schema}/types.js +1 -1
- package/dist/schema/types.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/table/table-view.d.ts +14 -0
- package/dist/table/table-view.js +140 -0
- package/dist/table/table-view.js.map +1 -0
- package/dist/table/table.css +73 -0
- package/dist/testing/corpus.d.ts +63 -0
- package/dist/testing/corpus.js +129 -0
- package/dist/testing/corpus.js.map +1 -0
- package/dist/testing/test-form.d.ts +11 -0
- package/dist/testing/test-form.js +38 -0
- package/dist/testing/test-form.js.map +1 -0
- package/dist/theme.css +345 -0
- package/dist/theme.d.ts +22 -0
- package/dist/theme.js +43 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.js +0 -0
- package/{ui → dist/ui}/action-tray.d.ts +1 -1
- package/{ui → dist/ui}/action-tray.js +20 -19
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +58 -0
- package/dist/ui/autocomplete.js +194 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/{ui → dist/ui}/button.d.ts +3 -3
- package/{ui → dist/ui}/button.js +8 -11
- package/dist/ui/button.js.map +1 -0
- package/{ui → dist/ui}/choice-switch.js +1 -1
- package/dist/ui/choice-switch.js.map +1 -0
- package/{ui → dist/ui}/controls.js +51 -39
- package/dist/ui/controls.js.map +1 -0
- package/{ui → dist/ui}/display.d.ts +10 -3
- package/{ui → dist/ui}/display.js +57 -46
- package/dist/ui/display.js.map +1 -0
- package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
- package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/{ui → dist/ui}/field-context.js +1 -1
- package/dist/ui/field-context.js.map +1 -0
- package/{ui → dist/ui}/floating-panel.d.ts +1 -1
- package/{ui → dist/ui}/floating-panel.js +28 -12
- package/dist/ui/floating-panel.js.map +1 -0
- package/{ui → dist/ui}/index.d.ts +4 -0
- package/dist/ui/index.js +18 -0
- package/{ui → dist/ui}/input.d.ts +1 -1
- package/{ui → dist/ui}/input.js +9 -9
- package/dist/ui/input.js.map +1 -0
- package/{ui → dist/ui}/mode-bar.js +3 -3
- package/dist/ui/mode-bar.js.map +1 -0
- package/{ui → dist/ui}/overlay.d.ts +77 -5
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/{ui → dist/ui}/path-crumbs.js +37 -3
- package/dist/ui/path-crumbs.js.map +1 -0
- package/{ui → dist/ui}/presence.js +2 -2
- package/dist/ui/presence.js.map +1 -0
- package/{ui → dist/ui}/select.js +89 -87
- package/dist/ui/select.js.map +1 -0
- package/{ui → dist/ui}/shortcut-hint.js +1 -1
- package/dist/ui/shortcut-hint.js.map +1 -0
- package/dist/ui/spinner.d.ts +24 -0
- package/dist/ui/spinner.js +42 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/split-button.d.ts +32 -0
- package/dist/ui/split-button.js +60 -0
- package/dist/ui/split-button.js.map +1 -0
- package/{ui → dist/ui}/surfaces.js +1 -1
- package/dist/ui/surfaces.js.map +1 -0
- package/dist/ui/tab.d.ts +38 -0
- package/dist/ui/tab.js +87 -0
- package/dist/ui/tab.js.map +1 -0
- package/dist/ui/toast.d.ts +20 -0
- package/dist/ui/toast.js +115 -0
- package/dist/ui/toast.js.map +1 -0
- package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
- package/{ui → dist/ui}/tooltip-root.js +9 -8
- package/dist/ui/tooltip-root.js.map +1 -0
- package/{ui → dist/ui}/variants.js +1 -1
- package/dist/ui/variants.js.map +1 -0
- package/package.json +83 -23
- package/adapters/icons.js.map +0 -1
- package/adapters/lossy.js +0 -233
- package/adapters/lossy.js.map +0 -1
- package/adapters/prod-types.js.map +0 -1
- package/adapters/schema.js.map +0 -1
- package/adapters/values.js.map +0 -1
- package/brand/logo.js +0 -9
- package/brand/logo.js.map +0 -1
- package/context.js.map +0 -1
- package/controls/button.js.map +0 -1
- package/controls/c1.js.map +0 -1
- package/controls/c2.js.map +0 -1
- package/controls/choice.js.map +0 -1
- package/controls/code-register.js.map +0 -1
- package/controls/code.js.map +0 -1
- package/controls/color.js.map +0 -1
- package/controls/date-register.js.map +0 -1
- package/controls/date-zone.js.map +0 -1
- package/controls/date.js.map +0 -1
- package/controls/form-picker-register.d.ts +0 -1
- package/controls/form-picker-register.js.map +0 -1
- package/controls/form-picker.js.map +0 -1
- package/controls/icon-register.js.map +0 -1
- package/controls/icon.js.map +0 -1
- package/controls/index.js.map +0 -1
- package/controls/json-register.js.map +0 -1
- package/controls/json.js.map +0 -1
- package/controls/link.js.map +0 -1
- package/controls/location-register.js.map +0 -1
- package/controls/location.js.map +0 -1
- package/controls/media-register.js.map +0 -1
- package/controls/media.js.map +0 -1
- package/controls/number.js.map +0 -1
- package/controls/reference-register.js.map +0 -1
- package/controls/reference.js.map +0 -1
- package/controls/rich-text/blocks.d.ts +0 -28
- package/controls/rich-text/blocks.js.map +0 -1
- package/controls/rich-text/catalog.js.map +0 -1
- package/controls/rich-text/codec.js.map +0 -1
- package/controls/rich-text/component-card.js.map +0 -1
- package/controls/rich-text/control.js.map +0 -1
- package/controls/rich-text/dom.js.map +0 -1
- package/controls/rich-text/editor.js.map +0 -1
- package/controls/rich-text/floating.js.map +0 -1
- package/controls/rich-text/index.js.map +0 -1
- package/controls/rich-text/link-form.js +0 -111
- package/controls/rich-text/link-form.js.map +0 -1
- package/controls/rich-text/markdown.js.map +0 -1
- package/controls/rich-text/ops.js.map +0 -1
- package/controls/rich-text/toolbar.js.map +0 -1
- package/controls/scale.js.map +0 -1
- package/controls/slot-register.d.ts +0 -1
- package/controls/slot-register.js.map +0 -1
- package/controls/slot-services.js +0 -38
- package/controls/slot-services.js.map +0 -1
- package/controls/slot.js.map +0 -1
- package/controls/table/index.js.map +0 -1
- package/controls/table/prod.js.map +0 -1
- package/controls/table/refs.js.map +0 -1
- package/controls/table/stored.js.map +0 -1
- package/controls/table/table-editor.js.map +0 -1
- package/controls/table/table-link.js.map +0 -1
- package/controls/table/table.js.map +0 -1
- package/controls/text.js.map +0 -1
- package/engine/array.js.map +0 -1
- package/engine/bits.js.map +0 -1
- package/engine/breadcrumb.js.map +0 -1
- package/engine/expand.js.map +0 -1
- package/engine/field-list.js.map +0 -1
- package/engine/field-shell.js.map +0 -1
- package/engine/frame.js.map +0 -1
- package/engine/group-summary.js.map +0 -1
- package/engine/grouping.js.map +0 -1
- package/engine/item-list.js.map +0 -1
- package/engine/kit-field.js.map +0 -1
- package/engine/schema-form.js.map +0 -1
- package/engine/slot.js.map +0 -1
- package/index.js +0 -55
- package/index.js.map +0 -1
- package/lib/cn.js.map +0 -1
- package/lib/columns.js.map +0 -1
- package/lib/frames.js.map +0 -1
- package/lib/icons.js.map +0 -1
- package/lib/path.js.map +0 -1
- package/lib/schema.js.map +0 -1
- package/lib/utils.js.map +0 -1
- package/lib/validate.js.map +0 -1
- package/schema/adapters.js.map +0 -1
- package/schema/help.js.map +0 -1
- package/schema/scale.js.map +0 -1
- package/schema/sources.js.map +0 -1
- package/schema/table.js.map +0 -1
- package/schema/types.js.map +0 -1
- package/ui/action-tray.js.map +0 -1
- package/ui/button.js.map +0 -1
- package/ui/choice-switch.js.map +0 -1
- package/ui/controls.js.map +0 -1
- package/ui/display.js.map +0 -1
- package/ui/expanded-editor-modal.js.map +0 -1
- package/ui/field-context.js.map +0 -1
- package/ui/floating-panel.js.map +0 -1
- package/ui/index.js +0 -13
- package/ui/input.js.map +0 -1
- package/ui/mode-bar.js.map +0 -1
- package/ui/overlay.js +0 -378
- package/ui/overlay.js.map +0 -1
- package/ui/path-crumbs.js.map +0 -1
- package/ui/presence.js.map +0 -1
- package/ui/select.js.map +0 -1
- package/ui/shortcut-hint.js.map +0 -1
- package/ui/surfaces.js.map +0 -1
- package/ui/tooltip-root.js.map +0 -1
- package/ui/variants.js.map +0 -1
- /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
- /package/{adapters → dist/adapters}/icons.d.ts +0 -0
- /package/{brand → dist/brand}/logo.d.ts +0 -0
- /package/{controls → dist/controls}/c1.d.ts +0 -0
- /package/{controls → dist/controls}/c2.d.ts +0 -0
- /package/{controls → dist/controls}/code-register.d.ts +0 -0
- /package/{controls → dist/controls}/code.d.ts +0 -0
- /package/{controls → dist/controls}/color.d.ts +0 -0
- /package/{controls → dist/controls}/date-register.d.ts +0 -0
- /package/{controls → dist/controls}/date-zone.d.ts +0 -0
- /package/{controls → dist/controls}/date.d.ts +0 -0
- /package/{controls → dist/controls}/form-picker.d.ts +0 -0
- /package/{controls → dist/controls}/icon-register.d.ts +0 -0
- /package/{controls → dist/controls}/json-register.d.ts +0 -0
- /package/{controls → dist/controls}/json.d.ts +0 -0
- /package/{controls → dist/controls}/link.d.ts +0 -0
- /package/{controls → dist/controls}/location-register.d.ts +0 -0
- /package/{controls → dist/controls}/location.d.ts +0 -0
- /package/{controls → dist/controls}/media-register.d.ts +0 -0
- /package/{controls → dist/controls}/number.d.ts +0 -0
- /package/{controls → dist/controls}/reference-register.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
- /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
- /package/{controls → dist/controls}/scale.d.ts +0 -0
- /package/{controls → dist/controls}/slot.d.ts +0 -0
- /package/{controls → dist/controls}/table/index.d.ts +0 -0
- /package/{controls → dist/controls}/table/prod.d.ts +0 -0
- /package/{controls → dist/controls}/table/refs.d.ts +0 -0
- /package/{controls → dist/controls}/table/stored.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
- /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
- /package/{controls → dist/controls}/table/table.d.ts +0 -0
- /package/{engine → dist/engine}/array.d.ts +0 -0
- /package/{engine → dist/engine}/bits.d.ts +0 -0
- /package/{engine → dist/engine}/field-list.d.ts +0 -0
- /package/{engine → dist/engine}/field-shell.d.ts +0 -0
- /package/{engine → dist/engine}/kit-field.d.ts +0 -0
- /package/{engine → dist/engine}/slot.d.ts +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{lib → dist/lib}/cn.d.ts +0 -0
- /package/{lib → dist/lib}/columns.d.ts +0 -0
- /package/{lib → dist/lib}/frames.d.ts +0 -0
- /package/{lib → dist/lib}/icons.d.ts +0 -0
- /package/{lib → dist/lib}/path.d.ts +0 -0
- /package/{lib → dist/lib}/utils.d.ts +0 -0
- /package/{schema → dist/schema}/adapters.d.ts +0 -0
- /package/{schema → dist/schema}/scale.d.ts +0 -0
- /package/{schema → dist/schema}/sources.d.ts +0 -0
- /package/{schema → dist/schema}/table.d.ts +0 -0
- /package/{types.d.ts → dist/types.d.ts} +0 -0
- /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
- /package/{ui → dist/ui}/controls.d.ts +0 -0
- /package/{ui → dist/ui}/field-context.d.ts +0 -0
- /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
- /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
- /package/{ui → dist/ui}/presence.d.ts +0 -0
- /package/{ui → dist/ui}/select.d.ts +0 -0
- /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
- /package/{ui → dist/ui}/surfaces.d.ts +0 -0
- /package/{ui → dist/ui}/variants.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facets.js","names":[],"sources":["../../src/core/facets.ts"],"sourcesContent":["/**\n * THE FACET TABLE (kit-facet-table.v3.md, G0b closed 2026-10-23): every V2 schema facet the adapter can name, with the\n * ONE prod key per lane that stores it. `satisfies Record<V2Facet, FacetRow>` makes it total: a feature added to\n * FEATURES or CATALOG (adapters/lossy.ts) without a row here fails tsc.\n *\n * Carriers are `value` (an explicit stored key) and `excluded` (owner-signed). A `bound` names the one shared constant\n * the V2 authoring rule and the prod zod rule both read: a value inside it is carried, one outside it is refused with\n * the facet's name. `status` is \"landed\" when the adapter carries the facet today, else the step that lands it.\n * Prod-only keys V2 has no concept of are not facets: OUT_OF_DOMAIN, preserved on every write (PBT P8).\n */\nimport type { CatalogFeature, LossyFeature } from \"../adapters/lossy\";\n\n/** Prod keys with no V2 concept (facet table §B.1): never written from V2, carried through a write from the stored definition. */\nexport const OUT_OF_DOMAIN = {\n \"prop target\": \"a prop's binding: props[].target (+ stale, origin)\",\n \"host config\": \"HOST_CONFIG_KEYS + SERVER_CONFIG_KEYS in a field's or prop's config (adapters/lossy.ts)\",\n} as const satisfies Partial<Record<CatalogFeature, string>>;\nexport type OutOfDomainFeature = keyof typeof OUT_OF_DOMAIN;\n\nexport type V2Facet = Exclude<LossyFeature | CatalogFeature, OutOfDomainFeature>;\n\nexport interface FacetRow {\n /** facet table v3: an A row number, or the B group */\n row: string;\n carrier: \"value\" | \"excluded\";\n /** the prod key(s) per lane, one per shape the facet takes; [] = the facet does not arise in that lane */\n props: readonly string[];\n fields: readonly string[];\n /** the shared constant: inside it the facet is carried, outside it the facet is refused by name */\n bound?: string;\n status: \"landed\" | `pending:${string}`;\n /** a facet stored at another facet's key (kind:page is the shape facet's value \"page\") */\n foldedInto?: V2Facet;\n}\n\nconst corpusFix = (props: string, fields: string, bound: string): FacetRow => ({ row: \"B corpus-fix\", carrier: \"value\", props: [props], fields: [fields], bound, status: \"landed\" });\n\nexport const FACETS = {\n /* ── A: hit by the corpus ── */\n ai: { row: \"A1\", carrier: \"value\", props: [\"props[].ai\"], fields: [\"fields[].ai\"], status: \"pending:C3\" },\n category: { row: \"A2\", carrier: \"value\", props: [\"components.category\"], fields: [\"content_models.v2.category\"], bound: \"CATEGORY_ORDER\", status: \"pending:C3+C5\" },\n variants: {\n row: \"A3\",\n carrier: \"value\",\n props: [\"component_variant_groups (+ components.variant_group_id, variant_input_mappings; order/icon/description → component_variant_groups.v2.variants)\"],\n fields: [\"fields[_variant] select + showIf {field:_variant}; content_models.v2.variants{slug → {icon, description}}\"],\n status: \"pending:C4\",\n },\n \"block icon\": { row: \"A4\", carrier: \"value\", props: [\"components.icon\"], fields: [\"content_models.icon\"], bound: \"DOCK_ICON_NAMES\", status: \"pending:C1-model-settings\" },\n \"document preview\": { row: \"A5\", carrier: \"value\", props: [\"components.preview\"], fields: [\"content_models.list_preview\"], status: \"pending:C3\" },\n \"document preview path\": { row: \"B catalog\", carrier: \"value\", props: [\"components.preview (path rule widened)\"], fields: [], status: \"pending:C3\" },\n \"kind:global\": { row: \"A6\", carrier: \"value\", props: [\"components.v2.shape\"], fields: [\"content_models.v2.shape\"], status: \"pending:C5\" },\n \"kind:entry (props)\": { row: \"A6\", carrier: \"value\", props: [\"components.v2.shape\"], fields: [], status: \"pending:C5\", foldedInto: \"kind:global\" },\n \"kind:block (fields)\": { row: \"A6\", carrier: \"value\", props: [], fields: [\"content_models.v2.shape\"], status: \"pending:C5\", foldedInto: \"kind:global\" },\n \"kind:page\": { row: \"A22\", carrier: \"value\", props: [], fields: [\"content_models.v2.shape\"], status: \"pending:C5\", foldedInto: \"kind:global\" },\n \"kind:object\": { row: \"A6\", carrier: \"value\", props: [], fields: [\"content_models.v2.shape\"], status: \"pending:C5\", foldedInto: \"kind:global\" },\n \"groups>3\": { row: \"A7\", carrier: \"value\", props: [\"components.tabs\"], fields: [\"content_models.fieldsets[kind:tab]\"], bound: \"TAB_MAX\", status: \"pending:C3+C8\" },\n \"item openMode\": {\n row: \"A8\",\n carrier: \"value\",\n props: [\"config.item.openMode (object item)\", \"config.itemTypes[i].openMode (polymorphic)\"],\n fields: [\"ui.blocks[slug].openMode (modular)\"],\n status: \"pending:C3\",\n },\n \"reference target\": { row: \"A9\", carrier: \"value\", props: [\"config.targets\"], fields: [\"config.targets\"], bound: \"REF_TARGET_KINDS\", status: \"landed\" },\n \"type:slot\": { row: \"A10\", carrier: \"value\", props: [\"props[] type slot (config.allow)\"], fields: [\"fields[] type slot (config.blockSlugs)\"], bound: \"SLOT_BLOCK_SLUGS_REQUIRED\", status: \"landed\" },\n \"block model field\": { row: \"A11\", carrier: \"value\", props: [], fields: [\"kind:'block' model fields[]\"], bound: \"BLOCK_FIELD_TYPES\", status: \"pending:G7\" },\n \"shopify reference\": { row: \"A12\", carrier: \"excluded\", props: [], fields: [], status: \"landed\" },\n \"type:table\": { row: \"A13\", carrier: \"value\", props: [\"props[] type table (config.mode data)\"], fields: [\"fields[] type table\"], status: \"landed\" },\n \"group (nested)\": { row: \"A14\", carrier: \"value\", props: [\"ui.tab {id}\"], fields: [\"ui.tab {id} (nested field)\"], bound: \"TAB_MAX\", status: \"landed\" },\n \"fieldset collision\": { row: \"A15\", carrier: \"value\", props: [\"ui.group {id}\"], fields: [\"fieldsetId\"], bound: \"TAB_FIELDSET_ID_UNIQUE\", status: \"landed\" },\n \"segmented fallback\": { row: \"A16\", carrier: \"value\", props: [\"ui.control segmented\"], fields: [\"ui.control segmented\"], bound: \"SEGMENTED_MAX\", status: \"pending:C3\" },\n \"fieldset (derived)\": { row: \"A17\", carrier: \"value\", props: [\"ui.group (prop group)\"], fields: [\"content_models.fieldsets\"], status: \"landed\" },\n \"itemNoun (derived)\": { row: \"A18\", carrier: \"value\", props: [\"ui.itemLabel\"], fields: [\"ui.itemTitle\"], status: \"landed\" },\n \"reference filter\": { row: \"A19\", carrier: \"value\", props: [\"config.filter\"], fields: [\"config.filter\"], bound: \"REFERENCE_FILTER_MAX\", status: \"landed\" },\n condition: { row: \"A20\", carrier: \"value\", props: [\"showIf (+ scope)\"], fields: [\"showIf (+ scope)\"], bound: \"SHOW_IF_SCOPES\", status: \"pending:C3\" },\n openMode: { row: \"A21\", carrier: \"value\", props: [\"props[].openMode\"], fields: [\"fields[].openMode\"], bound: \"OPEN_MODE_TYPES\", status: \"pending:C9\" },\n \"slot allow\": { row: \"A23\", carrier: \"value\", props: [\"config.allow\"], fields: [\"config.blockSlugs\"], bound: \"SLOT_ALLOW\", status: \"landed\" },\n\n /* ── B: in the code, not hit by the corpus ── */\n \"type:polymorphic-array\": { row: \"B structural\", carrier: \"value\", props: [\"props[] type table (config.mode types)\"], fields: [\"fields[] type modular\"], status: \"pending:C3\" },\n \"item chrome (types)\": { row: \"B structural\", carrier: \"value\", props: [\"config.itemTypes[i] {icon, preview}\"], fields: [\"ui.blocks[slug] {icon, preview}\"], status: \"pending:C3\" },\n \"type:primitive-array\": { row: \"B decided\", carrier: \"value\", props: [\"config.itemType (widened)\"], fields: [\"config.itemType (widened)\"], status: \"pending:C3\" },\n \"depth>10\": { row: \"B decided\", carrier: \"value\", props: [\"nesting\"], fields: [\"nesting\"], bound: \"DEPTH_MAX\", status: \"landed\" },\n slotSettings: { row: \"B decided (BUILD)\", carrier: \"value\", props: [\"config.settings: FieldDef[]\"], fields: [\"config.settings: FieldDef[]\"], bound: \"SLOT_SETTINGS_MAX\", status: \"pending:C3\" },\n \"block placement\": { row: \"B catalog\", carrier: \"value\", props: [\"components.v2.placement\"], fields: [\"content_models.v2.placement\"], status: \"pending:C5\" },\n \"seeded instance\": { row: \"B catalog\", carrier: \"excluded\", props: [], fields: [], status: \"landed\" },\n \"not applicable (props)\": { row: \"B catalog\", carrier: \"excluded\", props: [], fields: [], status: \"landed\" },\n \"type name\": corpusFix(\"components.slug\", \"content_models.slug\", \"SLUG_RE\"),\n \"group name>40\": corpusFix(\"components.tabs[].id\", \"content_models.fieldsets[].id\", \"TAB_NAME_MAX\"),\n \"group title\": corpusFix(\"components.tabs[].name\", \"content_models.fieldsets[].name\", \"TAB_TITLE\"),\n \"group default\": corpusFix(\"components.tabs[0]\", \"content_models.fieldsets[0]\", \"TAB_DEFAULT_FIRST\"),\n \"group icon\": corpusFix(\"components.tabs[].icon\", \"content_models.fieldsets[].icon\", \"DOCK_ICON_NAMES\"),\n \"group name collision\": corpusFix(\"components.tabs[].name\", \"content_models.fieldsets[].name\", \"TAB_NAME_UNIQUE\"),\n \"prop tab limit\": corpusFix(\"components.tabs\", \"content_models.fieldsets\", \"PROP_TAB_MAX\"),\n \"fieldset spans groups\": corpusFix(\"ui.group.tab\", \"fieldsets[].tab\", \"FIELDSET_ONE_TAB\"),\n \"fieldset (props)\": corpusFix(\"ui.group (first prop)\", \"content_models.fieldsets\", \"PROP_GROUP_DEFINED_ON_USE\"),\n \"fieldset name>limit\": corpusFix(\"ui.group.label\", \"content_models.fieldsets[].name\", \"FIELDSET_NAME_MAX\"),\n \"duplicate name\": corpusFix(\"props[].key\", \"fields[].key\", \"KEY_UNIQUE\"),\n \"reserved name\": { row: \"B corpus-fix\", carrier: \"value\", props: [], fields: [\"fields[].key\"], bound: \"KEY_RESERVED + KEY_FORMAT\", status: \"landed\" },\n rows: corpusFix(\"ui.rows\", \"ui.rows\", \"UI_ROWS_MAX\"),\n synced: corpusFix(\"ui.synced\", \"ui.synced\", \"SYNCED_FROM_MAX\"),\n valueShape: corpusFix(\"ui.valueShape\", \"ui.valueShape\", \"VALUE_SHAPE_TYPES\"),\n \"default value\": corpusFix(\"props[].defaultValue\", \"fields[].defaultValue\", \"VALUE_SCHEMAS\"),\n icon: corpusFix(\"ui.icon\", \"ui.icon\", \"DOCK_ICON_NAMES\"),\n layout: corpusFix(\"ui.control / ui.layout\", \"ui.control / ui.layout\", \"CONTROL_TYPES\"),\n \"help>limit\": corpusFix(\"helpText / placeholder / helpMore\", \"helpText / ui.placeholder / helpMore\", \"HELP_CAPS\"),\n \"option icon\": corpusFix(\"options[].icon\", \"options[].icon\", \"DOCK_ICON_NAMES\"),\n \"option description\": corpusFix(\"options[].description\", \"options[].description\", \"OPTION_DESCRIPTION_MAX\"),\n access: corpusFix(\"ui.access\", \"ui.access\", \"ACCESS_CAPS\"),\n timezone: corpusFix(\"config.timezone\", \"config.timezone\", \"TIMEZONE\"),\n \"reference order\": corpusFix(\"config.contentModelId|allowedModelSlugs, config.targets\", \"config.contentModelId|allowedModelSlugs, config.targets\", \"REFERENCE_TO_ORDER\"),\n \"numeric unit\": corpusFix(\"config.unit\", \"config.unit\", \"NUMBER_UNIT_MAX\"),\n \"rating bounds\": corpusFix(\"config.min/max/step (rating)\", \"config.min/max/step (rating)\", \"RATING_BOUNDS\"),\n \"scale rules\": corpusFix(\"config.scale\", \"config.scale\", \"SCALE_RULES\"),\n \"validation.patternMessage\": corpusFix(\"config.patternMessage\", \"config.patternMessage\", \"PATTERN_MESSAGE_MAX\"),\n \"validation.pattern\": corpusFix(\"config.pattern\", \"config.pattern\", \"PATTERN_MAX\"),\n \"validation.length\": corpusFix(\"config.minLength/maxLength\", \"config.minLength/maxLength\", \"LENGTH_TYPES\"),\n \"validation.items\": corpusFix(\"config.minItems/maxItems\", \"config.minItems/maxItems\", \"LIST_ITEMS_CAP\"),\n \"validation.unique\": corpusFix(\"props[].unique\", \"fields[].unique\", \"UNIQUE_TYPES\"),\n \"validation.recommendedMax\": corpusFix(\"props[].recommendedMax\", \"fields[].recommendedMax\", \"RECOMMENDED_MAX\"),\n \"item identity\": corpusFix(\"ui.itemName / ui.itemTitle\", \"ui.itemName / ui.itemTitle\", \"ITEM_NAME_RE\"),\n \"item settings\": corpusFix(\"config.item\", \"config.item\", \"ARRAY_ITEM_SETTINGS\"),\n itemNoun: corpusFix(\"ui.itemLabel\", \"ui.itemLabel\", \"ITEM_LABEL_MAX\"),\n \"item icon\": corpusFix(\"ui.icon (list)\", \"ui.icon (list)\", \"DOCK_ICON_NAMES\"),\n \"preview icon\": corpusFix(\"ui.preview.icon\", \"ui.preview.icon\", \"DOCK_ICON_NAMES\"),\n \"preview path\": corpusFix(\"ui.preview.{title,subtitle,media}\", \"ui.preview.{title,subtitle,media}\", \"PREVIEW_PATH\"),\n \"unsupported key\": corpusFix(\"—\", \"—\", \"V2_SCHEMA_KEYS\"),\n\n /* ── RT0 (kit-richtext-blocks-plan.md): a rich text's features, written as the full V2 set when V2 names none ── */\n \"richtext features\": { row: \"B RT0\", carrier: \"value\", props: [\"config.features\"], fields: [\"config.features\"], bound: \"RICHTEXT_FEATURES\", status: \"landed\" },\n} as const satisfies Record<V2Facet, FacetRow>;\n\nexport const facetOf = (feature: string): FacetRow | undefined => (FACETS as Record<string, FacetRow>)[feature];\n\n/** The owner-signed exclusions: what may be lost by design (shopify until its pipeline, and two deliberate backend rules). */\nexport const EXCLUDED: readonly V2Facet[] = (Object.keys(FACETS) as V2Facet[]).filter((f) => FACETS[f].carrier === \"excluded\");\n"],"mappings":";;AAaA,IAAa,gBAAgB;CAC3B,eAAe;CACf,eAAe;AACjB;AAmBA,IAAM,aAAa,OAAe,QAAgB,WAA6B;CAAE,KAAK;CAAgB,SAAS;CAAS,OAAO,CAAC,KAAK;CAAG,QAAQ,CAAC,MAAM;CAAG;CAAO,QAAQ;AAAS;AAElL,IAAa,SAAS;CAEpB,IAAI;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,YAAY;EAAG,QAAQ,CAAC,aAAa;EAAG,QAAQ;CAAa;CACxG,UAAU;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,qBAAqB;EAAG,QAAQ,CAAC,4BAA4B;EAAG,OAAO;EAAkB,QAAQ;CAAgB;CAClK,UAAU;EACR,KAAK;EACL,SAAS;EACT,OAAO,CAAC,iJAAiJ;EACzJ,QAAQ,CAAC,2GAA2G;EACpH,QAAQ;CACV;CACA,cAAc;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,iBAAiB;EAAG,QAAQ,CAAC,qBAAqB;EAAG,OAAO;EAAmB,QAAQ;CAA4B;CACxK,oBAAoB;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,oBAAoB;EAAG,QAAQ,CAAC,6BAA6B;EAAG,QAAQ;CAAa;CAChJ,yBAAyB;EAAE,KAAK;EAAa,SAAS;EAAS,OAAO,CAAC,wCAAwC;EAAG,QAAQ,CAAC;EAAG,QAAQ;CAAa;CACnJ,eAAe;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,qBAAqB;EAAG,QAAQ,CAAC,yBAAyB;EAAG,QAAQ;CAAa;CACxI,sBAAsB;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,qBAAqB;EAAG,QAAQ,CAAC;EAAG,QAAQ;EAAc,YAAY;CAAc;CACjJ,uBAAuB;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC;EAAG,QAAQ,CAAC,yBAAyB;EAAG,QAAQ;EAAc,YAAY;CAAc;CACtJ,aAAa;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC;EAAG,QAAQ,CAAC,yBAAyB;EAAG,QAAQ;EAAc,YAAY;CAAc;CAC7I,eAAe;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC;EAAG,QAAQ,CAAC,yBAAyB;EAAG,QAAQ;EAAc,YAAY;CAAc;CAC9I,YAAY;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,iBAAiB;EAAG,QAAQ,CAAC,oCAAoC;EAAG,OAAO;EAAW,QAAQ;CAAgB;CACjK,iBAAiB;EACf,KAAK;EACL,SAAS;EACT,OAAO,CAAC,sCAAsC,4CAA4C;EAC1F,QAAQ,CAAC,oCAAoC;EAC7C,QAAQ;CACV;CACA,oBAAoB;EAAE,KAAK;EAAM,SAAS;EAAS,OAAO,CAAC,gBAAgB;EAAG,QAAQ,CAAC,gBAAgB;EAAG,OAAO;EAAoB,QAAQ;CAAS;CACtJ,aAAa;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,kCAAkC;EAAG,QAAQ,CAAC,wCAAwC;EAAG,OAAO;EAA6B,QAAQ;CAAS;CACnM,qBAAqB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC;EAAG,QAAQ,CAAC,6BAA6B;EAAG,OAAO;EAAqB,QAAQ;CAAa;CAC1J,qBAAqB;EAAE,KAAK;EAAO,SAAS;EAAY,OAAO,CAAC;EAAG,QAAQ,CAAC;EAAG,QAAQ;CAAS;CAChG,cAAc;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,uCAAuC;EAAG,QAAQ,CAAC,qBAAqB;EAAG,QAAQ;CAAS;CAClJ,kBAAkB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,aAAa;EAAG,QAAQ,CAAC,4BAA4B;EAAG,OAAO;EAAW,QAAQ;CAAS;CACrJ,sBAAsB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,eAAe;EAAG,QAAQ,CAAC,YAAY;EAAG,OAAO;EAA0B,QAAQ;CAAS;CAC1J,sBAAsB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,sBAAsB;EAAG,QAAQ,CAAC,sBAAsB;EAAG,OAAO;EAAiB,QAAQ;CAAa;CACtK,sBAAsB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,uBAAuB;EAAG,QAAQ,CAAC,0BAA0B;EAAG,QAAQ;CAAS;CAC/I,sBAAsB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,cAAc;EAAG,QAAQ,CAAC,cAAc;EAAG,QAAQ;CAAS;CAC1H,oBAAoB;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,eAAe;EAAG,QAAQ,CAAC,eAAe;EAAG,OAAO;EAAwB,QAAQ;CAAS;CACzJ,WAAW;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,kBAAkB;EAAG,QAAQ,CAAC,kBAAkB;EAAG,OAAO;EAAkB,QAAQ;CAAa;CACpJ,UAAU;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,kBAAkB;EAAG,QAAQ,CAAC,mBAAmB;EAAG,OAAO;EAAmB,QAAQ;CAAa;CACrJ,cAAc;EAAE,KAAK;EAAO,SAAS;EAAS,OAAO,CAAC,cAAc;EAAG,QAAQ,CAAC,mBAAmB;EAAG,OAAO;EAAc,QAAQ;CAAS;CAG5I,0BAA0B;EAAE,KAAK;EAAgB,SAAS;EAAS,OAAO,CAAC,wCAAwC;EAAG,QAAQ,CAAC,uBAAuB;EAAG,QAAQ;CAAa;CAC9K,uBAAuB;EAAE,KAAK;EAAgB,SAAS;EAAS,OAAO,CAAC,qCAAqC;EAAG,QAAQ,CAAC,iCAAiC;EAAG,QAAQ;CAAa;CAClL,wBAAwB;EAAE,KAAK;EAAa,SAAS;EAAS,OAAO,CAAC,2BAA2B;EAAG,QAAQ,CAAC,2BAA2B;EAAG,QAAQ;CAAa;CAChK,YAAY;EAAE,KAAK;EAAa,SAAS;EAAS,OAAO,CAAC,SAAS;EAAG,QAAQ,CAAC,SAAS;EAAG,OAAO;EAAa,QAAQ;CAAS;CAChI,cAAc;EAAE,KAAK;EAAqB,SAAS;EAAS,OAAO,CAAC,6BAA6B;EAAG,QAAQ,CAAC,6BAA6B;EAAG,OAAO;EAAqB,QAAQ;CAAa;CAC9L,mBAAmB;EAAE,KAAK;EAAa,SAAS;EAAS,OAAO,CAAC,yBAAyB;EAAG,QAAQ,CAAC,6BAA6B;EAAG,QAAQ;CAAa;CAC3J,mBAAmB;EAAE,KAAK;EAAa,SAAS;EAAY,OAAO,CAAC;EAAG,QAAQ,CAAC;EAAG,QAAQ;CAAS;CACpG,0BAA0B;EAAE,KAAK;EAAa,SAAS;EAAY,OAAO,CAAC;EAAG,QAAQ,CAAC;EAAG,QAAQ;CAAS;CAC3G,aAAa,UAAU,mBAAmB,uBAAuB,SAAS;CAC1E,iBAAiB,UAAU,wBAAwB,iCAAiC,cAAc;CAClG,eAAe,UAAU,0BAA0B,mCAAmC,WAAW;CACjG,iBAAiB,UAAU,sBAAsB,+BAA+B,mBAAmB;CACnG,cAAc,UAAU,0BAA0B,mCAAmC,iBAAiB;CACtG,wBAAwB,UAAU,0BAA0B,mCAAmC,iBAAiB;CAChH,kBAAkB,UAAU,mBAAmB,4BAA4B,cAAc;CACzF,yBAAyB,UAAU,gBAAgB,mBAAmB,kBAAkB;CACxF,oBAAoB,UAAU,yBAAyB,4BAA4B,2BAA2B;CAC9G,uBAAuB,UAAU,kBAAkB,mCAAmC,mBAAmB;CACzG,kBAAkB,UAAU,eAAe,gBAAgB,YAAY;CACvE,iBAAiB;EAAE,KAAK;EAAgB,SAAS;EAAS,OAAO,CAAC;EAAG,QAAQ,CAAC,cAAc;EAAG,OAAO;EAA6B,QAAQ;CAAS;CACpJ,MAAM,UAAU,WAAW,WAAW,aAAa;CACnD,QAAQ,UAAU,aAAa,aAAa,iBAAiB;CAC7D,YAAY,UAAU,iBAAiB,iBAAiB,mBAAmB;CAC3E,iBAAiB,UAAU,wBAAwB,yBAAyB,eAAe;CAC3F,MAAM,UAAU,WAAW,WAAW,iBAAiB;CACvD,QAAQ,UAAU,0BAA0B,0BAA0B,eAAe;CACrF,cAAc,UAAU,qCAAqC,wCAAwC,WAAW;CAChH,eAAe,UAAU,kBAAkB,kBAAkB,iBAAiB;CAC9E,sBAAsB,UAAU,yBAAyB,yBAAyB,wBAAwB;CAC1G,QAAQ,UAAU,aAAa,aAAa,aAAa;CACzD,UAAU,UAAU,mBAAmB,mBAAmB,UAAU;CACpE,mBAAmB,UAAU,2DAA2D,2DAA2D,oBAAoB;CACvK,gBAAgB,UAAU,eAAe,eAAe,iBAAiB;CACzE,iBAAiB,UAAU,gCAAgC,gCAAgC,eAAe;CAC1G,eAAe,UAAU,gBAAgB,gBAAgB,aAAa;CACtE,6BAA6B,UAAU,yBAAyB,yBAAyB,qBAAqB;CAC9G,sBAAsB,UAAU,kBAAkB,kBAAkB,aAAa;CACjF,qBAAqB,UAAU,8BAA8B,8BAA8B,cAAc;CACzG,oBAAoB,UAAU,4BAA4B,4BAA4B,gBAAgB;CACtG,qBAAqB,UAAU,kBAAkB,mBAAmB,cAAc;CAClF,6BAA6B,UAAU,0BAA0B,2BAA2B,iBAAiB;CAC7G,iBAAiB,UAAU,8BAA8B,8BAA8B,cAAc;CACrG,iBAAiB,UAAU,eAAe,eAAe,qBAAqB;CAC9E,UAAU,UAAU,gBAAgB,gBAAgB,gBAAgB;CACpE,aAAa,UAAU,kBAAkB,kBAAkB,iBAAiB;CAC5E,gBAAgB,UAAU,mBAAmB,mBAAmB,iBAAiB;CACjF,gBAAgB,UAAU,qCAAqC,qCAAqC,cAAc;CAClH,mBAAmB,UAAU,KAAK,KAAK,gBAAgB;CAGvD,qBAAqB;EAAE,KAAK;EAAS,SAAS;EAAS,OAAO,CAAC,iBAAiB;EAAG,QAAQ,CAAC,iBAAiB;EAAG,OAAO;EAAqB,QAAQ;CAAS;AAC/J;AAEA,IAAa,WAAW,YAA2C,OAAoC;;AAGvG,IAAa,WAAgC,OAAO,KAAK,MAAM,CAAC,CAAe,QAAQ,MAAM,OAAO,EAAE,CAAC,YAAY,UAAU"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EXCLUDED, FACETS, OUT_OF_DOMAIN, facetOf } from "./facets.js";
|
|
2
|
+
import { CORE_HASH_PREFIX, CORE_VERSION, canonical, coreHash, coreJson, embedProd, embedV2, leafDiff, normProd, normV2, preserveOutOfDomain, roundTripCore } from "./core.js";
|
|
3
|
+
export { CORE_HASH_PREFIX, CORE_VERSION, EXCLUDED, FACETS, OUT_OF_DOMAIN, canonical, coreHash, coreJson, embedProd, embedV2, facetOf, leafDiff, normProd, normV2, preserveOutOfDomain, roundTripCore };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { useForm, useKitEnv, useKitServices } from "../context.js";
|
|
2
3
|
import { ensureKeys, isObj, itemId, newKey, pathKey } from "../lib/path.js";
|
|
3
4
|
import { KitIcon } from "../lib/icons.js";
|
|
4
|
-
import { useForm, useKitEnv, useKitServices } from "../context.js";
|
|
5
5
|
import { FieldLabelForContext } from "../ui/field-context.js";
|
|
6
6
|
import { Button } from "../ui/button.js";
|
|
7
7
|
import { Menu, MenuContent, MenuItem, MenuLabel, MenuSeparator, MenuTrigger, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Popover, PopoverAnchor, PopoverContent, Tooltip } from "../ui/overlay.js";
|
|
@@ -10,13 +10,13 @@ import { IssueDot, Thumb } from "./bits.js";
|
|
|
10
10
|
import { FieldShell, PeerStack } from "./field-shell.js";
|
|
11
11
|
import { INSET_LINE, InsetScope } from "./grouping.js";
|
|
12
12
|
import { FieldList } from "./field-list.js";
|
|
13
|
-
import { ItemList, arrayMove, useDragReorder } from "./item-list.js";
|
|
13
|
+
import { ItemList, OrderLockSlot, arrayMove, useDragReorder } from "./item-list.js";
|
|
14
14
|
import { CONTROLS, FallbackControl, useFieldAccess } from "./kit-field.js";
|
|
15
15
|
import * as React from "react";
|
|
16
|
-
import { IconArrowDown, IconArrowUp, IconArrowsDiagonal, IconCheck, IconChevronDown, IconChevronRight, IconCopy, IconDots, IconGripVertical, IconMinus, IconPlus, IconRowInsertBottom, IconRowInsertTop, IconTrash, IconX } from "@tabler/icons-react";
|
|
17
16
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
import { IconArrowDown, IconArrowUp, IconArrowsDiagonal, IconCheck, IconChevronDown, IconChevronRight, IconCopy, IconDots, IconGripVertical, IconMinus, IconPlus, IconRowInsertBottom, IconRowInsertTop, IconTrash, IconX } from "@tabler/icons-react";
|
|
18
18
|
import { AnimatePresence, motion } from "framer-motion";
|
|
19
|
-
//#region src/
|
|
19
|
+
//#region src/engine/array.tsx
|
|
20
20
|
/**
|
|
21
21
|
* ARRAYS — compact PREVIEW ROWS that rest closed (CPO D8 + production; V2 HEAD 9829bf1 kit/engine/array.tsx): grip ·
|
|
22
22
|
* thumb · title + subtitle · validation dot · presence · always-visible ⋯ (Move up/down, Duplicate, Add above/below,
|
|
@@ -222,7 +222,8 @@ function InlineList({ field, item, path, list, readOnly }) {
|
|
|
222
222
|
const Control = CONTROLS[item.type] ?? FallbackControl;
|
|
223
223
|
const max = field.validation?.max;
|
|
224
224
|
const ids = list.map((_, i) => `p${i}`);
|
|
225
|
-
const sort = useDragReorder(ids, (from, to) => form.setAt(path, arrayMove(list, from, to)), { disabled: readOnly });
|
|
225
|
+
const sort = useDragReorder(ids, (from, to) => form.setAt(path, arrayMove(list, from, to)), { disabled: readOnly || !!field.orderLocked });
|
|
226
|
+
const ops = useListOps(field, path, list, (next) => form.setAt(path, next));
|
|
226
227
|
const rowControl = (v, i) => /* @__PURE__ */ jsx(Control, {
|
|
227
228
|
field: {
|
|
228
229
|
...item,
|
|
@@ -242,7 +243,8 @@ function InlineList({ field, item, path, list, readOnly }) {
|
|
|
242
243
|
labelId: `${pathKey(path)}-${i}-label`,
|
|
243
244
|
sort,
|
|
244
245
|
readOnly,
|
|
245
|
-
|
|
246
|
+
orderLocked: !!field.orderLocked,
|
|
247
|
+
onRemove: () => ops.remove(i, `${item.title} ${i + 1}`),
|
|
246
248
|
children: [/* @__PURE__ */ jsx("span", {
|
|
247
249
|
id: `${pathKey(path)}-${i}-label`,
|
|
248
250
|
className: "sr-only",
|
|
@@ -268,13 +270,13 @@ function InlineList({ field, item, path, list, readOnly }) {
|
|
|
268
270
|
]
|
|
269
271
|
});
|
|
270
272
|
}
|
|
271
|
-
function InlineRow({ id, labelId, sort, children, onRemove, readOnly }) {
|
|
273
|
+
function InlineRow({ id, labelId, sort, children, onRemove, readOnly, orderLocked }) {
|
|
272
274
|
return /* @__PURE__ */ jsxs("div", {
|
|
273
275
|
ref: sort.register(id),
|
|
274
276
|
style: sort.style(id),
|
|
275
277
|
className: cn("group/il flex items-start gap-1", sort.active === id && "relative z-10"),
|
|
276
278
|
children: [
|
|
277
|
-
readOnly ? null : /* @__PURE__ */ jsx("button", {
|
|
279
|
+
readOnly ? null : orderLocked ? /* @__PURE__ */ jsx(OrderLockSlot, { className: "mt-1.5" }) : /* @__PURE__ */ jsx("button", {
|
|
278
280
|
type: "button",
|
|
279
281
|
"aria-label": "Drag to reorder",
|
|
280
282
|
...sort.handle(id),
|
|
@@ -493,7 +495,7 @@ function AddItemButton({ field, onAdd, disabled }) {
|
|
|
493
495
|
function RowList({ field, rows, readOnly, layout, mode, openId, onOpen, onCloseInline, ops, renderInline, emptyLabel, addButton, leading, rowToggle, dialogNav, menuExtra }) {
|
|
494
496
|
const sort = useDragReorder(rows.map((r) => r.id), ops.reorder, {
|
|
495
497
|
axis: layout === "grid" ? "grid" : "y",
|
|
496
|
-
disabled: readOnly,
|
|
498
|
+
disabled: readOnly || !!field.orderLocked,
|
|
497
499
|
distance: 5
|
|
498
500
|
});
|
|
499
501
|
const openRow = rows.find((r) => r.id === openId);
|
|
@@ -580,6 +582,13 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
580
582
|
warnings: 0
|
|
581
583
|
};
|
|
582
584
|
const peers = Object.entries(env.presence).filter(([k]) => k === pathKey(r.path) || k.startsWith(`${pathKey(r.path)}.`)).flatMap(([, p]) => p);
|
|
585
|
+
const nChanged = env.review?.count(r.path) ?? 0;
|
|
586
|
+
const changeBar = nChanged ? /* @__PURE__ */ jsx("span", {
|
|
587
|
+
"aria-hidden": true,
|
|
588
|
+
className: "pointer-events-none absolute inset-y-1.5 left-0 z-[1] w-0.5 rounded-full",
|
|
589
|
+
style: { background: env.review.color(r.path) ?? "var(--kit-warning)" }
|
|
590
|
+
}) : null;
|
|
591
|
+
const changedNote = nChanged ? `${nChanged} changed` : "";
|
|
583
592
|
const menu = readOnly ? null : /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, {
|
|
584
593
|
"aria-label": `${r.preview.title} actions`,
|
|
585
594
|
onClick: (e) => e.stopPropagation(),
|
|
@@ -594,13 +603,13 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
594
603
|
children: [
|
|
595
604
|
/* @__PURE__ */ jsx(MenuItem, {
|
|
596
605
|
icon: /* @__PURE__ */ jsx(IconArrowUp, { stroke: 1.5 }),
|
|
597
|
-
disabled: r.index === 0,
|
|
606
|
+
disabled: !!field.orderLocked || r.index === 0,
|
|
598
607
|
onClick: () => ops.move(r.index, -1),
|
|
599
608
|
children: "Move up"
|
|
600
609
|
}),
|
|
601
610
|
/* @__PURE__ */ jsx(MenuItem, {
|
|
602
611
|
icon: /* @__PURE__ */ jsx(IconArrowDown, { stroke: 1.5 }),
|
|
603
|
-
disabled: r.index === count - 1,
|
|
612
|
+
disabled: !!field.orderLocked || r.index === count - 1,
|
|
604
613
|
onClick: () => ops.move(r.index, 1),
|
|
605
614
|
children: "Move down"
|
|
606
615
|
}),
|
|
@@ -633,7 +642,7 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
633
642
|
})
|
|
634
643
|
]
|
|
635
644
|
})] });
|
|
636
|
-
const grip = readOnly ? null : /* @__PURE__ */ jsx("button", {
|
|
645
|
+
const grip = readOnly ? null : field.orderLocked ? /* @__PURE__ */ jsx(OrderLockSlot, { className: "h-7 items-center" }) : /* @__PURE__ */ jsx("button", {
|
|
637
646
|
type: "button",
|
|
638
647
|
"aria-label": `Reorder ${r.preview.title}`,
|
|
639
648
|
onClick: (e) => e.stopPropagation(),
|
|
@@ -698,7 +707,8 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
698
707
|
errors: roll.errors,
|
|
699
708
|
warnings: roll.warnings,
|
|
700
709
|
className: "absolute left-2 top-2 ring-2 ring-kit-surface"
|
|
701
|
-
})
|
|
710
|
+
}),
|
|
711
|
+
changeBar
|
|
702
712
|
]
|
|
703
713
|
})
|
|
704
714
|
});
|
|
@@ -733,9 +743,12 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
733
743
|
className: "shrink-0 rounded-kit-md bg-kit-muted px-1 text-kit-2xs font-medium text-kit-fg-2",
|
|
734
744
|
children: r.chip
|
|
735
745
|
}) : null]
|
|
736
|
-
}), r.extra ?? r.preview.subtitle ? /* @__PURE__ */
|
|
746
|
+
}), (r.extra ?? r.preview.subtitle) || changedNote ? /* @__PURE__ */ jsxs("span", {
|
|
737
747
|
className: "block truncate text-kit-xs text-kit-fg-3",
|
|
738
|
-
children:
|
|
748
|
+
children: [changedNote ? /* @__PURE__ */ jsxs("span", {
|
|
749
|
+
className: "text-kit-fg-2",
|
|
750
|
+
children: [changedNote, r.extra ?? r.preview.subtitle ? " · " : ""]
|
|
751
|
+
}) : null, r.extra ?? r.preview.subtitle]
|
|
739
752
|
}) : null]
|
|
740
753
|
})] });
|
|
741
754
|
const rowInner = /* @__PURE__ */ jsxs("div", {
|
|
@@ -744,7 +757,7 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
744
757
|
if (!onOpen || !e.currentTarget.contains(target) || target.closest("button,[role^=menuitem],a,input")) return;
|
|
745
758
|
onOpen();
|
|
746
759
|
},
|
|
747
|
-
className: cn("group/row flex min-h-12 items-center gap-2 py-1.5 pl-1.5 pr-2 transition-colors"
|
|
760
|
+
className: cn(onOpen ? "group/row flex min-h-12 cursor-pointer items-center gap-2 py-1.5 pl-1.5 pr-2 transition-colors" : "group/row flex min-h-12 items-center gap-2 py-1.5 pl-1.5 pr-2 transition-colors", open ? "bg-kit-subtle" : onOpen && "hover:bg-kit-subtle"),
|
|
748
761
|
children: [
|
|
749
762
|
grip,
|
|
750
763
|
toggle,
|
|
@@ -755,7 +768,7 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
755
768
|
"aria-expanded": mode === "drill" ? void 0 : open,
|
|
756
769
|
"aria-controls": inlineMode && open ? bodyId : void 0,
|
|
757
770
|
"aria-haspopup": mode === "popover" || mode === "dialog" ? "dialog" : void 0,
|
|
758
|
-
"aria-label": `${verb} ${r.preview.title}${r.chip ? `, ${r.chip}` : ""}, ${r.index + 1} of ${count}`,
|
|
771
|
+
"aria-label": `${verb} ${r.preview.title}${r.chip ? `, ${r.chip}` : ""}${changedNote ? `, ${changedNote}` : ""}, ${r.index + 1} of ${count}`,
|
|
759
772
|
className: "flex min-w-0 flex-1 items-center gap-2.5 rounded-kit-md text-left outline-none",
|
|
760
773
|
children: titleInner
|
|
761
774
|
}) : /* @__PURE__ */ jsx("div", {
|
|
@@ -775,12 +788,12 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
775
788
|
trailing
|
|
776
789
|
]
|
|
777
790
|
});
|
|
778
|
-
return /* @__PURE__ */
|
|
791
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
779
792
|
ref: sort.register(r.id),
|
|
780
793
|
style: sort.style(r.id),
|
|
781
794
|
"data-row-id": r.id,
|
|
782
795
|
className: cn("relative border-b border-kit-line-subtle bg-kit-surface last:border-b-0", isDragging && "z-10 rounded-kit-lg shadow-kit-lg ring-1 ring-kit-line-strong"),
|
|
783
|
-
children: /* @__PURE__ */ jsxs(motion.div, {
|
|
796
|
+
children: [changeBar, /* @__PURE__ */ jsxs(motion.div, {
|
|
784
797
|
layout: !isDragging && !dragging ? "position" : false,
|
|
785
798
|
initial: dragging ? false : {
|
|
786
799
|
opacity: 0,
|
|
@@ -856,7 +869,7 @@ function Row({ r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, l
|
|
|
856
869
|
})
|
|
857
870
|
}) : null
|
|
858
871
|
}) : null]
|
|
859
|
-
})
|
|
872
|
+
})]
|
|
860
873
|
});
|
|
861
874
|
}
|
|
862
875
|
/** The included / not-included check on a feature row (D47): a real checkbox, outside the row's open button. */
|
|
@@ -875,7 +888,7 @@ function RowCheck({ on, label, title, readOnly, onToggle }) {
|
|
|
875
888
|
},
|
|
876
889
|
className: "group/chk flex size-7 shrink-0 items-center justify-center rounded-kit-md transition-colors hover:bg-kit-hover disabled:pointer-events-none",
|
|
877
890
|
children: /* @__PURE__ */ jsx("span", {
|
|
878
|
-
className: cn("flex size-[18px] items-center justify-center rounded-full transition-colors", on ? "bg-kit-
|
|
891
|
+
className: cn("flex size-[18px] items-center justify-center rounded-full transition-colors", on ? "bg-kit-control-checked text-kit-fg-inverse" : "border border-dashed border-kit-field-border-hover text-kit-fg-3 group-hover/chk:border-[var(--kit-emphasis-line)]"),
|
|
879
892
|
children: on ? /* @__PURE__ */ jsx(IconCheck, {
|
|
880
893
|
className: "size-3",
|
|
881
894
|
stroke: 2.5
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.js","names":[],"sources":["../../src/engine/array.tsx"],"sourcesContent":["/**\n * ARRAYS — compact PREVIEW ROWS that rest closed (CPO D8 + production; V2 HEAD 9829bf1 kit/engine/array.tsx): grip ·\n * thumb · title + subtitle · validation dot · presence · always-visible ⋯ (Move up/down, Duplicate, Add above/below,\n * Remove). Opening a row follows ONE rule (CPO D43): ≤3 simple fields expand inline, else it drills in (`openMode`\n * overrides). Reorder by drag with layout animation; delete with an Undo toast; \"Add {noun}\" (a type menu when several\n * item types); min/max honoured.\n * Arrays of primitives render as a gallery (images), reference chips, or — for text, numbers and URLs — the ITEM LIST\n * (CPO D47): one input per row, no drill. Arrays of one-field objects (`[{ text }]`) use the same item list. Small\n * objects with an `included` / `isIncluded` switch get that switch as a check on the row itself.\n *\n * Host wiring (RowsHostContext): a drill row calls `drill(path)` (the frame push); without one it falls back to\n * `form.navigate` while the form draws frames (`form.canNavigate`), else drill rows are inert (no button, no ›).\n * Dialog items render the host's `NestedForm` (V2 kit-field NestedForm: its own navigation stack); without one the\n * dialog shows the item's FieldList.\n *\n * Kit deviations from V2: sorting is `useDragReorder` (no @dnd-kit in the kit; it keeps dnd-kit's pointer and keyboard\n * sensor semantics: Space / Enter picks up, arrows move, Space / Enter drops as one write, Escape cancels; the table editor's cross-list drag via\n * `sortableId` is not ported); toasts come from KitServices (absent → silent); the gallery and reference-chip controls come from\n * ARRAY_CONTROLS (registered by the controls lane); a host that never registered them edits the raw list (FallbackControl).\n */\nimport * as React from \"react\";\nimport type { ComponentType } from \"react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport {\n IconArrowDown, IconArrowUp, IconArrowsDiagonal, IconCheck, IconChevronDown, IconChevronRight, IconCopy, IconDots, IconGripVertical, IconMinus, IconPlus, IconRowInsertBottom, IconRowInsertTop, IconTrash, IconX,\n} from \"@tabler/icons-react\";\nimport { Button } from \"../ui/button\";\nimport { Menu, MenuContent, MenuItem, MenuLabel, MenuSeparator, MenuTrigger, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Popover, PopoverAnchor, PopoverContent, Tooltip } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldPath, FieldSchema } from \"../schema/types\";\nimport type { ControlProps } from \"../types\";\nimport { useForm, useKitEnv, useKitServices } from \"../context\";\nimport { ensureKeys, isObj, itemId, newKey, pathKey } from \"../lib/path\";\nimport { initialFor, itemNoun, itemOpenMode, itemSchemaFor, itemSchemas, newItem, previewOf, primitiveItem, type Preview } from \"../lib/schema\";\nimport { IssueDot, Thumb } from \"./bits\";\nimport { KitIcon } from \"../lib/icons\";\nimport { FieldShell, PeerStack } from \"./field-shell\";\nimport { FieldLabelForContext } from \"../ui/field-context\";\nimport { FieldList } from \"./field-list\";\nimport { INSET_LINE, InsetScope } from \"./grouping\";\nimport { arrayMove, ItemList, OrderLockSlot, useDragReorder, type ItemKind, type ItemListAdapter } from \"./item-list\";\nimport { CONTROLS, FallbackControl, useFieldAccess } from \"./kit-field\";\n\n/* ── Host wiring ───────────────────────────────────────────────────── */\n/** V2 kit-field NestedForm's props: a dialog's own SchemaForm over `fields`, writing into the parent form at `path`. */\nexport interface NestedFormProps {\n fields: FieldSchema[];\n title: string;\n icon?: string;\n path: FieldPath;\n navRef?: React.Ref<{ back: () => boolean }>;\n}\nexport interface RowsHost {\n /** Push a frame for an item / block path (F7b frames). Default: `form.navigate` while `form.canNavigate`. */\n drill?: (path: FieldPath) => void;\n /** Dialog-mode items: V2's NestedForm (own navigation stack). Default: the item's FieldList. */\n NestedForm?: ComponentType<NestedFormProps>;\n}\nexport const RowsHostContext = React.createContext<RowsHost>({});\n/** The frame push for a drill row, or undefined when nothing can draw the frame (the row is then inert). */\nexport function useDrill(): ((path: FieldPath) => void) | undefined {\n const host = React.useContext(RowsHostContext);\n const form = useForm();\n return host.drill ?? (form?.canNavigate ? form.navigate : undefined);\n}\n\n/** Primitive-array controls V2 imports from controls/media (GalleryControl) and controls/reference (ReferencesControl). */\nexport const ARRAY_CONTROLS: { gallery?: ComponentType<ControlProps>; references?: ComponentType<ControlProps> } = {};\n\nconst plural = (noun: string) => (noun.endsWith(\"y\") && !/[aeiou]y$/.test(noun) ? `${noun.slice(0, -1)}ies` : noun.endsWith(\"s\") ? noun : `${noun}s`);\n\nexport function ArrayField({ field, path }: { field: FieldSchema; path: FieldPath; parent?: Record<string, unknown> }) {\n const prim = primitiveItem(field);\n if (prim) return <PrimitiveArray field={field} item={prim} path={path} />;\n const one = oneFieldItem(field);\n if (one) return <OneFieldArray field={field} item={one.item} inner={one.inner} path={path} />;\n return <ObjectArray field={field} path={path} />;\n}\n\n/** Item types that edit as one line in the item list. */\nconst LIST_KIND: Partial<Record<FieldSchema[\"type\"], ItemKind>> = { string: \"text\", text: \"text\", slug: \"text\", url: \"url\", email: \"email\", number: \"number\" };\n\n/** `[{ _key, text }]` — an object item with exactly one line-like field edits as the item list (unless the schema forces another open mode). */\nfunction oneFieldItem(field: FieldSchema): { item: FieldSchema; inner: FieldSchema } | undefined {\n if (field.openMode && field.openMode !== \"inline\") return undefined;\n const of = itemSchemas(field);\n const item = of.length === 1 ? of[0] : undefined;\n const inner = item?.type === \"object\" && item.fields?.length === 1 ? item.fields[0] : undefined;\n return item && inner && LIST_KIND[inner.type] && !inner.scale ? { item, inner } : undefined;\n}\n\n/** The boolean an item shows as a check on its row (\"included\" in a feature list). */\nconst ROW_TOGGLE = /^(is)?included$/i;\nexport const rowToggleField = (s?: FieldSchema) => s?.fields?.find((f) => f.type === \"boolean\" && ROW_TOGGLE.test(f.name));\n\n/** List meta on the message line: \"3 items · max 6\". */\nfunction listMeta(n: number, field: FieldSchema) {\n const { min, max } = field.validation ?? {};\n const base = `${n} ${n === 1 ? \"item\" : \"items\"}`;\n return max != null ? `${base} · max ${max}` : min != null ? `${base} · min ${min}` : n ? base : \"\";\n}\n\n/* ── Primitive arrays ──────────────────────────────────────────────── */\nfunction PrimitiveArray({ field, item, path }: { field: FieldSchema; item: FieldSchema; path: FieldPath }) {\n const form = useForm()!;\n const id = React.useId();\n const { readOnly } = useFieldAccess(field);\n const key = pathKey(path);\n const value = form.getAt(path);\n const list = Array.isArray(value) ? value : [];\n const onChange = (v: unknown) => form.setAt(path, v);\n const props = { field, value: list, onChange, id, readOnly, path, onBlur: () => form.touch(key) };\n const kind = LIST_KIND[item.type];\n const adapter = React.useMemo<ItemListAdapter | undefined>(\n () =>\n kind\n ? {\n kind,\n read: (v) => (v == null ? \"\" : String(v)),\n write: (v) => v,\n valuePath: (i) => [i],\n placeholder: item.placeholder ?? (item.title && !/^(item|value)$/i.test(item.title) ? item.title : undefined),\n }\n : undefined,\n [kind, item.placeholder, item.title],\n );\n const Gallery = ARRAY_CONTROLS.gallery;\n const References = ARRAY_CONTROLS.references;\n const control =\n item.type === \"image\" ? (Gallery ? <Gallery {...props} /> : <FallbackControl {...props} />) :\n item.type === \"reference\" ? (References ? <References {...props} field={{ ...field, reference: item.reference }} /> : <FallbackControl {...props} />) :\n adapter ? <ItemList field={field} path={path} list={list} readOnly={readOnly} adapter={adapter} inputId={id} /> :\n <InlineList field={field} item={item} path={path} list={list} readOnly={readOnly} />;\n return (\n <FieldShell field={field} path={path} id={id} value={list} onChange={onChange} readOnly={readOnly} issue={form.visibleIssue(key)} meta={item.type === \"reference\" ? undefined : <span className=\"text-kit-xs text-kit-fg-3\">{listMeta(list.length, field)}</span>}>\n <div className=\"@container\">{control}</div>\n </FieldShell>\n );\n}\n\n/* ── One-field object arrays: same item list, value lives at item[inner.name] ── */\nfunction OneFieldArray({ field, item, inner, path }: { field: FieldSchema; item: FieldSchema; inner: FieldSchema; path: FieldPath }) {\n const form = useForm()!;\n const id = React.useId();\n const { readOnly } = useFieldAccess(field);\n const key = pathKey(path);\n const value = form.getAt(path);\n const list = Array.isArray(value) ? value : [];\n const adapter = React.useMemo<ItemListAdapter>(\n () => ({\n kind: LIST_KIND[inner.type]!,\n read: (v) => {\n const x = isObj(v) ? v[inner.name] : undefined;\n return x == null ? \"\" : String(x);\n },\n write: (v, prev) => ({ ...(isObj(prev) ? prev : (newItem(field, item) as object)), [inner.name]: v }),\n keyOf: (v) => (isObj(v) && typeof v._key === \"string\" ? v._key : undefined),\n valuePath: (i) => [i, inner.name],\n placeholder: inner.placeholder ?? item.preview?.fallback?.replace(/^Untitled /i, \"\").replace(/^./, (c) => c.toUpperCase()),\n }),\n [field, item, inner],\n );\n // legacy rows without `_key` get one on first render so rows stay stable while typing and dragging\n React.useEffect(() => {\n if (!readOnly && list.some((it) => isObj(it) && typeof it._key !== \"string\")) form.setAt(path, ensureKeys(list));\n }, [list, readOnly]); // eslint-disable-line react-hooks/exhaustive-deps\n return (\n <FieldShell field={field} path={path} id={id} value={list} onChange={(v) => form.setAt(path, v)} readOnly={readOnly} issue={form.visibleIssue(key)} meta={<span className=\"text-kit-xs text-kit-fg-3\">{listMeta(list.length, field)}</span>}>\n <div className=\"@container\">\n <ItemList field={field} path={path} list={list} readOnly={readOnly} adapter={adapter} inputId={id} />\n </div>\n </FieldShell>\n );\n}\n\nfunction InlineList({ field, item, path, list, readOnly }: { field: FieldSchema; item: FieldSchema; path: FieldPath; list: unknown[]; readOnly: boolean }) {\n const form = useForm()!;\n const Control = CONTROLS[item.type] ?? FallbackControl;\n const max = field.validation?.max;\n const ids = list.map((_, i) => `p${i}`);\n const sort = useDragReorder(ids, (from, to) => form.setAt(path, arrayMove(list, from, to)), { disabled: readOnly || !!field.orderLocked });\n // The same remove the preview rows have: an Undo toast that puts the row back at its index (D-10a issue 10).\n const ops = useListOps(field, path, list, (next) => form.setAt(path, next));\n const rowControl = (v: unknown, i: number) => (\n <Control field={{ ...item, title: `${item.title} ${i + 1}` }} value={v} onChange={(n) => form.setAt([...path, i], n)} id={`${pathKey(path)}-${i}`} path={[...path, i]} readOnly={readOnly} />\n );\n return (\n <div className=\"flex flex-col gap-1.5\">\n {list.map((v, i) => (\n <InlineRow key={ids[i]} id={ids[i]} labelId={`${pathKey(path)}-${i}-label`} sort={sort} readOnly={readOnly} orderLocked={!!field.orderLocked} onRemove={() => ops.remove(i, `${item.title} ${i + 1}`)}>\n {/* V2 draws no label on a row, so the row's name is an sr-only span (no <label> element) at the id a FieldShell's\n label has (`${id}-label`): aria-labelledby controls (rich text) and the row group read it, and the kit\n Input/Textarea/Select/Switch/Checkbox whose id is the row's take it through FieldLabelForContext (<label for>\n semantics without the element) */}\n <span id={`${pathKey(path)}-${i}-label`} className=\"sr-only\">{`${item.title} ${i + 1}`}</span>\n <FieldLabelForContext.Provider value={{ htmlFor: `${pathKey(path)}-${i}`, labelId: `${pathKey(path)}-${i}-label` }}>\n {rowControl(v, i)}\n </FieldLabelForContext.Provider>\n </InlineRow>\n ))}\n {sort.a11y}\n {readOnly ? null : (\n <Button size=\"sm\" variant=\"ghost\" className=\"self-start text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={max != null && list.length >= max} onClick={() => form.setAt(path, [...list, initialFor(item)])}>\n Add {itemNoun(field)}\n </Button>\n )}\n </div>\n );\n}\nfunction InlineRow({ id, labelId, sort, children, onRemove, readOnly, orderLocked }: { id: string; labelId: string; sort: ReturnType<typeof useDragReorder>; children: React.ReactNode; onRemove: () => void; readOnly: boolean; orderLocked?: boolean }) {\n return (\n <div ref={sort.register(id)} style={sort.style(id)} className={cn(\"group/il flex items-start gap-1\", sort.active === id && \"relative z-10\")}>\n {readOnly ? null : orderLocked ? (\n <OrderLockSlot className=\"mt-1.5\" />\n ) : (\n <button type=\"button\" aria-label=\"Drag to reorder\" {...sort.handle(id)} className=\"mt-1.5 flex h-5 w-4 shrink-0 cursor-grab touch-none items-center justify-center text-kit-fg-4 hover:text-kit-fg-2 active:cursor-grabbing\">\n <IconGripVertical className=\"size-3.5\" stroke={1.5} />\n </button>\n )}\n <div role=\"group\" aria-labelledby={labelId} className=\"min-w-0 flex-1\">{children}</div>\n {readOnly ? null : (\n <Tooltip content=\"Remove\">\n <button type=\"button\" aria-label=\"Remove\" onClick={onRemove} className=\"mt-1 flex size-6 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 opacity-0 transition-opacity hover:bg-kit-hover hover:text-kit-fg focus-visible:opacity-100 group-hover/il:opacity-100\">\n <IconX className=\"size-3.5\" stroke={1.5} />\n </button>\n </Tooltip>\n )}\n </div>\n );\n}\n\n/* ── Object arrays: preview rows ───────────────────────────────────── */\nexport interface RowModel {\n id: string;\n index: number;\n item: unknown;\n preview: Preview;\n path: FieldPath;\n chip?: string;\n extra?: string;\n /** an included-style switch that is OFF: the title reads muted */\n dim?: boolean;\n}\n\nfunction ObjectArray({ field, path }: { field: FieldSchema; path: FieldPath }) {\n const form = useForm()!;\n const host = React.useContext(RowsHostContext);\n const drill = useDrill();\n const id = React.useId();\n const { readOnly } = useFieldAccess(field);\n const key = pathKey(path);\n const value = form.getAt(path);\n const list = Array.isArray(value) ? value : [];\n const of = itemSchemas(field);\n const mode = itemOpenMode(field);\n const rows: RowModel[] = list.map((it, i) => {\n const s = itemSchemaFor(field, it);\n const tf = rowToggleField(s);\n return {\n id: itemId(it, i), index: i, item: it, preview: previewOf(s, it, i, s?.title ?? itemNoun(field)), path: [...path, i], chip: of.length > 1 ? s?.title : undefined,\n dim: tf ? isObj(it) && it[tf.name] === false : undefined,\n };\n });\n const write = (next: unknown[]) => form.setAt(path, ensureKeys(next));\n const ops = useListOps(field, path, list, write, (i) => (mode === \"drill\" ? drill?.([...path, i]) : undefined));\n const [openId, setOpenId] = React.useState<string | null>(null);\n const dialogNav = React.useRef<{ back: () => boolean }>(null);\n const Nested = host.NestedForm;\n return (\n <FieldShell field={field} path={path} id={id} value={list} onChange={(v) => form.setAt(path, v)} readOnly={readOnly} issue={form.visibleIssue(key)} meta={<span className=\"text-kit-xs text-kit-fg-3\">{listMeta(list.length, field)}</span>}>\n <RowList\n field={field}\n rows={rows}\n readOnly={readOnly}\n layout={field.arrayLayout ?? \"list\"}\n mode={mode}\n openId={openId}\n onOpen={\n mode === \"drill\"\n ? drill && ((r) => drill(r.path))\n : (r) => setOpenId(openId === r.id ? null : r.id)\n }\n onCloseInline={() => setOpenId(null)}\n ops={ops}\n dialogNav={dialogNav}\n rowToggle={(r) => {\n const tf = rowToggleField(itemSchemaFor(field, r.item));\n if (!tf) return null;\n const on = isObj(r.item) && r.item[tf.name] !== false;\n return <RowCheck on={on} label={tf.title} title={r.preview.title} readOnly={readOnly} onToggle={() => form.setAt([...r.path, tf.name], !on)} />;\n }}\n renderInline={(r) => {\n const s = itemSchemaFor(field, r.item);\n // dialogs get their own navigation stack (nested lists drill inside the dialog)\n if (mode === \"dialog\" && Nested) return <Nested fields={s?.fields ?? []} title={r.preview.title} icon={s?.icon} path={r.path} navRef={dialogNav} />;\n // the row's own check IS the included switch — don't repeat it in the card\n const tf = rowToggleField(s);\n return <FieldList fields={(s?.fields ?? []).filter((f) => f !== tf)} basePath={r.path} memoryKey={`inl:${pathKey(r.path)}`} />;\n }}\n emptyLabel={`No ${plural(itemNoun(field))} yet.`}\n addButton={<AddItemButton field={field} disabled={readOnly || (field.validation?.max != null && list.length >= field.validation.max)} onAdd={ops.add} />}\n />\n </FieldShell>\n );\n}\n\n/** Shared list operations (arrays and slots). Remove shows an Undo toast; add can drill into the new item. */\nexport function useListOps(field: FieldSchema, _path: FieldPath, list: unknown[], write: (next: unknown[]) => void, afterAdd?: (index: number) => void) {\n const { toast } = useKitServices();\n const { min, max } = field.validation ?? {};\n const atMax = max != null && list.length >= max;\n const atMin = min != null && list.length <= min;\n const limit = () => toast?.(\"Limit reached\", { description: `${field.title} allows ${max} at most.` });\n return {\n atMax,\n atMin,\n add: (item: unknown, at = list.length) => {\n if (atMax) return limit();\n const next = [...list.slice(0, at), item, ...list.slice(at)];\n write(next);\n window.setTimeout(() => afterAdd?.(at), 0);\n },\n duplicate: (i: number) => {\n if (atMax) return limit();\n const copy = isObj(list[i]) ? { ...(structuredClone(list[i]) as object), _key: newKey() } : list[i];\n write([...list.slice(0, i + 1), copy, ...list.slice(i + 1)]);\n },\n move: (i: number, d: -1 | 1) => write(arrayMove(list, i, i + d)),\n reorder: (from: number, to: number) => write(arrayMove(list, from, to)),\n remove: (i: number, title: string) => {\n if (atMin) return toast?.(`At least ${min} required`, { description: `${field.title} needs ${min} or more.` });\n const prev = list;\n write(list.filter((_, j) => j !== i));\n toast?.(`“${title}” removed`, { action: { label: \"Undo\", onClick: () => write(prev) }, duration: 10_000 });\n },\n insertBlank: (at: number) => {\n const s = itemSchemas(field)[0];\n if (!s || atMax) return;\n const next = [...list.slice(0, at), newItem(field, s), ...list.slice(at)];\n write(next);\n },\n };\n}\nexport type ListOps = ReturnType<typeof useListOps>;\n\nfunction AddItemButton({ field, onAdd, disabled }: { field: FieldSchema; onAdd: (item: unknown) => void; disabled?: boolean }) {\n const of = itemSchemas(field);\n const noun = itemNoun(field);\n if (of.length <= 1)\n return (\n <Button size=\"sm\" variant=\"ghost\" className=\"text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={disabled} onClick={() => of[0] && onAdd(newItem(field, of[0]))}>\n Add {noun}\n </Button>\n );\n return (\n <Menu>\n <MenuTrigger render={<Button size=\"sm\" variant=\"ghost\" className=\"text-kit-fg-2\" leftIcon={<IconPlus stroke={1.5} />} disabled={disabled} />}>Add {noun}</MenuTrigger>\n <MenuContent align=\"start\" className=\"w-64\">\n <MenuLabel>Add to {field.title.toLowerCase()}</MenuLabel>\n {of.map((s) => (\n <MenuItem key={s.name} icon={<KitIcon name={s.icon} />} onClick={() => onAdd(newItem(field, s))} className=\"h-auto py-1.5\">\n <span className=\"flex flex-col\">\n <span>{s.title}</span>\n {s.description ? <span className=\"whitespace-normal text-kit-xs text-kit-fg-3\">{s.description}</span> : null}\n </span>\n </MenuItem>\n ))}\n </MenuContent>\n </Menu>\n );\n}\n\n/** The row list used by arrays AND slots. Without `onOpen` the rows are inert (a drill nothing can draw yet). */\nexport function RowList({\n field,\n rows,\n readOnly,\n layout,\n mode,\n openId,\n onOpen,\n onCloseInline,\n ops,\n renderInline,\n emptyLabel,\n addButton,\n leading,\n rowToggle,\n dialogNav,\n menuExtra,\n}: {\n dialogNav?: React.RefObject<{ back: () => boolean } | null>;\n field: FieldSchema;\n rows: RowModel[];\n readOnly: boolean;\n layout: \"list\" | \"grid\";\n mode: ReturnType<typeof itemOpenMode>;\n openId: string | null;\n onOpen?: (r: RowModel) => void;\n onCloseInline: () => void;\n ops: ListOps;\n renderInline: (r: RowModel) => React.ReactNode;\n emptyLabel: string;\n addButton: React.ReactNode;\n leading?: (r: RowModel) => React.ReactNode;\n /** a control BEFORE the title button (never inside it): the included check of feature rows */\n rowToggle?: (r: RowModel) => React.ReactNode;\n /** extra items in a row's ⋯ menu, above Remove (a table row's \"Move to group\") */\n menuExtra?: (r: RowModel) => React.ReactNode;\n}) {\n const sort = useDragReorder(rows.map((r) => r.id), ops.reorder, { axis: layout === \"grid\" ? \"grid\" : \"y\", disabled: readOnly || !!field.orderLocked, distance: 5 });\n const openRow = rows.find((r) => r.id === openId);\n if (rows.length === 0)\n return (\n <div className=\"flex flex-col items-center gap-2 rounded-kit-lg border border-dashed border-kit-line-strong px-4 py-5 text-center\">\n <span className=\"text-kit-sm text-kit-fg-3\">{emptyLabel}</span>\n {readOnly ? null : addButton}\n </div>\n );\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className={cn(layout === \"grid\" ? \"grid grid-cols-2 gap-1.5 @[520px]:grid-cols-3\" : \"overflow-hidden rounded-kit-lg border border-kit-line bg-kit-surface\")}>\n <AnimatePresence initial={false}>\n {rows.map((r) => (\n <Row\n key={r.id}\n r={r}\n count={rows.length}\n field={field}\n readOnly={readOnly}\n grid={layout === \"grid\"}\n mode={mode}\n open={openId === r.id}\n onOpen={onOpen ? () => onOpen(r) : undefined}\n ops={ops}\n sort={sort}\n leading={leading?.(r)}\n toggle={rowToggle?.(r)}\n extra={menuExtra?.(r)}\n inline={mode === \"inline\" && openId === r.id ? renderInline(r) : null}\n popover={mode === \"popover\" && openId === r.id ? renderInline(r) : null}\n onClosePopover={onCloseInline}\n />\n ))}\n </AnimatePresence>\n </div>\n {sort.a11y}\n {readOnly ? null : <div className=\"flex items-center\">{addButton}</div>}\n {mode === \"dialog\" && openRow ? (\n <Modal\n open\n onOpenChange={(o, d) => {\n if (o) return;\n // Escape steps back inside the dialog's own frames first\n if (d.reason === \"escape-key\" && dialogNav?.current?.back()) return d.cancel();\n onCloseInline();\n }}\n >\n <ModalContent size=\"lg\">\n <ModalHeader title={openRow.preview.title} description={`${field.title} · ${openRow.index + 1} of ${rows.length}`} icon={<KitIcon name={openRow.preview.icon ?? field.icon} />} />\n <ModalBody className=\"flex min-h-[320px] flex-col gap-5\">{renderInline(openRow)}</ModalBody>\n <ModalFooter>\n <span className=\"mr-auto text-kit-xs text-kit-fg-3\">Changes save as you type</span>\n <Button variant=\"primary\" onClick={onCloseInline}>Done</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n ) : null}\n </div>\n );\n}\n\nfunction Row({\n r, count, field, readOnly, grid, mode, open, onOpen, ops, sort, leading, toggle, extra, inline, popover, onClosePopover,\n}: {\n r: RowModel; count: number; field: FieldSchema; readOnly: boolean; grid: boolean; mode: string; open: boolean; onOpen?: () => void; ops: ListOps;\n sort: ReturnType<typeof useDragReorder>; leading?: React.ReactNode; toggle?: React.ReactNode; extra?: React.ReactNode; inline: React.ReactNode; popover: React.ReactNode; onClosePopover: () => void;\n}) {\n const form = useForm(); // null when a RowList is used outside a kit form (a table in a design-system demo)\n const env = useKitEnv();\n /* V2 used `${r.id}-body`; ids without a _key fall back to i0, i1… and sample data reuses _keys across lists, so two\n arrays could share an id and aria-controls would point at the wrong body. The useId prefix keeps it unique. */\n const uid = React.useId();\n const isDragging = sort.active === r.id;\n // while anything is being dragged, rows move without the enter / exit height animation and without layout animation\n const dragging = sort.active != null;\n const roll = form?.rollup(r.path) ?? { errors: 0, warnings: 0 };\n const peers = Object.entries(env.presence).filter(([k]) => k === pathKey(r.path) || k.startsWith(`${pathKey(r.path)}.`)).flatMap(([, p]) => p);\n /* D61 Review changes: a changed item gets the author-colour bar on its row edge and \"2 changed\" in its summary */\n const nChanged = env.review?.count(r.path) ?? 0;\n const changeBar = nChanged ? <span aria-hidden className=\"pointer-events-none absolute inset-y-1.5 left-0 z-[1] w-0.5 rounded-full\" style={{ background: env.review!.color(r.path) ?? \"var(--kit-warning)\" }} /> : null;\n const changedNote = nChanged ? `${nChanged} changed` : \"\";\n const menu = readOnly ? null : (\n <Menu>\n <MenuTrigger\n aria-label={`${r.preview.title} actions`}\n onClick={(e) => e.stopPropagation()}\n className=\"flex size-7 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg data-[popup-open]:bg-kit-hover data-[popup-open]:text-kit-fg\"\n >\n <IconDots className=\"size-4\" stroke={1.5} />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"w-52\">\n <MenuItem icon={<IconArrowUp stroke={1.5} />} disabled={!!field.orderLocked || r.index === 0} onClick={() => ops.move(r.index, -1)}>Move up</MenuItem>\n <MenuItem icon={<IconArrowDown stroke={1.5} />} disabled={!!field.orderLocked || r.index === count - 1} onClick={() => ops.move(r.index, 1)}>Move down</MenuItem>\n <MenuSeparator />\n <MenuItem icon={<IconCopy stroke={1.5} />} disabled={ops.atMax} onClick={() => ops.duplicate(r.index)}>{ops.atMax ? \"Duplicate · limit reached\" : \"Duplicate\"}</MenuItem>\n {field.type === \"array\" ? (\n <>\n <MenuItem icon={<IconRowInsertTop stroke={1.5} />} disabled={ops.atMax} onClick={() => ops.insertBlank(r.index)}>Add item above</MenuItem>\n <MenuItem icon={<IconRowInsertBottom stroke={1.5} />} disabled={ops.atMax} onClick={() => ops.insertBlank(r.index + 1)}>Add item below</MenuItem>\n </>\n ) : null}\n {extra ? (\n <>\n <MenuSeparator />\n {extra}\n </>\n ) : null}\n <MenuSeparator />\n <MenuItem danger icon={<IconTrash stroke={1.5} />} disabled={ops.atMin} onClick={() => ops.remove(r.index, r.preview.title)}>{ops.atMin ? `Remove · at least ${field.validation?.min} required` : \"Remove\"}</MenuItem>\n </MenuContent>\n </Menu>\n );\n const grip = readOnly ? null : field.orderLocked ? (\n <OrderLockSlot className=\"h-7 items-center\" />\n ) : (\n <button\n type=\"button\"\n aria-label={`Reorder ${r.preview.title}`}\n onClick={(e) => e.stopPropagation()}\n {...sort.handle(r.id)}\n className=\"relative flex h-7 w-4 shrink-0 cursor-grab touch-none items-center justify-center text-kit-fg-4 transition-colors before:absolute before:-inset-2 hover:text-kit-fg-2 active:cursor-grabbing\"\n >\n <IconGripVertical className=\"size-3.5\" stroke={1.5} />\n </button>\n );\n if (grid) {\n const tile = (\n <>\n <span className=\"flex aspect-[4/3] items-center justify-center bg-kit-muted\">\n {r.preview.media ? <img src={r.preview.media} alt=\"\" className=\"size-full object-cover\" /> : <KitIcon name={r.preview.icon ?? field.icon} className=\"size-5 text-kit-fg-3\" />}\n </span>\n <span className=\"block truncate px-2 pb-1.5 pt-1.5 text-kit-xs font-medium text-kit-fg\">{r.preview.title}</span>\n </>\n );\n return (\n <div ref={sort.register(r.id)} style={sort.style(r.id)} className={cn(\"relative\", isDragging && \"z-10\")}>\n <motion.div\n layout={!isDragging ? \"position\" : false}\n initial={{ opacity: 0, scale: 0.97 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.97 }}\n className={cn(\"group/row relative overflow-hidden rounded-kit-lg border border-kit-line bg-kit-surface transition-colors hover:border-kit-line-strong\", isDragging && \"shadow-kit-lg\")}\n >\n {onOpen ? (\n <button type=\"button\" onClick={onOpen} aria-label={`Open ${r.preview.title}, ${r.index + 1} of ${count}`} aria-haspopup={mode === \"popover\" || mode === \"dialog\" ? \"dialog\" : undefined} className=\"block w-full text-left\">\n {tile}\n </button>\n ) : (\n <div className=\"block w-full text-left\">{tile}</div>\n )}\n <div className=\"absolute right-1 top-1 flex items-center gap-0.5 rounded-kit-md bg-kit-surface/90 opacity-0 shadow-kit-xs transition-opacity group-hover/row:opacity-100 [@media(pointer:coarse)]:opacity-100\">\n {grip}\n {menu}\n </div>\n <IssueDot errors={roll.errors} warnings={roll.warnings} className=\"absolute left-2 top-2 ring-2 ring-kit-surface\" />\n {changeBar}\n </motion.div>\n </div>\n );\n }\n /* CPO D43 — a row says what opening it does: › drills into a new frame, ⌄ expands in place (rotates when open),\n ⧉ opens a popover or dialog. The WHOLE row is the hit area (hover tint); the title button carries focus,\n Enter / Space and the label (\"Open Starter\" / \"Expand Net-60 terms\"). */\n const inlineMode = mode === \"inline\";\n const bodyId = `${uid}${r.id}-body`;\n const verb = inlineMode ? (open ? \"Collapse\" : \"Expand\") : \"Open\";\n const trailing = !onOpen ? null : inlineMode ? (\n <IconChevronDown aria-hidden className={cn(\"size-4 shrink-0 text-kit-fg-3 transition-transform duration-200\", open && \"rotate-180 text-kit-fg-2\")} stroke={1.5} />\n ) : mode === \"drill\" ? (\n <IconChevronRight aria-hidden className=\"size-4 shrink-0 text-kit-fg-3 transition-transform duration-150 group-hover/row:translate-x-0.5\" stroke={1.5} />\n ) : (\n <IconArrowsDiagonal aria-hidden className=\"size-3.5 shrink-0 text-kit-fg-3\" stroke={1.5} />\n );\n const titleInner = (\n <>\n {leading ?? (toggle && !r.preview.media ? null : <Thumb media={r.preview.media} icon={r.preview.icon ?? field.icon} />)}\n <span className=\"min-w-0 flex-1\">\n <span className={cn(\"flex items-center gap-1.5 truncate text-kit-sm\", r.preview.empty || r.dim ? \"text-kit-fg-3\" : \"text-kit-fg\", open && \"font-medium\")}>\n <span className=\"truncate\">{r.preview.title}</span>\n {r.chip ? <span className=\"shrink-0 rounded-kit-md bg-kit-muted px-1 text-kit-2xs font-medium text-kit-fg-2\">{r.chip}</span> : null}\n </span>\n {/* the title already says what the item is; no \"Item 2 of 4\" filler (the position is in the aria label) */}\n {(r.extra ?? r.preview.subtitle) || changedNote ? (\n <span className=\"block truncate text-kit-xs text-kit-fg-3\">\n {changedNote ? <span className=\"text-kit-fg-2\">{changedNote}{r.extra ?? r.preview.subtitle ? \" · \" : \"\"}</span> : null}\n {r.extra ?? r.preview.subtitle}\n </span>\n ) : null}\n </span>\n </>\n );\n const rowInner = (\n <div\n onClick={(e) => {\n // anywhere on the row opens it, except its own controls (grip, ⋯, presence). The ⋯ menu renders in a portal but\n // React still bubbles its clicks here, so a click whose target is outside the row's own DOM (any menu item:\n // menuitem, menuitemradio, menuitemcheckbox, a submenu) never opens the row.\n const target = e.target as HTMLElement;\n if (!onOpen || !e.currentTarget.contains(target) || target.closest(\"button,[role^=menuitem],a,input\")) return;\n onOpen();\n }}\n className={cn(onOpen ? \"group/row flex min-h-12 cursor-pointer items-center gap-2 py-1.5 pl-1.5 pr-2 transition-colors\" : \"group/row flex min-h-12 items-center gap-2 py-1.5 pl-1.5 pr-2 transition-colors\", open ? \"bg-kit-subtle\" : onOpen && \"hover:bg-kit-subtle\")}\n >\n {grip}\n {toggle}\n {onOpen ? (\n <button\n type=\"button\"\n onClick={onOpen}\n data-row-open={r.id}\n aria-expanded={mode === \"drill\" ? undefined : open}\n aria-controls={inlineMode && open ? bodyId : undefined}\n aria-haspopup={mode === \"popover\" || mode === \"dialog\" ? \"dialog\" : undefined}\n aria-label={`${verb} ${r.preview.title}${r.chip ? `, ${r.chip}` : \"\"}${changedNote ? `, ${changedNote}` : \"\"}, ${r.index + 1} of ${count}`}\n className=\"flex min-w-0 flex-1 items-center gap-2.5 rounded-kit-md text-left outline-none\"\n >\n {titleInner}\n </button>\n ) : (\n <div data-row-open={r.id} className=\"flex min-w-0 flex-1 items-center gap-2.5 text-left\">\n {titleInner}\n </div>\n )}\n <IssueDot errors={roll.errors} warnings={roll.warnings} />\n {peers.length ? <PeerStack peers={peers} size={16} /> : null}\n {menu}\n {trailing}\n </div>\n );\n return (\n <div\n ref={sort.register(r.id)}\n style={sort.style(r.id)}\n data-row-id={r.id}\n className={cn(\"relative border-b border-kit-line-subtle bg-kit-surface last:border-b-0\", isDragging && \"z-10 rounded-kit-lg shadow-kit-lg ring-1 ring-kit-line-strong\")}\n >\n {changeBar}\n <motion.div\n layout={!isDragging && !dragging ? \"position\" : false}\n initial={dragging ? false : { opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={dragging ? { opacity: 0, height: 0, transition: { duration: 0 } } : { opacity: 0, height: 0 }}\n transition={{ duration: 0.2, ease: [0.22, 1, 0.36, 1] }}\n className=\"overflow-hidden\"\n >\n {mode === \"popover\" ? (\n <Popover open={open} onOpenChange={(o) => !o && onClosePopover()}>\n <PopoverAnchor render={rowInner} />\n <PopoverContent className=\"w-[340px] p-4\" align=\"end\" side=\"left\" sideOffset={10}>\n {popover}\n </PopoverContent>\n </Popover>\n ) : (\n rowInner\n )}\n {inlineMode ? (\n <AnimatePresence initial={false}>\n {open ? (\n <motion.div initial={{ height: 0, opacity: 0 }} animate={{ height: \"auto\", opacity: 1 }} exit={{ height: 0, opacity: 0 }} transition={{ duration: 0.2, ease: [0.22, 1, 0.36, 1] }} className=\"overflow-hidden\">\n {/* D63: the row's fields sit behind the one inset line under its title; no tint, no card inside the row */}\n <div className=\"px-3 pb-3 pt-1\">\n <div id={bodyId} role=\"group\" aria-label={r.preview.title} data-group=\"inset\" className={INSET_LINE}><InsetScope>{inline}</InsetScope></div>\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n ) : null}\n </motion.div>\n </div>\n );\n}\n\n/** The included / not-included check on a feature row (D47): a real checkbox, outside the row's open button. */\nfunction RowCheck({ on, label, title, readOnly, onToggle }: { on: boolean; label: string; title: string; readOnly: boolean; onToggle: () => void }) {\n return (\n <Tooltip content={on ? label : `Not ${label.toLowerCase()}`}>\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={on}\n aria-label={`${label}: ${title}`}\n disabled={readOnly}\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n className=\"group/chk flex size-7 shrink-0 items-center justify-center rounded-kit-md transition-colors hover:bg-kit-hover disabled:pointer-events-none\"\n >\n <span\n className={cn(\n \"flex size-[18px] items-center justify-center rounded-full transition-colors\",\n on ? \"bg-kit-control-checked text-kit-fg-inverse\" : \"border border-dashed border-kit-field-border-hover text-kit-fg-3 group-hover/chk:border-[var(--kit-emphasis-line)]\",\n )}\n >\n {on ? <IconCheck className=\"size-3\" stroke={2.5} /> : <IconMinus className=\"size-3\" stroke={2} />}\n </span>\n </button>\n </Tooltip>\n );\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { KitIcon } from "../lib/icons.js";
|
|
|
3
3
|
import { Tooltip } from "../ui/overlay.js";
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
|
-
//#region src/
|
|
6
|
+
//#region src/engine/bits.tsx
|
|
7
7
|
/**
|
|
8
8
|
* CPO D45: a field that IS its own row (an object that drills in) has no label row above it; its shell hands the
|
|
9
9
|
* chrome (ⓘ, badges, comments, presence, ⋯) to the row through this context, and the row draws it before its chevron.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bits.js","names":[],"sources":["../../src/engine/bits.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { KitIcon } from \"../lib/icons\";\nimport { cn } from \"../lib/cn\";\nimport { Tooltip } from \"../ui/overlay\";\n\n/**\n * CPO D45: a field that IS its own row (an object that drills in) has no label row above it; its shell hands the\n * chrome (ⓘ, badges, comments, presence, ⋯) to the row through this context, and the row draws it before its chevron.\n */\nexport const RowChrome = React.createContext<React.ReactNode>(null);\n\n/** Validation rollup dot: red for errors, amber for warnings. Never colour alone — the tooltip names it. */\nexport function IssueDot({ errors, warnings, className }: { errors: number; warnings?: number; className?: string }) {\n if (!errors && !warnings) return null;\n const text = errors ? `${errors} ${errors === 1 ? \"issue\" : \"issues\"} to fix` : `${warnings} ${warnings === 1 ? \"suggestion\" : \"suggestions\"}`;\n return (\n <Tooltip content={text}>\n <span role=\"img\" aria-label={text} className={cn(\"relative inline-flex size-2 shrink-0 rounded-full\", errors ? \"bg-kit-danger\" : \"bg-kit-warning\", className)} />\n </Tooltip>\n );\n}\n\n/**\n * 28px leading tile for rows: image when there is one, else the type icon.\n */\nexport function Thumb({ media, icon, size = 28, className }: { media?: string; icon?: string; size?: number; className?: string }) {\n if (media) return <img src={media} alt=\"\" style={{ width: size, height: size }} className={cn(\"shrink-0 rounded-kit-md border border-kit-line object-cover\", className)} />;\n return (\n <span style={{ width: size, height: size }} className={cn(\"flex shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2\", className)}>\n <KitIcon name={icon} className=\"size-4\" />\n </span>\n );\n}\n\nexport function Kbdish({ children }: { children: React.ReactNode }) {\n return (\n <kbd data-hint=\"shortcuts\" className=\"inline-flex h-4 min-w-4 items-center justify-center rounded-kit-md border border-kit-line bg-kit-subtle px-1 font-kit-sans text-kit-2xs text-kit-fg-3\">\n {children}\n </kbd>\n );\n}\n"],"mappings":";;;;;;;;;;AASA,IAAa,YAAY,MAAM,cAA+B,IAAI;;AAGlE,SAAgB,SAAS,EAAE,QAAQ,UAAU,aAAwE;CACnH,IAAI,CAAC,UAAU,CAAC,UAAU,OAAO;CACjC,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,WAAW,IAAI,UAAU,SAAS,WAAW,GAAG,SAAS,GAAG,aAAa,IAAI,eAAe;CAC/H,OACE,oBAAC,SAAD;EAAS,SAAS;EAChB,UAAA,oBAAC,QAAD;GAAM,MAAK;GAAM,cAAY;GAAM,WAAW,GAAG,qDAAqD,SAAS,kBAAkB,kBAAkB,SAAS;EAAI,CAAA;CACzJ,CAAA;AAEb;;;;AAKA,SAAgB,MAAM,EAAE,OAAO,MAAM,OAAO,IAAI,aAAmF;CACjI,IAAI,OAAO,OAAO,oBAAC,OAAD;EAAK,KAAK;EAAO,KAAI;EAAG,OAAO;GAAE,OAAO;GAAM,QAAQ;EAAK;EAAG,WAAW,GAAG,+DAA+D,SAAS;CAAI,CAAA;CAC1K,OACE,oBAAC,QAAD;EAAM,OAAO;GAAE,OAAO;GAAM,QAAQ;EAAK;EAAG,WAAW,GAAG,uFAAuF,SAAS;EACxJ,UAAA,oBAAC,SAAD;GAAS,MAAM;GAAM,WAAU;EAAU,CAAA;CACrC,CAAA;AAEV;AAEA,SAAgB,OAAO,EAAE,YAA2C;CAClE,OACE,oBAAC,OAAD;EAAK,aAAU;EAAY,WAAU;EAClC;CACE,CAAA;AAET"}
|
|
@@ -34,12 +34,12 @@ export declare function framesToCrumbs(frames: Frame[], schema: Pick<TypeSchema,
|
|
|
34
34
|
export declare const crumbSignature: (crumbs: KitCrumb[]) => string;
|
|
35
35
|
/**
|
|
36
36
|
* The form's own crumb bar (when the host does not take the trail through `onCrumbs`): it opens on the first drill
|
|
37
|
-
* and closes back at the root,
|
|
38
|
-
* host's sticky header and bleeds to the gutter.
|
|
37
|
+
* and closes back at the root, at once. A drill is a 100+/day action, and V2's 180ms height motion was layout work
|
|
38
|
+
* every frame (canvas revamp V81). The document variant sticks under the host's sticky header and bleeds to the gutter.
|
|
39
39
|
*/
|
|
40
40
|
export declare function FrameCrumbs({ crumbs, onNavigate, variant, iconFor, }: {
|
|
41
41
|
crumbs: KitCrumb[];
|
|
42
42
|
onNavigate: (path: FieldPath) => void;
|
|
43
43
|
variant: "panel" | "document";
|
|
44
44
|
iconFor?: CrumbIconFor;
|
|
45
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -4,8 +4,7 @@ import { KitIcon } from "../lib/icons.js";
|
|
|
4
4
|
import { PathCrumbs } from "../ui/path-crumbs.js";
|
|
5
5
|
import "react";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|
|
7
|
-
|
|
8
|
-
//#region src/kit/engine/breadcrumb.tsx
|
|
7
|
+
//#region src/engine/breadcrumb.tsx
|
|
9
8
|
var fallbackIcon = (name) => /* @__PURE__ */ jsx(KitIcon, { name });
|
|
10
9
|
/** KitCrumbs → PathCrumbs items (hosts that merge the kit trail into their own header use this). */
|
|
11
10
|
function kitPathItems(crumbs, onNavigate, iconFor = fallbackIcon) {
|
|
@@ -43,42 +42,19 @@ function framesToCrumbs(frames, schema, rollup, rootLabel) {
|
|
|
43
42
|
var crumbSignature = (crumbs) => crumbs.map((c) => `${c.key}\u0001${c.title}\u0001${c.icon ?? ""}\u0001${c.errors ?? 0}`).join("");
|
|
44
43
|
/**
|
|
45
44
|
* The form's own crumb bar (when the host does not take the trail through `onCrumbs`): it opens on the first drill
|
|
46
|
-
* and closes back at the root,
|
|
47
|
-
* host's sticky header and bleeds to the gutter.
|
|
45
|
+
* and closes back at the root, at once. A drill is a 100+/day action, and V2's 180ms height motion was layout work
|
|
46
|
+
* every frame (canvas revamp V81). The document variant sticks under the host's sticky header and bleeds to the gutter.
|
|
48
47
|
*/
|
|
49
48
|
function FrameCrumbs({ crumbs, onNavigate, variant, iconFor }) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
opacity: 1
|
|
60
|
-
},
|
|
61
|
-
exit: {
|
|
62
|
-
height: 0,
|
|
63
|
-
opacity: 0
|
|
64
|
-
},
|
|
65
|
-
transition: {
|
|
66
|
-
duration: .18,
|
|
67
|
-
ease: [
|
|
68
|
-
.22,
|
|
69
|
-
1,
|
|
70
|
-
.36,
|
|
71
|
-
1
|
|
72
|
-
]
|
|
73
|
-
},
|
|
74
|
-
"data-frame-crumbs": true,
|
|
75
|
-
className: cn("z-[5] shrink-0 overflow-hidden border-b border-kit-line bg-kit-surface", variant === "document" ? "sticky top-[var(--kit-sticky-top,0px)] mx-[calc(var(--kit-gutter,0.5rem)*-1)] px-[var(--kit-gutter,0.5rem)]" : "px-3"),
|
|
76
|
-
children: /* @__PURE__ */ jsx(KitBreadcrumb, {
|
|
77
|
-
crumbs,
|
|
78
|
-
onNavigate,
|
|
79
|
-
iconFor
|
|
80
|
-
})
|
|
81
|
-
}, "crumbs") : null
|
|
49
|
+
if (crumbs.length < 2) return null;
|
|
50
|
+
return /* @__PURE__ */ jsx("div", {
|
|
51
|
+
"data-frame-crumbs": true,
|
|
52
|
+
className: cn("z-[5] shrink-0 overflow-hidden border-b border-kit-line bg-kit-surface", variant === "document" ? "sticky top-[var(--kit-sticky-top,0px)] mx-[calc(var(--kit-gutter,0.5rem)*-1)] px-[var(--kit-gutter,0.5rem)]" : "px-3"),
|
|
53
|
+
children: /* @__PURE__ */ jsx(KitBreadcrumb, {
|
|
54
|
+
crumbs,
|
|
55
|
+
onNavigate,
|
|
56
|
+
iconFor
|
|
57
|
+
})
|
|
82
58
|
});
|
|
83
59
|
}
|
|
84
60
|
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","names":[],"sources":["../../src/engine/breadcrumb.tsx"],"sourcesContent":["/**\n * KitBreadcrumb — the drill-in trail, rendered by the shared <PathCrumbs> (CPO D38): ← back (Esc) · root · … ·\n * current chip. It collapses by the width it actually has (truncate → icon-only → \"⋯ +N\" Pathway popover), each\n * crumb carries its type icon, and a red dot marks any crumb whose subtree has errors. Port of V2 engine/breadcrumb.tsx.\n */\nimport * as React from \"react\";\nimport { KitIcon } from \"../lib/icons\";\nimport { PathCrumbs, type PathCrumb } from \"../ui/path-crumbs\";\nimport { cn } from \"../lib/cn\";\nimport { frameKeyOf } from \"../lib/path\";\nimport type { Frame } from \"../lib/frames\";\nimport type { FieldPath, TypeSchema } from \"../schema/types\";\n\nexport interface KitCrumb {\n key: string;\n title: string;\n icon?: string;\n path: FieldPath;\n errors?: number;\n}\n\nexport type CrumbIconFor = (name: string) => React.ReactNode;\nconst fallbackIcon: CrumbIconFor = (name) => <KitIcon name={name} />;\n\n/** KitCrumbs → PathCrumbs items (hosts that merge the kit trail into their own header use this). */\nexport function kitPathItems(crumbs: KitCrumb[], onNavigate: (path: FieldPath) => void, iconFor: CrumbIconFor = fallbackIcon): PathCrumb[] {\n return crumbs.map((c) => ({\n id: c.key,\n label: c.title,\n icon: c.icon ? iconFor(c.icon) : undefined,\n errors: c.errors,\n onSelect: () => onNavigate(c.path),\n }));\n}\n\nexport function KitBreadcrumb({ crumbs, onNavigate, className, iconFor }: { crumbs: KitCrumb[]; onNavigate: (path: FieldPath) => void; className?: string; iconFor?: CrumbIconFor }) {\n if (crumbs.length < 2) return null;\n return <PathCrumbs items={kitPathItems(crumbs, onNavigate, iconFor)} backShortcut=\"Esc\" label=\"Field path\" className={className ?? \"h-10\"} />;\n}\n\n/**\n * Frames → crumbs (V2 schema-form): the root crumb is the host's label (or the schema title) with the schema icon;\n * every other crumb carries the error count of its subtree (a history crumb counts its field's).\n */\nexport function framesToCrumbs(\n frames: Frame[],\n schema: Pick<TypeSchema, \"title\" | \"icon\">,\n rollup: (prefix: FieldPath) => { errors: number },\n rootLabel?: string,\n): KitCrumb[] {\n return frames.map((f, i) => ({\n key: frameKeyOf(f.path),\n title: i === 0 ? rootLabel ?? schema.title : f.title,\n icon: f.icon ?? (i === 0 ? schema.icon : undefined),\n path: f.path,\n errors: i === 0 ? 0 : rollup(f.kind === \"history\" ? f.path.slice(0, -1) : f.path).errors,\n }));\n}\n\n/** A stable signature of the crumbs, so a host's `onCrumbs` fires only when the trail actually changed. */\nexport const crumbSignature = (crumbs: KitCrumb[]) => crumbs.map((c) => `${c.key}\\u0001${c.title}\\u0001${c.icon ?? \"\"}\\u0001${c.errors ?? 0}`).join(\"\\u0002\");\n\n/**\n * The form's own crumb bar (when the host does not take the trail through `onCrumbs`): it opens on the first drill\n * and closes back at the root, at once. A drill is a 100+/day action, and V2's 180ms height motion was layout work\n * every frame (canvas revamp V81). The document variant sticks under the host's sticky header and bleeds to the gutter.\n */\nexport function FrameCrumbs({\n crumbs,\n onNavigate,\n variant,\n iconFor,\n}: {\n crumbs: KitCrumb[];\n onNavigate: (path: FieldPath) => void;\n variant: \"panel\" | \"document\";\n iconFor?: CrumbIconFor;\n}) {\n if (crumbs.length < 2) return null;\n return (\n <div\n data-frame-crumbs\n className={cn(\n \"z-[5] shrink-0 overflow-hidden border-b border-kit-line bg-kit-surface\",\n variant === \"document\" ? \"sticky top-[var(--kit-sticky-top,0px)] mx-[calc(var(--kit-gutter,0.5rem)*-1)] px-[var(--kit-gutter,0.5rem)]\" : \"px-3\",\n )}\n >\n <KitBreadcrumb crumbs={crumbs} onNavigate={onNavigate} iconFor={iconFor} />\n </div>\n );\n}\n"],"mappings":";;;;;;;AAsBA,IAAM,gBAA8B,SAAS,oBAAC,SAAD,EAAe,KAAO,CAAA;;AAGnE,SAAgB,aAAa,QAAoB,YAAuC,UAAwB,cAA2B;CACzI,OAAO,OAAO,KAAK,OAAO;EACxB,IAAI,EAAE;EACN,OAAO,EAAE;EACT,MAAM,EAAE,OAAO,QAAQ,EAAE,IAAI,IAAI,KAAA;EACjC,QAAQ,EAAE;EACV,gBAAgB,WAAW,EAAE,IAAI;CACnC,EAAE;AACJ;AAEA,SAAgB,cAAc,EAAE,QAAQ,YAAY,WAAW,WAAsH;CACnL,IAAI,OAAO,SAAS,GAAG,OAAO;CAC9B,OAAO,oBAAC,YAAD;EAAY,OAAO,aAAa,QAAQ,YAAY,OAAO;EAAG,cAAa;EAAM,OAAM;EAAa,WAAW,aAAa;CAAS,CAAA;AAC9I;;;;;AAMA,SAAgB,eACd,QACA,QACA,QACA,WACY;CACZ,OAAO,OAAO,KAAK,GAAG,OAAO;EAC3B,KAAK,WAAW,EAAE,IAAI;EACtB,OAAO,MAAM,IAAI,aAAa,OAAO,QAAQ,EAAE;EAC/C,MAAM,EAAE,SAAS,MAAM,IAAI,OAAO,OAAO,KAAA;EACzC,MAAM,EAAE;EACR,QAAQ,MAAM,IAAI,IAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;CACpF,EAAE;AACJ;;AAGA,IAAa,kBAAkB,WAAuB,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE,MAAM,QAAQ,EAAE,QAAQ,GAAG,QAAQ,EAAE,UAAU,GAAG,CAAC,CAAC,KAAK,GAAQ;;;;;;AAO5J,SAAgB,YAAY,EAC1B,QACA,YACA,SACA,WAMC;CACD,IAAI,OAAO,SAAS,GAAG,OAAO;CAC9B,OACE,oBAAC,OAAD;EACE,qBAAA;EACA,WAAW,GACT,0EACA,YAAY,aAAa,gHAAgH,MAC3I;EAEA,UAAA,oBAAC,eAAD;GAAuB;GAAoB;GAAqB;EAAU,CAAA;CACvE,CAAA;AAET"}
|
|
@@ -19,8 +19,8 @@ import type { ControlProps } from "../types";
|
|
|
19
19
|
export interface ExpandSpec {
|
|
20
20
|
/** "reading" centres a ~720px writing column; "wide" uses the whole dialog (tables, code) */
|
|
21
21
|
layout: "reading" | "wide";
|
|
22
|
-
/** the header's quiet meta line for this value ("
|
|
23
|
-
meta
|
|
22
|
+
/** the header's quiet meta line for this value ("12 lines", "6 rows · 4 columns") */
|
|
23
|
+
meta?: (value: unknown) => string;
|
|
24
24
|
/** the label-row button's name and tooltip */
|
|
25
25
|
label: "Expand editor" | "Edit in full screen";
|
|
26
26
|
/** V2: the document variant already draws the full editor in its column, so writing types offer no ⤢ there */
|
|
@@ -28,8 +28,6 @@ export interface ExpandSpec {
|
|
|
28
28
|
/** expanding needs a kit control: the host's control for this type cannot edit it (read-only card) */
|
|
29
29
|
needsKitControl?: boolean;
|
|
30
30
|
}
|
|
31
|
-
/** Words in a value: a string (tags stripped), Portable Text blocks, or a rich-text envelope ({ html } / { value }). */
|
|
32
|
-
export declare function wordsIn(value: unknown): number;
|
|
33
31
|
/** Type → how it expands. Additive like CONTROLS: one entry per type. Plain long text (`text`) has none: V2's
|
|
34
32
|
* TextControl is a bare textarea that grows to its value, so an extra ⤢ would only add a tab stop V2 lacks. */
|
|
35
33
|
export declare const EXPANDABLE: Partial<Record<SchemaType, ExpandSpec>>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { cn } from "../lib/cn.js";
|
|
2
|
-
import { isObj, pathKey } from "../lib/path.js";
|
|
3
2
|
import { useForm, useKitEnv } from "../context.js";
|
|
3
|
+
import { isObj, pathKey } from "../lib/path.js";
|
|
4
4
|
import { Tooltip } from "../ui/overlay.js";
|
|
5
5
|
import { resolveFrames } from "../lib/frames.js";
|
|
6
6
|
import { ExpandedEditorModal } from "../ui/expanded-editor-modal.js";
|
|
7
7
|
import * as React from "react";
|
|
8
|
-
import { IconArrowsMaximize } from "@tabler/icons-react";
|
|
9
8
|
import { jsx } from "react/jsx-runtime";
|
|
10
|
-
|
|
9
|
+
import { IconArrowsMaximize } from "@tabler/icons-react";
|
|
10
|
+
//#region src/engine/expand.tsx
|
|
11
11
|
/**
|
|
12
12
|
* Expanded editing (CPO D49), owned by the engine: rich text, code and tables open in the ONE shared
|
|
13
13
|
* ExpandedEditorModal (ui/expanded-editor-modal.tsx). V2 did this per control (RichTextControl + RichTextExpandAction,
|
|
@@ -22,23 +22,7 @@ import { jsx } from "react/jsx-runtime";
|
|
|
22
22
|
* Offered only where expanding edits something: never read-only, never a type whose control behind it cannot edit
|
|
23
23
|
* (code and tables expand only once a kit control is registered for them; the host draws those read-only today).
|
|
24
24
|
*/
|
|
25
|
-
/** Words in a value: a string (tags stripped), Portable Text blocks, or a rich-text envelope ({ html } / { value }). */
|
|
26
|
-
function wordsIn(value) {
|
|
27
|
-
const text = textOf(value).trim();
|
|
28
|
-
return text ? text.split(/\s+/).length : 0;
|
|
29
|
-
}
|
|
30
|
-
function textOf(v) {
|
|
31
|
-
if (typeof v === "string") return v.replace(/<[^>]*>/g, " ").replace(/ /g, " ");
|
|
32
|
-
if (Array.isArray(v)) return v.map(textOf).join(" ");
|
|
33
|
-
if (!isObj(v)) return "";
|
|
34
|
-
if (typeof v.text === "string") return v.text;
|
|
35
|
-
if (Array.isArray(v.children)) return textOf(v.children);
|
|
36
|
-
if (typeof v.html === "string") return textOf(v.html);
|
|
37
|
-
if ("value" in v) return textOf(v.value);
|
|
38
|
-
return "";
|
|
39
|
-
}
|
|
40
25
|
var count = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
|
|
41
|
-
var words = (v) => count(wordsIn(v), "word");
|
|
42
26
|
function codeLines(v) {
|
|
43
27
|
const src = typeof v === "string" ? v : isObj(v) && typeof v.code === "string" ? v.code : "";
|
|
44
28
|
return count(src ? src.split("\n").length : 0, "line");
|
|
@@ -53,7 +37,6 @@ function tableSize(v) {
|
|
|
53
37
|
var EXPANDABLE = {
|
|
54
38
|
richtext: {
|
|
55
39
|
layout: "reading",
|
|
56
|
-
meta: words,
|
|
57
40
|
label: "Expand editor",
|
|
58
41
|
panelOnly: true
|
|
59
42
|
},
|
|
@@ -139,7 +122,7 @@ function ExpandedField({ field, path, spec, Control, value, onChange, onBlur, in
|
|
|
139
122
|
open,
|
|
140
123
|
onOpenChange: (o) => openExpanded(o ? key : null),
|
|
141
124
|
crumbs,
|
|
142
|
-
meta: spec.meta(value),
|
|
125
|
+
meta: spec.meta?.(value),
|
|
143
126
|
layout: spec.layout,
|
|
144
127
|
returnFocus: () => document.querySelector(`[data-field-key="${CSS.escape(pathKey(path))}"] [data-kit-expand]`) ?? document.getElementById(id),
|
|
145
128
|
children: open ? /* @__PURE__ */ jsx("div", {
|
|
@@ -165,6 +148,6 @@ function ExpandedField({ field, path, spec, Control, value, onChange, onBlur, in
|
|
|
165
148
|
});
|
|
166
149
|
}
|
|
167
150
|
//#endregion
|
|
168
|
-
export { ExpandAction, ExpandedField, expandKey, expandSpecFor, isExpandShortcut, openExpanded };
|
|
151
|
+
export { EXPANDABLE, ExpandAction, ExpandedField, expandKey, expandSpecFor, isExpandShortcut, openExpanded, useExpandedKey };
|
|
169
152
|
|
|
170
153
|
//# sourceMappingURL=expand.js.map
|