@bettercms-ai/kit 0.1.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -16
- package/dist/_virtual/_rolldown/runtime.js +13 -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/dist/adapters/icons.d.ts +15 -0
- package/dist/adapters/icons.js +27 -0
- package/dist/adapters/icons.js.map +1 -0
- package/dist/adapters/lossy.d.ts +326 -0
- package/dist/adapters/lossy.js +414 -0
- package/dist/adapters/lossy.js.map +1 -0
- package/dist/adapters/prod-types.d.ts +546 -0
- package/dist/adapters/prod-types.js +714 -0
- package/dist/adapters/prod-types.js.map +1 -0
- package/dist/adapters/schema.d.ts +154 -0
- package/dist/adapters/schema.js +3020 -0
- package/dist/adapters/schema.js.map +1 -0
- package/dist/adapters/values.d.ts +221 -0
- package/dist/adapters/values.js +623 -0
- package/dist/adapters/values.js.map +1 -0
- package/dist/brand/logo.d.ts +17 -0
- package/dist/brand/logo.js +96 -0
- package/dist/brand/logo.js.map +1 -0
- package/dist/context.d.ts +359 -0
- package/dist/context.js +217 -0
- package/dist/context.js.map +1 -0
- package/dist/controls/button.d.ts +72 -0
- package/dist/controls/button.js +578 -0
- package/dist/controls/button.js.map +1 -0
- package/dist/controls/c1.d.ts +11 -0
- package/dist/controls/c1.js +24 -0
- package/dist/controls/c1.js.map +1 -0
- package/dist/controls/c2.d.ts +10 -0
- package/dist/controls/c2.js +19 -0
- package/dist/controls/c2.js.map +1 -0
- package/dist/controls/choice.d.ts +44 -0
- package/dist/controls/choice.js +463 -0
- package/dist/controls/choice.js.map +1 -0
- package/dist/controls/code-register.d.ts +1 -0
- package/dist/controls/code-register.js +8 -0
- package/dist/controls/code-register.js.map +1 -0
- package/dist/controls/code.d.ts +42 -0
- package/dist/controls/code.js +397 -0
- package/dist/controls/code.js.map +1 -0
- package/dist/controls/color.d.ts +5 -0
- package/dist/controls/color.js +130 -0
- package/dist/controls/color.js.map +1 -0
- package/dist/controls/component-services.d.ts +156 -0
- package/dist/controls/component-services.js +7 -0
- package/dist/controls/component-services.js.map +1 -0
- package/dist/controls/date-register.d.ts +1 -0
- package/dist/controls/date-register.js +9 -0
- package/dist/controls/date-register.js.map +1 -0
- package/dist/controls/date-zone.d.ts +104 -0
- package/dist/controls/date-zone.js +278 -0
- package/dist/controls/date-zone.js.map +1 -0
- package/dist/controls/date.d.ts +7 -0
- package/dist/controls/date.js +466 -0
- package/dist/controls/date.js.map +1 -0
- package/dist/controls/form-picker-register.d.ts +1 -0
- package/dist/controls/form-picker-register.js +19 -0
- package/dist/controls/form-picker-register.js.map +1 -0
- package/dist/controls/form-picker.d.ts +43 -0
- package/dist/controls/form-picker.js +85 -0
- package/dist/controls/form-picker.js.map +1 -0
- package/dist/controls/icon-register.d.ts +1 -0
- package/dist/controls/icon-register.js +8 -0
- package/dist/controls/icon-register.js.map +1 -0
- package/dist/controls/icon.d.ts +40 -0
- package/dist/controls/icon.js +360 -0
- package/dist/controls/icon.js.map +1 -0
- package/dist/controls/index.d.ts +5 -0
- package/dist/controls/index.js +38 -0
- package/dist/controls/index.js.map +1 -0
- package/dist/controls/json-register.d.ts +1 -0
- package/dist/controls/json-register.js +8 -0
- package/dist/controls/json-register.js.map +1 -0
- package/dist/controls/json.d.ts +2 -0
- package/dist/controls/json.js +82 -0
- package/dist/controls/json.js.map +1 -0
- package/dist/controls/link.d.ts +260 -0
- package/dist/controls/link.js +1186 -0
- package/dist/controls/link.js.map +1 -0
- package/dist/controls/location-register.d.ts +1 -0
- package/dist/controls/location-register.js +8 -0
- package/dist/controls/location-register.js.map +1 -0
- package/dist/controls/location.d.ts +16 -0
- package/dist/controls/location.js +221 -0
- package/dist/controls/location.js.map +1 -0
- package/dist/controls/media-register.d.ts +1 -0
- package/dist/controls/media-register.js +12 -0
- package/dist/controls/media-register.js.map +1 -0
- package/dist/controls/media-services.d.ts +46 -0
- package/dist/controls/media-services.js +0 -0
- package/dist/controls/media.d.ts +104 -0
- package/dist/controls/media.js +1396 -0
- package/dist/controls/media.js.map +1 -0
- package/dist/controls/number.d.ts +22 -0
- package/dist/controls/number.js +196 -0
- package/dist/controls/number.js.map +1 -0
- package/dist/controls/reference-register.d.ts +1 -0
- package/dist/controls/reference-register.js +10 -0
- package/dist/controls/reference-register.js.map +1 -0
- package/dist/controls/reference-services.d.ts +58 -0
- package/dist/controls/reference-services.js +0 -0
- package/dist/controls/reference.d.ts +23 -0
- package/dist/controls/reference.js +777 -0
- package/dist/controls/reference.js.map +1 -0
- package/dist/controls/rich-text/blocks.d.ts +49 -0
- package/dist/controls/rich-text/blocks.js +1859 -0
- package/dist/controls/rich-text/blocks.js.map +1 -0
- package/dist/controls/rich-text/catalog.d.ts +101 -0
- package/dist/controls/rich-text/catalog.js +623 -0
- package/dist/controls/rich-text/catalog.js.map +1 -0
- package/dist/controls/rich-text/codec.d.ts +64 -0
- package/dist/controls/rich-text/codec.js +34 -0
- package/dist/controls/rich-text/codec.js.map +1 -0
- package/dist/controls/rich-text/component-card.d.ts +14 -0
- package/dist/controls/rich-text/component-card.js +1024 -0
- 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/dist/controls/rich-text/control.d.ts +20 -0
- package/dist/controls/rich-text/control.js +296 -0
- package/dist/controls/rich-text/control.js.map +1 -0
- package/dist/controls/rich-text/dom.d.ts +233 -0
- package/dist/controls/rich-text/dom.js +1019 -0
- package/dist/controls/rich-text/dom.js.map +1 -0
- package/dist/controls/rich-text/editor.d.ts +57 -0
- package/dist/controls/rich-text/editor.js +1630 -0
- package/dist/controls/rich-text/editor.js.map +1 -0
- package/dist/controls/rich-text/floating.d.ts +28 -0
- package/dist/controls/rich-text/floating.js +154 -0
- package/dist/controls/rich-text/floating.js.map +1 -0
- package/dist/controls/rich-text/index.d.ts +1 -0
- package/dist/controls/rich-text/index.js +12 -0
- package/dist/controls/rich-text/index.js.map +1 -0
- package/dist/controls/rich-text/link-form.d.ts +13 -0
- package/dist/controls/rich-text/link-form.js +147 -0
- package/dist/controls/rich-text/link-form.js.map +1 -0
- package/dist/controls/rich-text/markdown.d.ts +6 -0
- package/dist/controls/rich-text/markdown.js +181 -0
- package/dist/controls/rich-text/markdown.js.map +1 -0
- package/dist/controls/rich-text/ops.d.ts +35 -0
- package/dist/controls/rich-text/ops.js +316 -0
- 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/toolbar.d.ts +89 -0
- package/dist/controls/rich-text/toolbar.js +343 -0
- package/dist/controls/rich-text/toolbar.js.map +1 -0
- package/dist/controls/scale.d.ts +56 -0
- package/dist/controls/scale.js +563 -0
- package/dist/controls/scale.js.map +1 -0
- package/dist/controls/slot-register.d.ts +1 -0
- package/dist/controls/slot-register.js +16 -0
- package/dist/controls/slot-register.js.map +1 -0
- package/dist/controls/slot-services.d.ts +122 -0
- package/dist/controls/slot-services.js +155 -0
- package/dist/controls/slot-services.js.map +1 -0
- package/dist/controls/slot.d.ts +33 -0
- package/dist/controls/slot.js +366 -0
- package/dist/controls/slot.js.map +1 -0
- package/dist/controls/table/index.d.ts +1 -0
- package/dist/controls/table/index.js +12 -0
- package/dist/controls/table/index.js.map +1 -0
- package/dist/controls/table/prod.d.ts +21 -0
- package/dist/controls/table/prod.js +79 -0
- package/dist/controls/table/prod.js.map +1 -0
- package/dist/controls/table/refs.d.ts +50 -0
- package/dist/controls/table/refs.js +79 -0
- package/dist/controls/table/refs.js.map +1 -0
- package/dist/controls/table/stored.d.ts +15 -0
- package/dist/controls/table/stored.js +44 -0
- package/dist/controls/table/stored.js.map +1 -0
- package/dist/controls/table/table-editor.d.ts +103 -0
- package/dist/controls/table/table-editor.js +2725 -0
- package/dist/controls/table/table-editor.js.map +1 -0
- package/dist/controls/table/table-link.d.ts +24 -0
- package/dist/controls/table/table-link.js +180 -0
- package/dist/controls/table/table-link.js.map +1 -0
- package/dist/controls/table/table.d.ts +9 -0
- package/dist/controls/table/table.js +103 -0
- package/dist/controls/table/table.js.map +1 -0
- package/dist/controls/text.d.ts +17 -0
- package/dist/controls/text.js +322 -0
- package/dist/controls/text.js.map +1 -0
- package/dist/controls/unknown-value.d.ts +17 -0
- package/dist/controls/unknown-value.js +66 -0
- package/dist/controls/unknown-value.js.map +1 -0
- package/dist/core/core.d.ts +63 -0
- package/dist/core/core.js +171 -0
- package/dist/core/core.js.map +1 -0
- package/dist/core/facets.d.ts +347 -0
- package/dist/core/facets.js +334 -0
- package/dist/core/facets.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +3 -0
- package/dist/engine/array.d.ts +101 -0
- package/dist/engine/array.js +906 -0
- package/dist/engine/array.js.map +1 -0
- package/dist/engine/bits.d.ts +24 -0
- package/dist/engine/bits.js +60 -0
- package/dist/engine/bits.js.map +1 -0
- package/dist/engine/breadcrumb.d.ts +45 -0
- package/dist/engine/breadcrumb.js +63 -0
- package/dist/engine/breadcrumb.js.map +1 -0
- package/dist/engine/expand.d.ts +66 -0
- package/dist/engine/expand.js +153 -0
- package/dist/engine/expand.js.map +1 -0
- package/dist/engine/field-list.d.ts +20 -0
- package/dist/engine/field-list.js +19 -0
- package/dist/engine/field-list.js.map +1 -0
- package/dist/engine/field-shell.d.ts +49 -0
- package/dist/engine/field-shell.js +988 -0
- package/dist/engine/field-shell.js.map +1 -0
- package/dist/engine/frame.d.ts +122 -0
- package/dist/engine/frame.js +601 -0
- package/dist/engine/frame.js.map +1 -0
- package/dist/engine/group-summary.d.ts +5 -0
- package/dist/engine/group-summary.js +70 -0
- package/dist/engine/group-summary.js.map +1 -0
- package/dist/engine/grouping.d.ts +238 -0
- package/dist/engine/grouping.js +996 -0
- package/dist/engine/grouping.js.map +1 -0
- package/dist/engine/item-list.d.ts +99 -0
- package/dist/engine/item-list.js +725 -0
- package/dist/engine/item-list.js.map +1 -0
- package/dist/engine/kit-field.d.ts +72 -0
- package/dist/engine/kit-field.js +558 -0
- package/dist/engine/kit-field.js.map +1 -0
- package/dist/engine/schema-form.d.ts +116 -0
- package/dist/engine/schema-form.js +462 -0
- package/dist/engine/schema-form.js.map +1 -0
- package/dist/engine/slot.d.ts +13 -0
- package/dist/engine/slot.js +216 -0
- package/dist/engine/slot.js.map +1 -0
- package/dist/index.d.ts +45 -3139
- package/dist/index.js +47 -2036
- package/dist/index.js.map +1 -0
- package/dist/kit.css +75 -0
- package/dist/lib/cn.d.ts +4 -0
- package/dist/lib/cn.js +56 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/columns.d.ts +14 -0
- package/dist/lib/columns.js +30 -0
- package/dist/lib/columns.js.map +1 -0
- package/dist/lib/frames.d.ts +36 -0
- package/dist/lib/frames.js +214 -0
- 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/dist/lib/icons.d.ts +16 -0
- package/dist/lib/icons.js +173 -0
- 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/dist/lib/path.d.ts +29 -0
- package/dist/lib/path.js +66 -0
- package/dist/lib/path.js.map +1 -0
- package/dist/lib/schema.d.ts +80 -0
- package/dist/lib/schema.js +384 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.js +37 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/validate.d.ts +30 -0
- package/dist/lib/validate.js +224 -0
- package/dist/lib/validate.js.map +1 -0
- package/dist/library/analysis.d.ts +23 -0
- package/dist/library/analysis.js +160 -0
- package/dist/library/analysis.js.map +1 -0
- package/dist/library/catalog.d.ts +57 -0
- package/dist/library/catalog.js +307 -0
- package/dist/library/catalog.js.map +1 -0
- package/dist/library/coreNotes.d.ts +8 -0
- package/dist/library/coreNotes.js +111 -0
- package/dist/library/coreNotes.js.map +1 -0
- package/dist/library/coverage.d.ts +40 -0
- package/dist/library/coverage.js +59 -0
- package/dist/library/coverage.js.map +1 -0
- package/dist/library/entries/advanced.entries.d.ts +2 -0
- package/dist/library/entries/advanced.entries.js +6579 -0
- package/dist/library/entries/advanced.entries.js.map +1 -0
- package/dist/library/entries/commerce.entries.d.ts +2 -0
- package/dist/library/entries/commerce.entries.js +4140 -0
- package/dist/library/entries/commerce.entries.js.map +1 -0
- package/dist/library/entries/company.entries.d.ts +2 -0
- package/dist/library/entries/company.entries.js +2731 -0
- package/dist/library/entries/company.entries.js.map +1 -0
- package/dist/library/entries/conversion.entries.d.ts +2 -0
- package/dist/library/entries/conversion.entries.js +3707 -0
- package/dist/library/entries/conversion.entries.js.map +1 -0
- package/dist/library/entries/data.entries.d.ts +7 -0
- package/dist/library/entries/data.entries.js +4613 -0
- package/dist/library/entries/data.entries.js.map +1 -0
- package/dist/library/entries/events.entries.d.ts +2 -0
- package/dist/library/entries/events.entries.js +3428 -0
- package/dist/library/entries/events.entries.js.map +1 -0
- package/dist/library/entries/features.entries.d.ts +2 -0
- package/dist/library/entries/features.entries.js +3157 -0
- package/dist/library/entries/features.entries.js.map +1 -0
- package/dist/library/entries/heroes.entries.d.ts +2 -0
- package/dist/library/entries/heroes.entries.js +3401 -0
- package/dist/library/entries/heroes.entries.js.map +1 -0
- package/dist/library/entries/index.d.ts +3 -0
- package/dist/library/entries/index.js +35 -0
- package/dist/library/entries/index.js.map +1 -0
- package/dist/library/entries/listings.entries.d.ts +2 -0
- package/dist/library/entries/listings.entries.js +2976 -0
- package/dist/library/entries/listings.entries.js.map +1 -0
- package/dist/library/entries/longform.entries.d.ts +2 -0
- package/dist/library/entries/longform.entries.js +4227 -0
- package/dist/library/entries/longform.entries.js.map +1 -0
- package/dist/library/entries/media.entries.d.ts +2 -0
- package/dist/library/entries/media.entries.js +2781 -0
- package/dist/library/entries/media.entries.js.map +1 -0
- package/dist/library/entries/navigation.entries.d.ts +2 -0
- package/dist/library/entries/navigation.entries.js +4011 -0
- package/dist/library/entries/navigation.entries.js.map +1 -0
- package/dist/library/entries/pricing.entries.d.ts +2 -0
- package/dist/library/entries/pricing.entries.js +2383 -0
- package/dist/library/entries/pricing.entries.js.map +1 -0
- package/dist/library/entries/social-proof.entries.d.ts +2 -0
- package/dist/library/entries/social-proof.entries.js +2297 -0
- package/dist/library/entries/social-proof.entries.js.map +1 -0
- package/dist/library/examples/bento.d.ts +92 -0
- package/dist/library/examples/bento.js +201 -0
- package/dist/library/examples/bento.js.map +1 -0
- package/dist/library/examples/blocks.d.ts +14 -0
- package/dist/library/examples/blocks.js +313 -0
- package/dist/library/examples/blocks.js.map +1 -0
- package/dist/library/examples/faq.d.ts +28 -0
- package/dist/library/examples/faq.js +230 -0
- package/dist/library/examples/faq.js.map +1 -0
- package/dist/library/examples/hero.d.ts +43 -0
- package/dist/library/examples/hero.js +222 -0
- package/dist/library/examples/hero.js.map +1 -0
- package/dist/library/examples/index.d.ts +36 -0
- package/dist/library/examples/index.js +109 -0
- package/dist/library/examples/index.js.map +1 -0
- package/dist/library/examples/journalStory.d.ts +93 -0
- package/dist/library/examples/journalStory.js +338 -0
- package/dist/library/examples/journalStory.js.map +1 -0
- package/dist/library/examples/megaMenu.d.ts +134 -0
- package/dist/library/examples/megaMenu.js +442 -0
- package/dist/library/examples/megaMenu.js.map +1 -0
- package/dist/library/examples/pricing.d.ts +103 -0
- package/dist/library/examples/pricing.js +479 -0
- package/dist/library/examples/pricing.js.map +1 -0
- package/dist/library/examples/tabs.d.ts +87 -0
- package/dist/library/examples/tabs.js +180 -0
- package/dist/library/examples/tabs.js.map +1 -0
- package/dist/library/export.d.ts +42 -0
- package/dist/library/export.js +80 -0
- package/dist/library/export.js.map +1 -0
- package/dist/library/index.d.ts +13 -0
- package/dist/library/index.js +6 -0
- package/dist/library/kit-catalog.json +1510 -0
- package/dist/library/types.d.ts +42 -0
- package/dist/library/types.js +0 -0
- package/dist/schema/adapters.d.ts +28 -0
- package/dist/schema/adapters.js +492 -0
- package/dist/schema/adapters.js.map +1 -0
- package/dist/schema/help.d.ts +27 -0
- package/dist/schema/help.js +56 -0
- package/dist/schema/help.js.map +1 -0
- package/dist/schema/scale.d.ts +69 -0
- package/dist/schema/scale.js +250 -0
- package/dist/schema/scale.js.map +1 -0
- package/dist/schema/sources.d.ts +103 -0
- package/dist/schema/sources.js +65 -0
- package/dist/schema/sources.js.map +1 -0
- package/dist/schema/table.d.ts +319 -0
- package/dist/schema/table.js +1199 -0
- package/dist/schema/table.js.map +1 -0
- package/dist/schema/types.d.ts +297 -0
- package/dist/schema/types.js +14 -0
- 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 +20 -1504
- package/dist/theme.js +43 -4126
- package/dist/theme.js.map +1 -0
- package/dist/tokens.css +542 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.js +0 -0
- package/dist/ui/action-tray.d.ts +54 -0
- package/dist/ui/action-tray.js +154 -0
- package/dist/ui/action-tray.js.map +1 -0
- package/dist/ui/autocomplete.d.ts +30 -0
- package/dist/ui/autocomplete.js +139 -0
- package/dist/ui/autocomplete.js.map +1 -0
- package/dist/ui/button.d.ts +57 -0
- package/dist/ui/button.js +201 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/choice-switch.d.ts +36 -0
- package/dist/ui/choice-switch.js +57 -0
- package/dist/ui/choice-switch.js.map +1 -0
- package/dist/ui/controls.d.ts +83 -0
- package/dist/ui/controls.js +331 -0
- package/dist/ui/controls.js.map +1 -0
- package/dist/ui/display.d.ts +163 -0
- package/dist/ui/display.js +455 -0
- package/dist/ui/display.js.map +1 -0
- package/dist/ui/expanded-editor-modal.d.ts +26 -0
- package/dist/ui/expanded-editor-modal.js +140 -0
- package/dist/ui/expanded-editor-modal.js.map +1 -0
- package/dist/ui/field-context.d.ts +12 -0
- package/dist/ui/field-context.js +23 -0
- package/dist/ui/field-context.js.map +1 -0
- package/dist/ui/floating-panel.d.ts +152 -0
- package/dist/ui/floating-panel.js +928 -0
- package/dist/ui/floating-panel.js.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.js +18 -0
- package/dist/ui/input.d.ts +78 -0
- package/dist/ui/input.js +250 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/mode-bar.d.ts +31 -0
- package/dist/ui/mode-bar.js +65 -0
- package/dist/ui/mode-bar.js.map +1 -0
- package/dist/ui/overlay.d.ts +195 -0
- package/dist/ui/overlay.js +697 -0
- package/dist/ui/overlay.js.map +1 -0
- package/dist/ui/path-crumbs.d.ts +90 -0
- package/dist/ui/path-crumbs.js +566 -0
- package/dist/ui/path-crumbs.js.map +1 -0
- package/dist/ui/presence.d.ts +16 -0
- package/dist/ui/presence.js +65 -0
- package/dist/ui/presence.js.map +1 -0
- package/dist/ui/select.d.ts +66 -0
- package/dist/ui/select.js +407 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/shortcut-hint.d.ts +14 -0
- package/dist/ui/shortcut-hint.js +35 -0
- 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/dist/ui/surfaces.d.ts +23 -0
- package/dist/ui/surfaces.js +26 -0
- 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/dist/ui/tooltip-root.d.ts +13 -0
- package/dist/ui/tooltip-root.js +77 -0
- package/dist/ui/tooltip-root.js.map +1 -0
- package/dist/ui/variants.d.ts +15 -0
- package/dist/ui/variants.js +14 -0
- package/dist/ui/variants.js.map +1 -0
- package/package.json +76 -50
- package/LICENSE +0 -21
- package/dist/_chunks-cjs/_visual-editing.js +0 -5898
- package/dist/_chunks-cjs/refractor.js +0 -22
- package/dist/_chunks-es/_visual-editing.mjs +0 -5904
- package/dist/_chunks-es/refractor.mjs +0 -25
- package/dist/_color.d.mts +0 -119
- package/dist/_color.d.ts +0 -119
- package/dist/_color.js +0 -1412
- package/dist/_color.mjs +0 -1411
- package/dist/_visual-editing.d.mts +0 -1126
- package/dist/_visual-editing.d.ts +0 -1126
- package/dist/_visual-editing.js +0 -30
- package/dist/_visual-editing.mjs +0 -30
- package/dist/index.d.mts +0 -3140
- package/dist/index.mjs +0 -2044
- package/dist/theme.d.mts +0 -1506
- package/dist/theme.mjs +0 -4126
- package/exports/_visual-editing.ts +0 -31
- package/exports/index.ts +0 -1
- package/exports/theme.ts +0 -1
- package/src/color/index.d.mts +0 -119
- package/src/color/index.mjs +0 -1411
- package/src/core/__workshop__/constants.ts +0 -293
- package/src/core/_compat.ts +0 -264
- package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
- package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
- package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
- package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
- package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
- package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
- package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
- package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
- package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
- package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
- package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
- package/src/core/components/autocomplete/autocomplete.tsx +0 -767
- package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
- package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
- package/src/core/components/autocomplete/constants.ts +0 -28
- package/src/core/components/autocomplete/index.ts +0 -2
- package/src/core/components/autocomplete/types.ts +0 -108
- package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
- package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
- package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
- package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
- package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
- package/src/core/components/breadcrumbs/index.ts +0 -1
- package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
- package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
- package/src/core/components/dialog/__workshop__/index.ts +0 -19
- package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
- package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
- package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
- package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
- package/src/core/components/dialog/__workshop__/position.tsx +0 -30
- package/src/core/components/dialog/__workshop__/props.tsx +0 -75
- package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
- package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
- package/src/core/components/dialog/dialog.tsx +0 -430
- package/src/core/components/dialog/dialogContext.ts +0 -20
- package/src/core/components/dialog/dialogProvider.tsx +0 -35
- package/src/core/components/dialog/index.ts +0 -4
- package/src/core/components/dialog/styles.ts +0 -77
- package/src/core/components/dialog/useDialog.ts +0 -11
- package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
- package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
- package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
- package/src/core/components/hotkeys/hotkeys.tsx +0 -66
- package/src/core/components/hotkeys/index.ts +0 -1
- package/src/core/components/index.ts +0 -9
- package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
- package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
- package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
- package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
- package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
- package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
- package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
- package/src/core/components/menu/__workshop__/groups.tsx +0 -156
- package/src/core/components/menu/__workshop__/index.ts +0 -89
- package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
- package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -58
- package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
- package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
- package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
- package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
- package/src/core/components/menu/__workshop__/tones.tsx +0 -25
- package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
- package/src/core/components/menu/helpers.ts +0 -82
- package/src/core/components/menu/index.ts +0 -5
- package/src/core/components/menu/menu.spacing.test.tsx +0 -63
- package/src/core/components/menu/menu.test.tsx +0 -125
- package/src/core/components/menu/menu.tsx +0 -178
- package/src/core/components/menu/menuButton.tsx +0 -268
- package/src/core/components/menu/menuContext.ts +0 -18
- package/src/core/components/menu/menuDivider.ts +0 -23
- package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
- package/src/core/components/menu/menuGroup.tsx +0 -233
- package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
- package/src/core/components/menu/menuItem.tsx +0 -197
- package/src/core/components/menu/useMenu.ts +0 -21
- package/src/core/components/menu/useMenuController.ts +0 -231
- package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
- package/src/core/components/skeleton/__workshop__/index.ts +0 -11
- package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
- package/src/core/components/skeleton/index.ts +0 -2
- package/src/core/components/skeleton/skeleton.tsx +0 -57
- package/src/core/components/skeleton/styles.ts +0 -50
- package/src/core/components/skeleton/textSkeleton.tsx +0 -122
- package/src/core/components/tab/__workshop__/example.tsx +0 -79
- package/src/core/components/tab/__workshop__/index.ts +0 -14
- package/src/core/components/tab/index.ts +0 -3
- package/src/core/components/tab/tab.tsx +0 -101
- package/src/core/components/tab/tabList.test.tsx +0 -48
- package/src/core/components/tab/tabList.tsx +0 -70
- package/src/core/components/tab/tabPanel.tsx +0 -39
- package/src/core/components/toast/__workshop__/hook.tsx +0 -71
- package/src/core/components/toast/__workshop__/index.ts +0 -19
- package/src/core/components/toast/__workshop__/toast.tsx +0 -26
- package/src/core/components/toast/index.ts +0 -4
- package/src/core/components/toast/styles.ts +0 -77
- package/src/core/components/toast/toast.test.tsx +0 -101
- package/src/core/components/toast/toast.tsx +0 -198
- package/src/core/components/toast/toastContext.ts +0 -7
- package/src/core/components/toast/toastLayer.tsx +0 -51
- package/src/core/components/toast/toastProvider.tsx +0 -113
- package/src/core/components/toast/toastState.ts +0 -6
- package/src/core/components/toast/types.ts +0 -26
- package/src/core/components/toast/useToast.ts +0 -25
- package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
- package/src/core/components/tree/__workshop__/basic.tsx +0 -105
- package/src/core/components/tree/__workshop__/index.ts +0 -21
- package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
- package/src/core/components/tree/helpers.ts +0 -105
- package/src/core/components/tree/index.ts +0 -4
- package/src/core/components/tree/style.ts +0 -105
- package/src/core/components/tree/tree.test.tsx +0 -55
- package/src/core/components/tree/tree.tsx +0 -240
- package/src/core/components/tree/treeContext.ts +0 -10
- package/src/core/components/tree/treeGroup.tsx +0 -28
- package/src/core/components/tree/treeItem.test.tsx +0 -65
- package/src/core/components/tree/treeItem.tsx +0 -224
- package/src/core/components/tree/types.ts +0 -25
- package/src/core/components/tree/useTree.ts +0 -17
- package/src/core/constants.ts +0 -79
- package/src/core/helpers/animation.ts +0 -27
- package/src/core/helpers/element.ts +0 -55
- package/src/core/helpers/focus.ts +0 -100
- package/src/core/helpers/index.ts +0 -4
- package/src/core/helpers/scroll.ts +0 -15
- package/src/core/hooks/index.ts +0 -12
- package/src/core/hooks/useArrayProp.ts +0 -17
- package/src/core/hooks/useClickOutside.test.tsx +0 -482
- package/src/core/hooks/useClickOutside.ts +0 -118
- package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
- package/src/core/hooks/useClickOutsideEvent.ts +0 -73
- package/src/core/hooks/useCustomValidity.ts +0 -13
- package/src/core/hooks/useDelayed.test.ts +0 -88
- package/src/core/hooks/useDelayedState.ts +0 -36
- package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
- package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
- package/src/core/hooks/useElementRect/index.ts +0 -1
- package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
- package/src/core/hooks/useElementSize.ts +0 -19
- package/src/core/hooks/useForwardedRef.ts +0 -19
- package/src/core/hooks/useGlobalKeyDown.ts +0 -24
- package/src/core/hooks/useIsomorphicEffect.ts +0 -7
- package/src/core/hooks/useMatchMedia.ts +0 -28
- package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
- package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
- package/src/core/hooks/useMediaIndex/index.ts +0 -1
- package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
- package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
- package/src/core/hooks/useMounted.ts +0 -15
- package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
- package/src/core/hooks/usePrefersDark.test.tsx +0 -19
- package/src/core/hooks/usePrefersDark.ts +0 -16
- package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
- package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
- package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
- package/src/core/index.ts +0 -10
- package/src/core/lib/createGlobalScopedContext.ts +0 -36
- package/src/core/lib/globalScope.ts +0 -19
- package/src/core/lib/isRecord.ts +0 -3
- package/src/core/middleware/origin.ts +0 -47
- package/src/core/observers/elementSizeObserver.ts +0 -116
- package/src/core/observers/index.ts +0 -2
- package/src/core/observers/resizeObserver.ts +0 -9
- package/src/core/primitives/_selectable/index.ts +0 -1
- package/src/core/primitives/_selectable/selectable.tsx +0 -15
- package/src/core/primitives/_selectable/style.ts +0 -115
- package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
- package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
- package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
- package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
- package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
- package/src/core/primitives/avatar/avatar.tsx +0 -200
- package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
- package/src/core/primitives/avatar/avatarStack.tsx +0 -100
- package/src/core/primitives/avatar/index.ts +0 -4
- package/src/core/primitives/avatar/styles.ts +0 -167
- package/src/core/primitives/avatar/types.ts +0 -17
- package/src/core/primitives/badge/__workshop__/index.ts +0 -19
- package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
- package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
- package/src/core/primitives/badge/badge.test.tsx +0 -16
- package/src/core/primitives/badge/badge.tsx +0 -70
- package/src/core/primitives/badge/index.ts +0 -1
- package/src/core/primitives/badge/styles.ts +0 -20
- package/src/core/primitives/badge/types.ts +0 -8
- package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
- package/src/core/primitives/box/__workshop__/index.ts +0 -24
- package/src/core/primitives/box/__workshop__/props.tsx +0 -20
- package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
- package/src/core/primitives/box/box.test.tsx +0 -142
- package/src/core/primitives/box/box.tsx +0 -154
- package/src/core/primitives/box/index.ts +0 -1
- package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
- package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
- package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
- package/src/core/primitives/button/__workshop__/index.ts +0 -59
- package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +0 -36
- package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
- package/src/core/primitives/button/__workshop__/props.tsx +0 -55
- package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
- package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
- package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
- package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
- package/src/core/primitives/button/button.test.tsx +0 -82
- package/src/core/primitives/button/button.tsx +0 -210
- package/src/core/primitives/button/index.ts +0 -1
- package/src/core/primitives/button/styles.ts +0 -117
- package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
- package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
- package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
- package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
- package/src/core/primitives/card/__workshop__/index.ts +0 -18
- package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
- package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
- package/src/core/primitives/card/__workshop__/props.tsx +0 -53
- package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
- package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
- package/src/core/primitives/card/card.tsx +0 -128
- package/src/core/primitives/card/index.ts +0 -2
- package/src/core/primitives/card/styles.ts +0 -147
- package/src/core/primitives/card/types.ts +0 -11
- package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
- package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
- package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
- package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
- package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
- package/src/core/primitives/checkbox/checkbox.tsx +0 -73
- package/src/core/primitives/checkbox/index.ts +0 -1
- package/src/core/primitives/checkbox/styles.ts +0 -128
- package/src/core/primitives/code/__workshop__/index.ts +0 -19
- package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/code/__workshop__/props.tsx +0 -21
- package/src/core/primitives/code/code.tsx +0 -55
- package/src/core/primitives/code/index.ts +0 -1
- package/src/core/primitives/code/refractor.tsx +0 -20
- package/src/core/primitives/code/styles.ts +0 -77
- package/src/core/primitives/container/__workshop__/example.tsx +0 -20
- package/src/core/primitives/container/__workshop__/index.ts +0 -8
- package/src/core/primitives/container/container.tsx +0 -54
- package/src/core/primitives/container/index.ts +0 -2
- package/src/core/primitives/container/styles.ts +0 -23
- package/src/core/primitives/container/types.ts +0 -6
- package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
- package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
- package/src/core/primitives/flex/__workshop__/index.ts +0 -11
- package/src/core/primitives/flex/flex.tsx +0 -64
- package/src/core/primitives/flex/index.ts +0 -1
- package/src/core/primitives/grid/__workshop__/index.ts +0 -10
- package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
- package/src/core/primitives/grid/grid.test.tsx +0 -80
- package/src/core/primitives/grid/grid.tsx +0 -74
- package/src/core/primitives/grid/index.ts +0 -1
- package/src/core/primitives/heading/__workshop__/index.ts +0 -19
- package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
- package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
- package/src/core/primitives/heading/heading.tsx +0 -88
- package/src/core/primitives/heading/index.ts +0 -1
- package/src/core/primitives/heading/styles.ts +0 -64
- package/src/core/primitives/heading/types.ts +0 -7
- package/src/core/primitives/index.ts +0 -27
- package/src/core/primitives/inline/__workshop__/index.ts +0 -8
- package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
- package/src/core/primitives/inline/index.ts +0 -1
- package/src/core/primitives/inline/inline.test.tsx +0 -51
- package/src/core/primitives/inline/inline.tsx +0 -63
- package/src/core/primitives/inline/styles.ts +0 -32
- package/src/core/primitives/inline/types.ts +0 -6
- package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
- package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
- package/src/core/primitives/kbd/index.ts +0 -1
- package/src/core/primitives/kbd/kbd.tsx +0 -69
- package/src/core/primitives/label/__workshop__/index.ts +0 -19
- package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
- package/src/core/primitives/label/index.ts +0 -1
- package/src/core/primitives/label/label.tsx +0 -87
- package/src/core/primitives/label/styles.ts +0 -45
- package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
- package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
- package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
- package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
- package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
- package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
- package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
- package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
- package/src/core/primitives/popover/__workshop__/index.ts +0 -49
- package/src/core/primitives/popover/constants.ts +0 -22
- package/src/core/primitives/popover/floating-ui/size.ts +0 -99
- package/src/core/primitives/popover/helpers.ts +0 -31
- package/src/core/primitives/popover/index.ts +0 -2
- package/src/core/primitives/popover/popover.tsx +0 -511
- package/src/core/primitives/popover/popoverCard.tsx +0 -166
- package/src/core/primitives/popover/types.ts +0 -7
- package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
- package/src/core/primitives/radio/__workshop__/index.ts +0 -11
- package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
- package/src/core/primitives/radio/index.ts +0 -1
- package/src/core/primitives/radio/radio.tsx +0 -51
- package/src/core/primitives/radio/styles.ts +0 -117
- package/src/core/primitives/select/__workshop__/index.ts +0 -11
- package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
- package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
- package/src/core/primitives/select/index.ts +0 -1
- package/src/core/primitives/select/select.test.tsx +0 -52
- package/src/core/primitives/select/select.tsx +0 -94
- package/src/core/primitives/select/styles.ts +0 -166
- package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
- package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
- package/src/core/primitives/spinner/index.ts +0 -1
- package/src/core/primitives/spinner/spinner.tsx +0 -46
- package/src/core/primitives/stack/__workshop__/index.ts +0 -14
- package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
- package/src/core/primitives/stack/index.ts +0 -1
- package/src/core/primitives/stack/stack.test.tsx +0 -57
- package/src/core/primitives/stack/stack.tsx +0 -57
- package/src/core/primitives/stack/styles.ts +0 -32
- package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
- package/src/core/primitives/switch/__workshop__/index.ts +0 -11
- package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
- package/src/core/primitives/switch/index.ts +0 -1
- package/src/core/primitives/switch/styles.ts +0 -173
- package/src/core/primitives/switch/switch.tsx +0 -68
- package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
- package/src/core/primitives/text/__workshop__/example.tsx +0 -39
- package/src/core/primitives/text/__workshop__/index.ts +0 -24
- package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/text/index.ts +0 -1
- package/src/core/primitives/text/styles.ts +0 -74
- package/src/core/primitives/text/text.tsx +0 -89
- package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
- package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
- package/src/core/primitives/textArea/index.ts +0 -1
- package/src/core/primitives/textArea/textArea.tsx +0 -120
- package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
- package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
- package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
- package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
- package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
- package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
- package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
- package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
- package/src/core/primitives/textInput/index.ts +0 -1
- package/src/core/primitives/textInput/textInput.test.tsx +0 -48
- package/src/core/primitives/textInput/textInput.tsx +0 -395
- package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
- package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
- package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
- package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
- package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
- package/src/core/primitives/tooltip/constants.ts +0 -23
- package/src/core/primitives/tooltip/index.ts +0 -2
- package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
- package/src/core/primitives/tooltip/tooltip.tsx +0 -495
- package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
- package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
- package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
- package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
- package/src/core/primitives/types.ts +0 -179
- package/src/core/styles/border/borderStyle.ts +0 -56
- package/src/core/styles/border/index.ts +0 -2
- package/src/core/styles/border/types.ts +0 -10
- package/src/core/styles/box/boxStyle.ts +0 -69
- package/src/core/styles/box/index.ts +0 -2
- package/src/core/styles/box/types.ts +0 -11
- package/src/core/styles/card/_cardColorStyle.ts +0 -108
- package/src/core/styles/card/index.ts +0 -1
- package/src/core/styles/flex/flexItemStyle.ts +0 -27
- package/src/core/styles/flex/flexStyle.ts +0 -70
- package/src/core/styles/flex/index.ts +0 -3
- package/src/core/styles/flex/types.ts +0 -25
- package/src/core/styles/focusRing/index.ts +0 -25
- package/src/core/styles/font/codeFontStyle.ts +0 -13
- package/src/core/styles/font/headingFontStyle.ts +0 -13
- package/src/core/styles/font/index.ts +0 -6
- package/src/core/styles/font/labelFontStyle.ts +0 -13
- package/src/core/styles/font/responsiveFont.ts +0 -103
- package/src/core/styles/font/textAlignStyle.ts +0 -19
- package/src/core/styles/font/textFontStyle.ts +0 -13
- package/src/core/styles/font/types.ts +0 -35
- package/src/core/styles/grid/gridItemStyle.ts +0 -82
- package/src/core/styles/grid/gridStyle.ts +0 -108
- package/src/core/styles/grid/index.ts +0 -3
- package/src/core/styles/grid/types.ts +0 -37
- package/src/core/styles/helpers.ts +0 -72
- package/src/core/styles/index.ts +0 -5
- package/src/core/styles/input/index.ts +0 -2
- package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
- package/src/core/styles/input/textInputStyle.ts +0 -263
- package/src/core/styles/internal.ts +0 -12
- package/src/core/styles/margin/index.ts +0 -2
- package/src/core/styles/margin/marginStyle.ts +0 -21
- package/src/core/styles/margin/marginsStyle.test.ts +0 -33
- package/src/core/styles/margin/types.ts +0 -9
- package/src/core/styles/padding/index.ts +0 -2
- package/src/core/styles/padding/paddingStyle.test.ts +0 -33
- package/src/core/styles/padding/paddingStyle.ts +0 -21
- package/src/core/styles/padding/types.ts +0 -12
- package/src/core/styles/radius/index.ts +0 -2
- package/src/core/styles/radius/radiusStyle.ts +0 -23
- package/src/core/styles/radius/types.ts +0 -8
- package/src/core/styles/shadow/index.ts +0 -2
- package/src/core/styles/shadow/shadowStyle.ts +0 -29
- package/src/core/styles/shadow/types.ts +0 -6
- package/src/core/styles/types.ts +0 -8
- package/src/core/theme/__workshop__/build/Root.tsx +0 -367
- package/src/core/theme/__workshop__/build/helpers.ts +0 -46
- package/src/core/theme/__workshop__/build/story.tsx +0 -465
- package/src/core/theme/__workshop__/canvas.tsx +0 -352
- package/src/core/theme/__workshop__/color.tsx +0 -62
- package/src/core/theme/__workshop__/debug/story.tsx +0 -408
- package/src/core/theme/__workshop__/index.ts +0 -39
- package/src/core/theme/__workshop__/layer.tsx +0 -78
- package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
- package/src/core/theme/index.ts +0 -5
- package/src/core/theme/theme.test.tsx +0 -73
- package/src/core/theme/themeColorProvider.tsx +0 -29
- package/src/core/theme/themeContext.ts +0 -10
- package/src/core/theme/themeProvider.tsx +0 -62
- package/src/core/theme/types.ts +0 -12
- package/src/core/theme/useRootTheme.ts +0 -17
- package/src/core/theme/useTheme.ts +0 -16
- package/src/core/types/avatar.ts +0 -14
- package/src/core/types/badge.ts +0 -12
- package/src/core/types/box.ts +0 -19
- package/src/core/types/button.ts +0 -21
- package/src/core/types/card.ts +0 -6
- package/src/core/types/component.ts +0 -32
- package/src/core/types/dialog.ts +0 -4
- package/src/core/types/flex.ts +0 -30
- package/src/core/types/grid.ts +0 -14
- package/src/core/types/gridItem.ts +0 -29
- package/src/core/types/index.ts +0 -15
- package/src/core/types/placement.ts +0 -18
- package/src/core/types/popover.ts +0 -4
- package/src/core/types/radius.ts +0 -4
- package/src/core/types/selectable.ts +0 -6
- package/src/core/types/text.ts +0 -4
- package/src/core/utils/arrow/arrow.tsx +0 -123
- package/src/core/utils/arrow/cmds.ts +0 -91
- package/src/core/utils/arrow/index.ts +0 -1
- package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
- package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
- package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
- package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
- package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
- package/src/core/utils/boundaryElement/index.ts +0 -3
- package/src/core/utils/boundaryElement/types.ts +0 -7
- package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
- package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
- package/src/core/utils/conditionalWrapper/index.ts +0 -1
- package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
- package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
- package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
- package/src/core/utils/elementQuery/helpers.ts +0 -27
- package/src/core/utils/elementQuery/index.ts +0 -1
- package/src/core/utils/errorBoundary.tsx +0 -48
- package/src/core/utils/getElementRef.ts +0 -26
- package/src/core/utils/index.ts +0 -9
- package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
- package/src/core/utils/layer/__workshop__/index.ts +0 -24
- package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
- package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
- package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
- package/src/core/utils/layer/getLayerContext.test.ts +0 -30
- package/src/core/utils/layer/getLayerContext.ts +0 -21
- package/src/core/utils/layer/index.ts +0 -4
- package/src/core/utils/layer/layer.test.tsx +0 -108
- package/src/core/utils/layer/layer.tsx +0 -98
- package/src/core/utils/layer/layerContext.ts +0 -7
- package/src/core/utils/layer/layerProvider.tsx +0 -111
- package/src/core/utils/layer/types.ts +0 -9
- package/src/core/utils/layer/useLayer.ts +0 -26
- package/src/core/utils/portal/__workshop__/index.ts +0 -14
- package/src/core/utils/portal/__workshop__/named.tsx +0 -63
- package/src/core/utils/portal/index.ts +0 -4
- package/src/core/utils/portal/portal.test.tsx +0 -103
- package/src/core/utils/portal/portal.ts +0 -32
- package/src/core/utils/portal/portalContext.ts +0 -31
- package/src/core/utils/portal/portalProvider.tsx +0 -47
- package/src/core/utils/portal/types.ts +0 -9
- package/src/core/utils/portal/usePortal.ts +0 -25
- package/src/core/utils/spanWithTextOverflow.tsx +0 -10
- package/src/core/utils/srOnly/index.ts +0 -1
- package/src/core/utils/srOnly/srOnly.tsx +0 -36
- package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
- package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
- package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
- package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
- package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
- package/src/core/utils/virtualList/index.ts +0 -1
- package/src/core/utils/virtualList/virtualList.tsx +0 -200
- package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
- package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
- package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
- package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
- package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
- package/src/theme/build/_deprecated/color/color.test.ts +0 -63
- package/src/theme/build/_deprecated/color/defaults.ts +0 -390
- package/src/theme/build/_deprecated/color/factory.ts +0 -142
- package/src/theme/build/_deprecated/color/index.ts +0 -1
- package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
- package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
- package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
- package/src/theme/build/buildColorTheme.test.ts +0 -183
- package/src/theme/build/buildColorTheme.ts +0 -499
- package/src/theme/build/buildTheme.test.ts +0 -87
- package/src/theme/build/buildTheme.ts +0 -36
- package/src/theme/build/colorToken/colorToken.ts +0 -19
- package/src/theme/build/colorToken/compileColorToken.ts +0 -21
- package/src/theme/build/colorToken/index.ts +0 -2
- package/src/theme/build/colorToken/types.ts +0 -6
- package/src/theme/build/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
- package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
- package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
- package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
- package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
- package/src/theme/build/lib/color-fns/convert.ts +0 -150
- package/src/theme/build/lib/color-fns/index.ts +0 -6
- package/src/theme/build/lib/color-fns/parse.ts +0 -60
- package/src/theme/build/lib/color-fns/rgba.ts +0 -10
- package/src/theme/build/lib/color-fns/types.ts +0 -28
- package/src/theme/build/lib/isRecord.ts +0 -3
- package/src/theme/build/lib/lazy.ts +0 -30
- package/src/theme/build/lib/utils.ts +0 -19
- package/src/theme/build/merge.ts +0 -26
- package/src/theme/build/mixThemeColor.test.ts +0 -21
- package/src/theme/build/mixThemeColor.ts +0 -53
- package/src/theme/build/renderColorTheme.ts +0 -532
- package/src/theme/build/renderColorValue.ts +0 -85
- package/src/theme/build/resolveColorTokens.ts +0 -268
- package/src/theme/build/theme.test.ts +0 -27
- package/src/theme/config/helpers.ts +0 -55
- package/src/theme/config/index.ts +0 -4
- package/src/theme/config/system.ts +0 -115
- package/src/theme/config/tokens/color/index.ts +0 -1
- package/src/theme/config/tokens/color/types.ts +0 -133
- package/src/theme/config/tokens/index.ts +0 -4
- package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
- package/src/theme/config/tokens/parseTokenKey.ts +0 -67
- package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
- package/src/theme/config/tokens/parseTokenValue.ts +0 -133
- package/src/theme/config/tokens/types.ts +0 -53
- package/src/theme/config/types.ts +0 -46
- package/src/theme/defaults/colorPalette.ts +0 -5
- package/src/theme/defaults/colorTokens.ts +0 -648
- package/src/theme/defaults/config.ts +0 -84
- package/src/theme/defaults/fonts.ts +0 -227
- package/src/theme/getScopedTheme.ts +0 -98
- package/src/theme/index.ts +0 -5
- package/src/theme/system/avatar.ts +0 -14
- package/src/theme/system/color/_constants.ts +0 -45
- package/src/theme/system/color/_helpers.ts +0 -24
- package/src/theme/system/color/_system.ts +0 -40
- package/src/theme/system/color/avatar.ts +0 -15
- package/src/theme/system/color/badge.ts +0 -16
- package/src/theme/system/color/button.ts +0 -17
- package/src/theme/system/color/color.ts +0 -34
- package/src/theme/system/color/index.ts +0 -13
- package/src/theme/system/color/input.ts +0 -25
- package/src/theme/system/color/kbd.ts +0 -8
- package/src/theme/system/color/selectable.ts +0 -12
- package/src/theme/system/color/shadow.ts +0 -7
- package/src/theme/system/color/state.ts +0 -43
- package/src/theme/system/color/syntax.ts +0 -41
- package/src/theme/system/css.ts +0 -14
- package/src/theme/system/focusRing.ts +0 -7
- package/src/theme/system/font.ts +0 -52
- package/src/theme/system/index.ts +0 -11
- package/src/theme/system/input.ts +0 -33
- package/src/theme/system/layer.ts +0 -8
- package/src/theme/system/shadow.ts +0 -19
- package/src/theme/system/styles.ts +0 -13
- package/src/theme/system/theme.ts +0 -138
- package/src/theme/system/v0/avatar.ts +0 -10
- package/src/theme/system/v0/color/_generic.ts +0 -35
- package/src/theme/system/v0/color/_system.ts +0 -17
- package/src/theme/system/v0/color/base.ts +0 -21
- package/src/theme/system/v0/color/button.ts +0 -42
- package/src/theme/system/v0/color/card.ts +0 -19
- package/src/theme/system/v0/color/color.ts +0 -40
- package/src/theme/system/v0/color/index.ts +0 -11
- package/src/theme/system/v0/color/input.ts +0 -34
- package/src/theme/system/v0/color/muted.ts +0 -26
- package/src/theme/system/v0/color/selectable.ts +0 -31
- package/src/theme/system/v0/color/solid.ts +0 -26
- package/src/theme/system/v0/color/spot.ts +0 -13
- package/src/theme/system/v0/index.ts +0 -3
- package/src/theme/system/v0/input.ts +0 -23
- package/src/theme/versioning/getTheme_v2.ts +0 -57
- package/src/theme/versioning/index.ts +0 -5
- package/src/theme/versioning/is_v0.ts +0 -6
- package/src/theme/versioning/is_v2.ts +0 -6
- package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
- package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
- package/src/theme/versioning/v0_v2.ts +0 -94
- package/src/theme/versioning/v2_v0.ts +0 -135
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-link.js","names":[],"sources":["../../../src/controls/table/table-link.tsx"],"sourcesContent":["/**\n * A link cell's address (BE TableLink `{ label, href, newTab?, rel? }`): the address, \"Open in a new tab\" and the\n * relationship search engines read. V2 opened its global link panel (controls/link.tsx LinkPopoverBody); that panel is the\n * link lane's, so the table carries this one, writing the same four keys the backend takes and nothing else.\n *\n * Refusals are named before anything is written: a script address (javascript:, data:, vbscript:) is refused here\n * exactly as the backend refuses it (`link_value_invalid`).\n */\nimport * as React from \"react\";\nimport { IconLink } from \"@tabler/icons-react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport { Switch } from \"../../ui/controls\";\nimport { Select } from \"../../ui/select\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../../ui/overlay\";\nimport type { TableLink } from \"../../schema/table\";\n\nexport const LINK_RELS: { value: NonNullable<TableLink[\"rel\"]>; label: string }[] = [\n { value: \"follow\", label: \"Follow (default)\" },\n { value: \"nofollow\", label: \"Don't vouch for it (nofollow)\" },\n { value: \"sponsored\", label: \"Paid or sponsored\" },\n { value: \"ugc\", label: \"Written by visitors\" },\n];\n\n/** BE link-value.ts isScriptHref: what no link may hold. */\nexport const isScriptHref = (href: string) => /^\\s*(javascript|data|vbscript):/i.test(href.replace(/[\\p{Cc}\\s]+/gu, \"\"));\nexport const hrefProblem = (href: string) => (isScriptHref(href) ? \"Script links (javascript:, data:, vbscript:) aren't allowed.\" : null);\n\n/** The stored link with only the keys it uses: `newTab` only when on, `rel` only when not the default. */\nexport function tableLink(label: string, href: string, newTab?: boolean, rel?: TableLink[\"rel\"]): TableLink {\n return { label, href, ...(newTab ? { newTab: true } : {}), ...(rel && rel !== \"follow\" ? { rel } : {}) };\n}\n\n/** Address + options, as one popover body (the spreadsheet's link button) or inline (a row's link cell). */\nexport function LinkAddressEditor({\n link,\n onSave,\n onCancel,\n autoFocus,\n}: {\n link: TableLink;\n onSave: (next: TableLink) => void;\n onCancel?: () => void;\n autoFocus?: boolean;\n}) {\n const [href, setHref] = React.useState(link.href);\n const [newTab, setNewTab] = React.useState(!!link.newTab);\n const [rel, setRel] = React.useState<NonNullable<TableLink[\"rel\"]>>(link.rel ?? \"follow\");\n const id = React.useId();\n const problem = hrefProblem(href);\n const save = () => !problem && onSave(tableLink(link.label, href.trim(), newTab, rel));\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col gap-1.5\">\n <label htmlFor={`${id}-href`} className=\"text-kit-xs font-medium text-kit-fg-2\">Address</label>\n <Input\n id={`${id}-href`}\n size=\"sm\"\n autoFocus={autoFocus}\n value={href}\n placeholder=\"https://… or /pricing\"\n aria-invalid={problem ? true : undefined}\n aria-describedby={problem ? `${id}-problem` : undefined}\n onChange={(e) => setHref(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") { e.preventDefault(); save(); }\n }}\n />\n {problem ? <p id={`${id}-problem`} role=\"alert\" className=\"text-kit-xs text-kit-danger-fg\">{problem}</p> : null}\n </div>\n <div className=\"flex min-h-8 items-center justify-between gap-2 text-kit-sm text-kit-fg-2\">\n <span aria-hidden>Open in a new tab</span>\n <Switch size=\"sm\" checked={newTab} onCheckedChange={setNewTab} aria-label=\"Open in a new tab\" />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <span id={`${id}-rel`} className=\"text-kit-xs font-medium text-kit-fg-2\">Search engines</span>\n <Select aria-label=\"Search engines\" size=\"sm\" value={rel} onValueChange={(v) => setRel(v as typeof rel)} options={LINK_RELS} />\n </div>\n <div className=\"flex items-center justify-end gap-1.5\">\n {link.href ? (\n <Button size=\"sm\" variant=\"ghost\" className=\"mr-auto text-kit-fg-2\" onClick={() => onSave(tableLink(link.label, \"\"))}>\n Remove link\n </Button>\n ) : null}\n {onCancel ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancel}>\n Cancel\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"primary\" disabled={!!problem} onClick={save}>\n Save\n </Button>\n </div>\n </div>\n );\n}\n\n/** The small link button beside a link cell's words: opens the address editor. */\nexport function LinkAddressButton({ link, onSave, readOnly, className }: { link: TableLink; onSave: (l: TableLink) => void; readOnly?: boolean; className?: string }) {\n const [open, setOpen] = React.useState(false);\n if (readOnly && !link.href) return null;\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n disabled={readOnly}\n tabIndex={-1}\n aria-label={link.href ? `Link: ${link.href}` : \"Add a link address\"}\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded-kit-sm text-kit-fg-4 outline-none hover:bg-kit-hover hover:text-kit-fg\",\n link.href && \"text-kit-fg-2\",\n className,\n )}\n >\n <IconLink className=\"size-3.5\" stroke={1.75} />\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-[320px] p-3\">\n <LinkAddressEditor\n link={link}\n autoFocus\n onCancel={() => setOpen(false)}\n onSave={(l) => {\n onSave(l);\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,IAAa,YAAuE;CAClF;EAAE,OAAO;EAAU,OAAO;CAAmB;CAC7C;EAAE,OAAO;EAAY,OAAO;CAAgC;CAC5D;EAAE,OAAO;EAAa,OAAO;CAAoB;CACjD;EAAE,OAAO;EAAO,OAAO;CAAsB;AAC/C;;AAGA,IAAa,gBAAgB,SAAiB,mCAAmC,KAAK,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AACvH,IAAa,eAAe,SAAkB,aAAa,IAAI,IAAI,iEAAiE;;AAGpI,SAAgB,UAAU,OAAe,MAAc,QAAkB,KAAmC;CAC1G,OAAO;EAAE;EAAO;EAAM,GAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;EAAI,GAAI,OAAO,QAAQ,WAAW,EAAE,IAAI,IAAI,CAAC;CAAG;AACzG;;AAGA,SAAgB,kBAAkB,EAChC,MACA,QACA,UACA,aAMC;CACD,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,KAAK,IAAI;CAChD,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,CAAC,CAAC,KAAK,MAAM;CACxD,MAAM,CAAC,KAAK,UAAU,MAAM,SAAwC,KAAK,OAAO,QAAQ;CACxF,MAAM,KAAK,MAAM,MAAM;CACvB,MAAM,UAAU,YAAY,IAAI;CAChC,MAAM,aAAa,CAAC,WAAW,OAAO,UAAU,KAAK,OAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,CAAC;CACrF,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,SAAD;MAAO,SAAS,GAAG,GAAG;MAAQ,WAAU;MAAwC,UAAA;KAAc,CAAA;KAC9F,oBAAC,OAAD;MACE,IAAI,GAAG,GAAG;MACV,MAAK;MACM;MACX,OAAO;MACP,aAAY;MACZ,gBAAc,UAAU,OAAO,KAAA;MAC/B,oBAAkB,UAAU,GAAG,GAAG,YAAY,KAAA;MAC9C,WAAW,MAAM,QAAQ,EAAE,OAAO,KAAK;MACvC,YAAY,MAAM;OAChB,IAAI,EAAE,QAAQ,SAAS;QAAE,EAAE,eAAe;QAAG,KAAK;OAAG;MACvD;KACD,CAAA;KACA,UAAU,oBAAC,KAAD;MAAG,IAAI,GAAG,GAAG;MAAW,MAAK;MAAQ,WAAU;MAAkC,UAAA;KAAW,CAAA,IAAI;IACxG;;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,QAAD;KAAM,eAAA;KAAY,UAAA;IAAuB,CAAA,GACzC,oBAAC,QAAD;KAAQ,MAAK;KAAK,SAAS;KAAQ,iBAAiB;KAAW,cAAW;IAAqB,CAAA,CAC5F;;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,QAAD;KAAM,IAAI,GAAG,GAAG;KAAO,WAAU;KAAwC,UAAA;IAAoB,CAAA,GAC7F,oBAAC,QAAD;KAAQ,cAAW;KAAiB,MAAK;KAAK,OAAO;KAAK,gBAAgB,MAAM,OAAO,CAAe;KAAG,SAAS;IAAY,CAAA,CAC3H;;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,KAAK,OACJ,oBAAC,QAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,WAAU;MAAwB,eAAe,OAAO,UAAU,KAAK,OAAO,EAAE,CAAC;MAAG,UAAA;KAE9G,CAAA,IACN;KACH,WACC,oBAAC,QAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,SAAS;MAAU,UAAA;KAE7C,CAAA,IACN;KACJ,oBAAC,QAAD;MAAQ,MAAK;MAAK,SAAQ;MAAU,UAAU,CAAC,CAAC;MAAS,SAAS;MAAM,UAAA;KAEhE,CAAA;IACL;;EACF;;AAET;;AAGA,SAAgB,kBAAkB,EAAE,MAAM,QAAQ,UAAU,aAA0G;CACpK,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,KAAK;CAC5C,IAAI,YAAY,CAAC,KAAK,MAAM,OAAO;CACnC,OACE,qBAAC,SAAD;EAAe;EAAM,cAAc;EAAnC,UAAA,CACE,oBAAC,gBAAD;GACE,UAAU;GACV,UAAU;GACV,cAAY,KAAK,OAAO,SAAS,KAAK,SAAS;GAC/C,WAAW,GACT,mIACA,KAAK,QAAQ,iBACb,SACF;GAEA,UAAA,oBAAC,UAAD;IAAU,WAAU;IAAW,QAAQ;GAAO,CAAA;EAChC,CAAA,GAChB,oBAAC,gBAAD;GAAgB,OAAM;GAAM,WAAU;GACpC,UAAA,oBAAC,mBAAD;IACQ;IACN,WAAA;IACA,gBAAgB,QAAQ,KAAK;IAC7B,SAAS,MAAM;KACb,OAAO,CAAC;KACR,QAAQ,KAAK;IACf;GACD,CAAA;EACa,CAAA,CACT;;AAEb"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Frame } from "../../lib/frames";
|
|
2
|
+
import type { ControlProps } from "../../types";
|
|
3
|
+
/** Label-row action of a table field (KitField ACTIONS.table): the one way into the full-screen spreadsheet (D49). */
|
|
4
|
+
export declare function TableFullScreenAction({ path }: Pick<ControlProps, "path">): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function TableControl({ field, value, onChange, readOnly, path }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
/** The body of a drilled table row or column frame (FrameView draws the standard header above it): FrameSlots.TableFrame. */
|
|
7
|
+
export declare function TableFrame({ frame }: {
|
|
8
|
+
frame: Frame;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { GENERAL_TABLE, emptyTable, isTableValue, normalizeTable } from "../../schema/table.js";
|
|
2
|
+
import { resolveFieldAccess, useForm, useKitEnv } from "../../context.js";
|
|
3
|
+
import { pathKey } from "../../lib/path.js";
|
|
4
|
+
import { TableEditor, TableFullScreenButton, TableItemEditor } from "./table-editor.js";
|
|
5
|
+
import { storedTable } from "./stored.js";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
//#region src/controls/table/table.tsx
|
|
9
|
+
/**
|
|
10
|
+
* TABLE control (CPO D42, D50, D52; port of V2 kit/controls/table.tsx): the `table` field type (a content-model `table`
|
|
11
|
+
* field, or a component `table` prop with `config.mode: "data"`) edits like any nested array, with no container of its
|
|
12
|
+
* own: Title, Columns, Rows (groups live in the row list), Note under the table, and a collapsed Table settings that
|
|
13
|
+
* offers only what `field.table.settings` allows (no `table` options = a general table, everything offered). A row or a
|
|
14
|
+
* column drills through the form's own navigation (TableFrame), so the breadcrumb and frame header are the ones every
|
|
15
|
+
* FAQ or feature item uses. The ⤢ button in the field's label row (TableFullScreenAction) opens the spreadsheet in the
|
|
16
|
+
* expanded-editor modal (D49).
|
|
17
|
+
*
|
|
18
|
+
* Value: `TableValue` (schema/table.ts), written in the exact shape the backend stores (stored.ts): keys the editor
|
|
19
|
+
* fills in for itself are never written back unless the person changed them.
|
|
20
|
+
*/
|
|
21
|
+
var fullKey = null;
|
|
22
|
+
var subs = /* @__PURE__ */ new Set();
|
|
23
|
+
var setFullKey = (k) => {
|
|
24
|
+
fullKey = k;
|
|
25
|
+
subs.forEach((f) => f());
|
|
26
|
+
};
|
|
27
|
+
var subscribe = (f) => (subs.add(f), () => void subs.delete(f));
|
|
28
|
+
var useFullOpen = (k) => React.useSyncExternalStore(subscribe, () => fullKey === k, () => false);
|
|
29
|
+
var fullKeyOf = (docId, path) => `${docId}:${pathKey(path)}`;
|
|
30
|
+
/** Label-row action of a table field (KitField ACTIONS.table): the one way into the full-screen spreadsheet (D49). */
|
|
31
|
+
function TableFullScreenAction({ path }) {
|
|
32
|
+
const env = useKitEnv();
|
|
33
|
+
return /* @__PURE__ */ jsx(TableFullScreenButton, {
|
|
34
|
+
className: "-my-1",
|
|
35
|
+
onOpen: () => setFullKey(fullKeyOf(env.docId, path))
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function TableControl({ field, value, onChange, readOnly, path }) {
|
|
39
|
+
const env = useKitEnv();
|
|
40
|
+
const form = useForm();
|
|
41
|
+
const t = React.useMemo(() => isTableValue(value) ? normalizeTable(value) : null, [value]);
|
|
42
|
+
const fallback = React.useMemo(() => isTableValue(field.initialValue) ? normalizeTable(field.initialValue) : emptyTable(), [field.initialValue]);
|
|
43
|
+
const key = fullKeyOf(env.docId, path);
|
|
44
|
+
const full = useFullOpen(key);
|
|
45
|
+
React.useEffect(() => () => void (fullKey === key && setFullKey(null)), [key]);
|
|
46
|
+
const host = React.useRef(null);
|
|
47
|
+
const nav = React.useMemo(() => form?.canNavigate ? {
|
|
48
|
+
id: key,
|
|
49
|
+
basePath: path,
|
|
50
|
+
open: (kind, i) => form.navigate([
|
|
51
|
+
...path,
|
|
52
|
+
kind,
|
|
53
|
+
i
|
|
54
|
+
])
|
|
55
|
+
} : void 0, [
|
|
56
|
+
form,
|
|
57
|
+
key,
|
|
58
|
+
path
|
|
59
|
+
]);
|
|
60
|
+
return /* @__PURE__ */ jsx("div", {
|
|
61
|
+
ref: host,
|
|
62
|
+
className: "min-w-0",
|
|
63
|
+
"data-kit-control": "table",
|
|
64
|
+
children: /* @__PURE__ */ jsx(TableEditor, {
|
|
65
|
+
value: t ?? fallback,
|
|
66
|
+
onChange: (next) => onChange(storedTable(next, value)),
|
|
67
|
+
readOnly,
|
|
68
|
+
options: field.table ?? GENERAL_TABLE,
|
|
69
|
+
developer: env.can("schema.manage"),
|
|
70
|
+
label: field.title,
|
|
71
|
+
parentTitle: env.docTitle,
|
|
72
|
+
nav,
|
|
73
|
+
fullScreen: {
|
|
74
|
+
open: full,
|
|
75
|
+
onOpenChange: (o) => setFullKey(o ? key : null),
|
|
76
|
+
returnFocus: () => host.current?.closest("[data-field-key]")?.querySelector("button[aria-label=\"Edit in full screen\"]") ?? null
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** The body of a drilled table row or column frame (FrameView draws the standard header above it): FrameSlots.TableFrame. */
|
|
82
|
+
function TableFrame({ frame }) {
|
|
83
|
+
const form = useForm();
|
|
84
|
+
const env = useKitEnv();
|
|
85
|
+
const it = frame.item;
|
|
86
|
+
const field = frame.field;
|
|
87
|
+
const tablePath = it.arrayPath.slice(0, -1);
|
|
88
|
+
const raw = form.getAt(tablePath);
|
|
89
|
+
const readOnly = resolveFieldAccess(field, env).readOnly;
|
|
90
|
+
return /* @__PURE__ */ jsx(TableItemEditor, {
|
|
91
|
+
kind: frame.kind === "tableRow" ? "row" : "column",
|
|
92
|
+
index: it.index,
|
|
93
|
+
value: normalizeTable(raw),
|
|
94
|
+
onChange: (next) => form.setAt(tablePath, storedTable(next, raw)),
|
|
95
|
+
options: field.table ?? GENERAL_TABLE,
|
|
96
|
+
developer: env.can("schema.manage"),
|
|
97
|
+
readOnly
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
export { TableControl, TableFrame, TableFullScreenAction };
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","names":[],"sources":["../../../src/controls/table/table.tsx"],"sourcesContent":["/**\n * TABLE control (CPO D42, D50, D52; port of V2 kit/controls/table.tsx): the `table` field type (a content-model `table`\n * field, or a component `table` prop with `config.mode: \"data\"`) edits like any nested array, with no container of its\n * own: Title, Columns, Rows (groups live in the row list), Note under the table, and a collapsed Table settings that\n * offers only what `field.table.settings` allows (no `table` options = a general table, everything offered). A row or a\n * column drills through the form's own navigation (TableFrame), so the breadcrumb and frame header are the ones every\n * FAQ or feature item uses. The ⤢ button in the field's label row (TableFullScreenAction) opens the spreadsheet in the\n * expanded-editor modal (D49).\n *\n * Value: `TableValue` (schema/table.ts), written in the exact shape the backend stores (stored.ts): keys the editor\n * fills in for itself are never written back unless the person changed them.\n */\nimport * as React from \"react\";\nimport { resolveFieldAccess, useForm, useKitEnv } from \"../../context\";\nimport type { Frame } from \"../../lib/frames\";\nimport { pathKey } from \"../../lib/path\";\nimport type { FieldPath } from \"../../schema/types\";\nimport { GENERAL_TABLE, emptyTable, isTableValue, normalizeTable, type TableValue } from \"../../schema/table\";\nimport type { ControlProps } from \"../../types\";\nimport { TableEditor, TableFullScreenButton, TableItemEditor } from \"./table-editor\";\nimport { storedTable } from \"./stored\";\n\n/* Which table field has its spreadsheet open (the label-row button and the control share it). */\nlet fullKey: string | null = null;\nconst subs = new Set<() => void>();\nconst setFullKey = (k: string | null) => {\n fullKey = k;\n subs.forEach((f) => f());\n};\nconst subscribe = (f: () => void) => (subs.add(f), () => void subs.delete(f));\nconst useFullOpen = (k: string) => React.useSyncExternalStore(subscribe, () => fullKey === k, () => false);\nconst fullKeyOf = (docId: string, path: FieldPath) => `${docId}:${pathKey(path)}`;\n\n/** Label-row action of a table field (KitField ACTIONS.table): the one way into the full-screen spreadsheet (D49). */\nexport function TableFullScreenAction({ path }: Pick<ControlProps, \"path\">) {\n const env = useKitEnv();\n return <TableFullScreenButton className=\"-my-1\" onOpen={() => setFullKey(fullKeyOf(env.docId, path))} />;\n}\n\nexport function TableControl({ field, value, onChange, readOnly, path }: ControlProps) {\n const env = useKitEnv();\n const form = useForm();\n const t = React.useMemo(() => (isTableValue(value) ? normalizeTable(value) : null), [value]);\n // no value yet: the field's default table, else an empty 3 × 2 one (nothing is written until the person edits it)\n const fallback = React.useMemo(() => (isTableValue(field.initialValue) ? normalizeTable(field.initialValue) : emptyTable()), [field.initialValue]);\n const key = fullKeyOf(env.docId, path);\n const full = useFullOpen(key);\n // the spreadsheet belongs to this mount: a dock closed with it open must not reopen it on the next visit\n React.useEffect(() => () => void (fullKey === key && setFullKey(null)), [key]);\n const host = React.useRef<HTMLDivElement>(null);\n const nav = React.useMemo(\n () => (form?.canNavigate ? { id: key, basePath: path, open: (kind: \"rows\" | \"columns\", i: number) => form.navigate([...path, kind, i]) } : undefined),\n [form, key, path],\n );\n return (\n <div ref={host} className=\"min-w-0\" data-kit-control=\"table\">\n <TableEditor\n value={t ?? fallback}\n onChange={(next: TableValue) => onChange(storedTable(next, value))}\n readOnly={readOnly}\n options={field.table ?? GENERAL_TABLE}\n developer={env.can(\"schema.manage\")}\n label={field.title}\n parentTitle={env.docTitle}\n nav={nav}\n fullScreen={{\n open: full,\n onOpenChange: (o) => setFullKey(o ? key : null),\n returnFocus: () => host.current?.closest(\"[data-field-key]\")?.querySelector<HTMLElement>('button[aria-label=\"Edit in full screen\"]') ?? null,\n }}\n />\n </div>\n );\n}\n\n/** The body of a drilled table row or column frame (FrameView draws the standard header above it): FrameSlots.TableFrame. */\nexport function TableFrame({ frame }: { frame: Frame }) {\n const form = useForm()!;\n const env = useKitEnv();\n const it = frame.item!;\n const field = frame.field!;\n const tablePath = it.arrayPath.slice(0, -1);\n const raw = form.getAt(tablePath);\n const readOnly = resolveFieldAccess(field, env).readOnly;\n return (\n <TableItemEditor\n kind={frame.kind === \"tableRow\" ? \"row\" : \"column\"}\n index={it.index}\n value={normalizeTable(raw)}\n onChange={(next) => form.setAt(tablePath, storedTable(next, raw))}\n options={field.table ?? GENERAL_TABLE}\n developer={env.can(\"schema.manage\")}\n readOnly={readOnly}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,IAAI,UAAyB;AAC7B,IAAM,uBAAO,IAAI,IAAgB;AACjC,IAAM,cAAc,MAAqB;CACvC,UAAU;CACV,KAAK,SAAS,MAAM,EAAE,CAAC;AACzB;AACA,IAAM,aAAa,OAAmB,KAAK,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,CAAC;AAC3E,IAAM,eAAe,MAAc,MAAM,qBAAqB,iBAAiB,YAAY,SAAS,KAAK;AACzG,IAAM,aAAa,OAAe,SAAoB,GAAG,MAAM,GAAG,QAAQ,IAAI;;AAG9E,SAAgB,sBAAsB,EAAE,QAAoC;CAC1E,MAAM,MAAM,UAAU;CACtB,OAAO,oBAAC,uBAAD;EAAuB,WAAU;EAAQ,cAAc,WAAW,UAAU,IAAI,OAAO,IAAI,CAAC;CAAI,CAAA;AACzG;AAEA,SAAgB,aAAa,EAAE,OAAO,OAAO,UAAU,UAAU,QAAsB;CACrF,MAAM,MAAM,UAAU;CACtB,MAAM,OAAO,QAAQ;CACrB,MAAM,IAAI,MAAM,cAAe,aAAa,KAAK,IAAI,eAAe,KAAK,IAAI,MAAO,CAAC,KAAK,CAAC;CAE3F,MAAM,WAAW,MAAM,cAAe,aAAa,MAAM,YAAY,IAAI,eAAe,MAAM,YAAY,IAAI,WAAW,GAAI,CAAC,MAAM,YAAY,CAAC;CACjJ,MAAM,MAAM,UAAU,IAAI,OAAO,IAAI;CACrC,MAAM,OAAO,YAAY,GAAG;CAE5B,MAAM,sBAAsB,MAAM,YAAY,OAAO,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC;CAC7E,MAAM,OAAO,MAAM,OAAuB,IAAI;CAC9C,MAAM,MAAM,MAAM,cACT,MAAM,cAAc;EAAE,IAAI;EAAK,UAAU;EAAM,OAAO,MAA0B,MAAc,KAAK,SAAS;GAAC,GAAG;GAAM;GAAM;EAAC,CAAC;CAAE,IAAI,KAAA,GAC3I;EAAC;EAAM;EAAK;CAAI,CAClB;CACA,OACE,oBAAC,OAAD;EAAK,KAAK;EAAM,WAAU;EAAU,oBAAiB;EACnD,UAAA,oBAAC,aAAD;GACE,OAAO,KAAK;GACZ,WAAW,SAAqB,SAAS,YAAY,MAAM,KAAK,CAAC;GACvD;GACV,SAAS,MAAM,SAAS;GACxB,WAAW,IAAI,IAAI,eAAe;GAClC,OAAO,MAAM;GACb,aAAa,IAAI;GACZ;GACL,YAAY;IACV,MAAM;IACN,eAAe,MAAM,WAAW,IAAI,MAAM,IAAI;IAC9C,mBAAmB,KAAK,SAAS,QAAQ,kBAAkB,CAAC,EAAE,cAA2B,4CAA0C,KAAK;GAC1I;EACD,CAAA;CACE,CAAA;AAET;;AAGA,SAAgB,WAAW,EAAE,SAA2B;CACtD,MAAM,OAAO,QAAQ;CACrB,MAAM,MAAM,UAAU;CACtB,MAAM,KAAK,MAAM;CACjB,MAAM,QAAQ,MAAM;CACpB,MAAM,YAAY,GAAG,UAAU,MAAM,GAAG,EAAE;CAC1C,MAAM,MAAM,KAAK,MAAM,SAAS;CAChC,MAAM,WAAW,mBAAmB,OAAO,GAAG,CAAC,CAAC;CAChD,OACE,oBAAC,iBAAD;EACE,MAAM,MAAM,SAAS,aAAa,QAAQ;EAC1C,OAAO,GAAG;EACV,OAAO,eAAe,GAAG;EACzB,WAAW,SAAS,KAAK,MAAM,WAAW,YAAY,MAAM,GAAG,CAAC;EAChE,SAAS,MAAM,SAAS;EACxB,WAAW,IAAI,IAAI,eAAe;EACxB;CACX,CAAA;AAEL"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ControlProps } from "../types";
|
|
2
|
+
export declare const str: (v: unknown) => string;
|
|
3
|
+
/** border-only focus (no halo) for text entry */
|
|
4
|
+
export declare const TEXT_FOCUS = "focus:shadow-none focus-visible:shadow-none";
|
|
5
|
+
export declare function StringControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export declare function TextControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare function EmailControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function UrlControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
/** The text a slug follows: the first title-like sibling, else the document title. */
|
|
10
|
+
export declare function slugSource(parent: Record<string, unknown> | undefined, docTitle?: string): string;
|
|
11
|
+
/** What a keystroke may leave in a slug: lowercase letters, digits and hyphens (spaces become hyphens). */
|
|
12
|
+
export declare const slugTyping: (s: string) => string;
|
|
13
|
+
/** The stored slug: no leading, trailing or doubled hyphens (the backend's pattern). */
|
|
14
|
+
export declare const slugTidy: (s: string) => string;
|
|
15
|
+
/** Label-row "Generate" for slug fields (ACTIONS.slug; prod: ghost button in the label row). */
|
|
16
|
+
export declare function SlugGenerate({ parent, value, onChange, readOnly }: Pick<ControlProps, "parent" | "value" | "onChange" | "readOnly">): import("react/jsx-runtime").JSX.Element | null;
|
|
17
|
+
export declare function SlugControl({ value, onChange, readOnly, id, invalid, parent, path, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { useForm, useKitEnv, useKitServices } from "../context.js";
|
|
3
|
+
import { Button, IconButton } from "../ui/button.js";
|
|
4
|
+
import { Checkbox } from "../ui/controls.js";
|
|
5
|
+
import { Tooltip } from "../ui/overlay.js";
|
|
6
|
+
import { plainText } from "../lib/schema.js";
|
|
7
|
+
import { Input, Textarea } from "../ui/input.js";
|
|
8
|
+
import { slugify } from "../lib/utils.js";
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { IconAlertTriangle, IconExternalLink, IconMail, IconWorld } from "@tabler/icons-react";
|
|
12
|
+
//#region src/controls/text.tsx
|
|
13
|
+
/**
|
|
14
|
+
* TEXT — string · text · email · url · slug (V2 HEAD 9829bf1 kit/controls/text.tsx, DESIGN §8.2–8.3).
|
|
15
|
+
* Founder rule: text grows to show its whole value, never clipped. Text entry gets NO focus ring or halo — the border
|
|
16
|
+
* steps rest → hover → focus on the box only (prod CPO-069).
|
|
17
|
+
*
|
|
18
|
+
* Stored shapes (prod): string / longtext / email / slug / url (text + inputType "url") all store a plain string.
|
|
19
|
+
* Slug keeps the backend's `^[a-z0-9]+(?:-[a-z0-9]+)*$`: keystrokes are filtered, and the stray hyphens typing leaves
|
|
20
|
+
* (a trailing "-" before the next word) are tidied on blur.
|
|
21
|
+
*/
|
|
22
|
+
var str = (v) => typeof v === "string" ? v : v == null ? "" : String(v);
|
|
23
|
+
/** border-only focus (no halo) for text entry */
|
|
24
|
+
var TEXT_FOCUS = "focus:shadow-none focus-visible:shadow-none";
|
|
25
|
+
function StringControl({ field, value, onChange, readOnly, id, invalid, onBlur }) {
|
|
26
|
+
const { variant } = useKitEnv();
|
|
27
|
+
return /* @__PURE__ */ jsx(Textarea, {
|
|
28
|
+
id,
|
|
29
|
+
rows: 1,
|
|
30
|
+
value: str(value),
|
|
31
|
+
readOnly,
|
|
32
|
+
"aria-invalid": invalid,
|
|
33
|
+
placeholder: field.placeholder,
|
|
34
|
+
onBlur,
|
|
35
|
+
onKeyDown: (e) => e.key === "Enter" && e.preventDefault(),
|
|
36
|
+
onChange: (e) => onChange(e.target.value.replace(/\r?\n/g, " ")),
|
|
37
|
+
className: cn(TEXT_FOCUS, "min-h-8 py-1.5 leading-5", variant === "document" && "min-h-9 py-2")
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function TextControl({ field, value, onChange, readOnly, id, invalid, onBlur }) {
|
|
41
|
+
return /* @__PURE__ */ jsx(Textarea, {
|
|
42
|
+
id,
|
|
43
|
+
rows: field.rows ?? 3,
|
|
44
|
+
value: str(value),
|
|
45
|
+
readOnly,
|
|
46
|
+
"aria-invalid": invalid,
|
|
47
|
+
placeholder: field.placeholder,
|
|
48
|
+
onBlur,
|
|
49
|
+
onChange: (e) => onChange(e.target.value),
|
|
50
|
+
className: cn(TEXT_FOCUS, "leading-5")
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function EmailControl({ field, value, onChange, readOnly, id, invalid, onBlur }) {
|
|
54
|
+
const { variant } = useKitEnv();
|
|
55
|
+
return /* @__PURE__ */ jsx(Input, {
|
|
56
|
+
id,
|
|
57
|
+
size: variant === "document" ? "lg" : "md",
|
|
58
|
+
type: "email",
|
|
59
|
+
value: str(value),
|
|
60
|
+
readOnly,
|
|
61
|
+
"aria-invalid": invalid,
|
|
62
|
+
onBlur,
|
|
63
|
+
placeholder: field.placeholder ?? "name@company.com",
|
|
64
|
+
leading: /* @__PURE__ */ jsx(IconMail, { stroke: 1.5 }),
|
|
65
|
+
onChange: (e) => onChange(e.target.value.trim()),
|
|
66
|
+
className: TEXT_FOCUS
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function UrlControl({ field, value, onChange, readOnly, id, invalid, onBlur }) {
|
|
70
|
+
const v = str(value);
|
|
71
|
+
const { variant } = useKitEnv();
|
|
72
|
+
const open = /^https?:\/\/\S+/.test(v);
|
|
73
|
+
return /* @__PURE__ */ jsx(Input, {
|
|
74
|
+
id,
|
|
75
|
+
size: variant === "document" ? "lg" : "md",
|
|
76
|
+
value: v,
|
|
77
|
+
readOnly,
|
|
78
|
+
"aria-invalid": invalid,
|
|
79
|
+
onBlur,
|
|
80
|
+
placeholder: field.placeholder ?? "https://example.com",
|
|
81
|
+
onChange: (e) => onChange(e.target.value.trim()),
|
|
82
|
+
leading: /* @__PURE__ */ jsx(IconWorld, { stroke: 1.5 }),
|
|
83
|
+
className: cn(TEXT_FOCUS, "[&_input]:text-kit-accent-fg"),
|
|
84
|
+
trailing: open ? /* @__PURE__ */ jsx(Tooltip, {
|
|
85
|
+
content: "Open link in a new tab",
|
|
86
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
87
|
+
type: "button",
|
|
88
|
+
"aria-label": "Open link",
|
|
89
|
+
className: "pointer-events-auto flex rounded-kit-md p-0.5 hover:bg-kit-selected hover:text-kit-fg",
|
|
90
|
+
onClick: () => window.open(v, "_blank", "noopener"),
|
|
91
|
+
children: /* @__PURE__ */ jsx(IconExternalLink, {
|
|
92
|
+
className: "size-4",
|
|
93
|
+
stroke: 1.5
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
}) : void 0
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
var TITLE_KEYS = [
|
|
100
|
+
"title",
|
|
101
|
+
"name",
|
|
102
|
+
"heading",
|
|
103
|
+
"question",
|
|
104
|
+
"label"
|
|
105
|
+
];
|
|
106
|
+
/** The text a slug follows: the first title-like sibling, else the document title. */
|
|
107
|
+
function slugSource(parent, docTitle) {
|
|
108
|
+
for (const k of TITLE_KEYS) {
|
|
109
|
+
const t = plainText(parent?.[k]);
|
|
110
|
+
if (t) return t;
|
|
111
|
+
}
|
|
112
|
+
return docTitle ?? "";
|
|
113
|
+
}
|
|
114
|
+
/** What a keystroke may leave in a slug: lowercase letters, digits and hyphens (spaces become hyphens). */
|
|
115
|
+
var slugTyping = (s) => s.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "");
|
|
116
|
+
/** The stored slug: no leading, trailing or doubled hyphens (the backend's pattern). */
|
|
117
|
+
var slugTidy = (s) => slugTyping(s).replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
118
|
+
/** Label-row "Generate" for slug fields (ACTIONS.slug; prod: ghost button in the label row). */
|
|
119
|
+
function SlugGenerate({ parent, value, onChange, readOnly }) {
|
|
120
|
+
const { docTitle } = useKitEnv();
|
|
121
|
+
const src = slugSource(parent, docTitle);
|
|
122
|
+
if (readOnly || !src) return null;
|
|
123
|
+
const next = slugify(src);
|
|
124
|
+
if (!next) return null;
|
|
125
|
+
return /* @__PURE__ */ jsx(Tooltip, {
|
|
126
|
+
content: `Generate from “${src.length > 32 ? `${src.slice(0, 30)}…` : src}”`,
|
|
127
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
128
|
+
size: "xs",
|
|
129
|
+
variant: "ghost",
|
|
130
|
+
className: "h-5 px-1.5 text-kit-xs text-kit-fg-2",
|
|
131
|
+
disabled: next === value,
|
|
132
|
+
onClick: () => onChange(next),
|
|
133
|
+
children: "Generate"
|
|
134
|
+
})
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function SlugControl({ value, onChange, readOnly, id, invalid, parent, path, onBlur }) {
|
|
138
|
+
const v = str(value);
|
|
139
|
+
const env = useKitEnv();
|
|
140
|
+
const form = useForm();
|
|
141
|
+
const { toast, redirectSlug, saveSlug } = useKitServices();
|
|
142
|
+
const src = slugSource(parent, env.docTitle);
|
|
143
|
+
const following = React.useRef(!env.isPublished && (v === "" || v === slugify(src)));
|
|
144
|
+
const seenSrc = React.useRef(src);
|
|
145
|
+
React.useEffect(() => {
|
|
146
|
+
if (seenSrc.current === src) return;
|
|
147
|
+
seenSrc.current = src;
|
|
148
|
+
if (!following.current || readOnly) return;
|
|
149
|
+
const next = slugify(src);
|
|
150
|
+
if (next && next !== v) onChange(next);
|
|
151
|
+
}, [src]);
|
|
152
|
+
const live = !env.slugIsAddress ? "" : form?.hasPublished ? str(form.publishedAt(path)) : env.isPublished ? str(form?.baselineAt(path) ?? "") : "";
|
|
153
|
+
const [saving, setSaving] = React.useState(false);
|
|
154
|
+
const [redirect, setRedirect] = React.useState(true);
|
|
155
|
+
const [confirmed, setConfirmed] = React.useState(null);
|
|
156
|
+
const changedLive = !!live && live !== v && confirmed !== v;
|
|
157
|
+
const host = env.urlPrefix?.replace(/^https?:\/\//, "");
|
|
158
|
+
const url = host ? `https://${host}${v}` : "";
|
|
159
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
160
|
+
className: "flex flex-col gap-1.5",
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ jsx(Input, {
|
|
163
|
+
id,
|
|
164
|
+
value: v,
|
|
165
|
+
readOnly,
|
|
166
|
+
"aria-invalid": invalid,
|
|
167
|
+
placeholder: "empty-is-the-home-page",
|
|
168
|
+
className: cn(TEXT_FOCUS, "font-kit-mono [&_input]:font-kit-mono"),
|
|
169
|
+
onChange: (e) => {
|
|
170
|
+
following.current = false;
|
|
171
|
+
onChange(slugTyping(e.target.value));
|
|
172
|
+
},
|
|
173
|
+
onBlur: () => {
|
|
174
|
+
const tidy = slugTidy(v);
|
|
175
|
+
if (tidy !== v) onChange(tidy);
|
|
176
|
+
onBlur?.();
|
|
177
|
+
}
|
|
178
|
+
}),
|
|
179
|
+
changedLive ? /* @__PURE__ */ jsxs("div", {
|
|
180
|
+
className: "flex flex-col gap-2 rounded-kit-md border border-kit-warning-line bg-kit-warning-soft px-3 py-2.5 text-kit-sm",
|
|
181
|
+
children: [
|
|
182
|
+
/* @__PURE__ */ jsxs("p", {
|
|
183
|
+
className: "flex items-start gap-1.5 text-kit-warning-fg",
|
|
184
|
+
children: [/* @__PURE__ */ jsx(IconAlertTriangle, {
|
|
185
|
+
className: "mt-0.5 size-4 shrink-0",
|
|
186
|
+
stroke: 1.5
|
|
187
|
+
}), /* @__PURE__ */ jsxs("span", { children: [
|
|
188
|
+
"The old address ",
|
|
189
|
+
/* @__PURE__ */ jsxs("span", {
|
|
190
|
+
className: "font-kit-mono",
|
|
191
|
+
children: ["/", live]
|
|
192
|
+
}),
|
|
193
|
+
" will stop working."
|
|
194
|
+
] })]
|
|
195
|
+
}),
|
|
196
|
+
redirectSlug ? /* @__PURE__ */ jsxs("label", {
|
|
197
|
+
className: "flex items-center gap-2 text-kit-fg-2",
|
|
198
|
+
children: [/* @__PURE__ */ jsx(Checkbox, {
|
|
199
|
+
checked: redirect,
|
|
200
|
+
onCheckedChange: (c) => setRedirect(c === true),
|
|
201
|
+
nativeButton: true,
|
|
202
|
+
render: /* @__PURE__ */ jsx("button", { type: "button" })
|
|
203
|
+
}), "Redirect it to the new address"]
|
|
204
|
+
}) : null,
|
|
205
|
+
/* @__PURE__ */ jsxs("div", {
|
|
206
|
+
className: "flex gap-1.5",
|
|
207
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
208
|
+
size: "xs",
|
|
209
|
+
variant: "primary",
|
|
210
|
+
disabled: saving,
|
|
211
|
+
onClick: async () => {
|
|
212
|
+
const from = live;
|
|
213
|
+
const to = v;
|
|
214
|
+
const redirected = redirect && !!redirectSlug;
|
|
215
|
+
setSaving(true);
|
|
216
|
+
try {
|
|
217
|
+
if (saveSlug) await saveSlug(to);
|
|
218
|
+
} catch (err) {
|
|
219
|
+
setSaving(false);
|
|
220
|
+
toast?.("Couldn't save the new address", { description: errorText(err) });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
setSaving(false);
|
|
224
|
+
setConfirmed(to);
|
|
225
|
+
if (redirected) try {
|
|
226
|
+
await redirectSlug(from, to);
|
|
227
|
+
} catch (err) {
|
|
228
|
+
toast?.("New address saved. The redirect wasn't created", { description: errorText(err) });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
toast?.success("New address saved", { description: redirected ? `/${from} now redirects to /${to}` : `/${from} will return “Not found”` });
|
|
232
|
+
},
|
|
233
|
+
children: "Save new address"
|
|
234
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
235
|
+
size: "xs",
|
|
236
|
+
variant: "ghost",
|
|
237
|
+
onClick: () => {
|
|
238
|
+
following.current = false;
|
|
239
|
+
onChange(live);
|
|
240
|
+
},
|
|
241
|
+
children: "Keep the old slug"
|
|
242
|
+
})]
|
|
243
|
+
})
|
|
244
|
+
]
|
|
245
|
+
}) : null,
|
|
246
|
+
url && host ? /* @__PURE__ */ jsx(AddressLine, {
|
|
247
|
+
url,
|
|
248
|
+
domain: host.replace(/\/.*$/, ""),
|
|
249
|
+
status: env.isPublished === void 0 ? void 0 : env.isPublished ? {
|
|
250
|
+
live: true,
|
|
251
|
+
label: "Live"
|
|
252
|
+
} : {
|
|
253
|
+
live: false,
|
|
254
|
+
label: "Not live yet"
|
|
255
|
+
},
|
|
256
|
+
onCopy: () => {
|
|
257
|
+
navigator.clipboard?.writeText(url).then(() => toast?.success("Address copied", { description: url }), () => toast?.("Couldn't copy the address", { description: "The browser blocked clipboard access." }));
|
|
258
|
+
},
|
|
259
|
+
children: env.isPublished ? /* @__PURE__ */ jsx(IconButton, {
|
|
260
|
+
size: "xs",
|
|
261
|
+
label: "Open live",
|
|
262
|
+
onClick: () => window.open(url, "_blank", "noopener"),
|
|
263
|
+
children: /* @__PURE__ */ jsx(IconExternalLink, { stroke: 1.5 })
|
|
264
|
+
}) : null
|
|
265
|
+
}) : null
|
|
266
|
+
]
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
/** A host's refusal as one line (an Error's message, else the value itself). */
|
|
270
|
+
var errorText = (err) => err instanceof Error ? err.message : String(err);
|
|
271
|
+
function splitTail(display) {
|
|
272
|
+
const cut = display.indexOf("/") >= 0 ? display.lastIndexOf("/") : -1;
|
|
273
|
+
let tail = cut > 0 ? display.slice(cut) : "";
|
|
274
|
+
if (tail.length > 18) tail = tail.slice(-14);
|
|
275
|
+
return [display.slice(0, display.length - tail.length), tail];
|
|
276
|
+
}
|
|
277
|
+
function AddressLine({ url, domain, status, onCopy, children }) {
|
|
278
|
+
const display = url.replace(/^https?:\/\//, "");
|
|
279
|
+
const [head, tail] = splitTail(display);
|
|
280
|
+
const domainPart = head.startsWith(domain) ? domain : "";
|
|
281
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
282
|
+
className: "flex h-6 min-w-0 items-center gap-2",
|
|
283
|
+
children: [/* @__PURE__ */ jsx(Tooltip, {
|
|
284
|
+
content: /* @__PURE__ */ jsx("span", {
|
|
285
|
+
className: "font-kit-mono",
|
|
286
|
+
children: display
|
|
287
|
+
}),
|
|
288
|
+
children: /* @__PURE__ */ jsxs("button", {
|
|
289
|
+
type: "button",
|
|
290
|
+
onClick: onCopy,
|
|
291
|
+
"aria-label": `Copy address ${url}`,
|
|
292
|
+
className: "-ml-1 flex h-6 min-w-0 items-center rounded-kit-md px-1 font-kit-mono text-kit-xs text-kit-fg-2 transition-colors hover:bg-kit-hover hover:text-kit-fg",
|
|
293
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
294
|
+
className: "min-w-0 truncate",
|
|
295
|
+
children: [domainPart ? /* @__PURE__ */ jsx("span", {
|
|
296
|
+
className: "text-kit-fg-3",
|
|
297
|
+
children: domainPart
|
|
298
|
+
}) : null, head.slice(domainPart.length)]
|
|
299
|
+
}), tail ? /* @__PURE__ */ jsx("span", {
|
|
300
|
+
className: "shrink-0 whitespace-pre",
|
|
301
|
+
children: tail
|
|
302
|
+
}) : null]
|
|
303
|
+
})
|
|
304
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
305
|
+
className: "ml-auto flex shrink-0 items-center gap-1.5",
|
|
306
|
+
children: [status ? /* @__PURE__ */ jsxs("span", {
|
|
307
|
+
className: "mr-0.5 inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-kit-xs text-kit-fg-2",
|
|
308
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
309
|
+
"aria-hidden": true,
|
|
310
|
+
className: cn("size-1.5 shrink-0 rounded-full", status.live ? "bg-kit-success" : "bg-kit-fg-4")
|
|
311
|
+
}), status.label]
|
|
312
|
+
}) : null, children ? /* @__PURE__ */ jsx("span", {
|
|
313
|
+
className: "flex items-center gap-0.5",
|
|
314
|
+
children
|
|
315
|
+
}) : null]
|
|
316
|
+
})]
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
//#endregion
|
|
320
|
+
export { EmailControl, SlugControl, SlugGenerate, StringControl, TEXT_FOCUS, TextControl, UrlControl, slugSource, slugTidy, slugTyping, str };
|
|
321
|
+
|
|
322
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","names":[],"sources":["../../src/controls/text.tsx"],"sourcesContent":["/**\n * TEXT — string · text · email · url · slug (V2 HEAD 9829bf1 kit/controls/text.tsx, DESIGN §8.2–8.3).\n * Founder rule: text grows to show its whole value, never clipped. Text entry gets NO focus ring or halo — the border\n * steps rest → hover → focus on the box only (prod CPO-069).\n *\n * Stored shapes (prod): string / longtext / email / slug / url (text + inputType \"url\") all store a plain string.\n * Slug keeps the backend's `^[a-z0-9]+(?:-[a-z0-9]+)*$`: keystrokes are filtered, and the stray hyphens typing leaves\n * (a trailing \"-\" before the next word) are tidied on blur.\n */\nimport * as React from \"react\";\nimport { IconAlertTriangle, IconExternalLink, IconMail, IconWorld } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { slugify } from \"../lib/utils\";\nimport { plainText } from \"../lib/schema\";\nimport { useForm, useKitEnv, useKitServices } from \"../context\";\nimport { Button, IconButton } from \"../ui/button\";\nimport { Input, Textarea } from \"../ui/input\";\nimport { Tooltip } from \"../ui/overlay\";\nimport { Checkbox } from \"../ui/controls\";\nimport type { ControlProps } from \"../types\";\n\nexport const str = (v: unknown) => (typeof v === \"string\" ? v : v == null ? \"\" : String(v));\n/** border-only focus (no halo) for text entry */\nexport const TEXT_FOCUS = \"focus:shadow-none focus-visible:shadow-none\";\n\nexport function StringControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps) {\n const { variant } = useKitEnv();\n return (\n <Textarea\n id={id}\n rows={1}\n value={str(value)}\n readOnly={readOnly}\n aria-invalid={invalid}\n placeholder={field.placeholder}\n onBlur={onBlur}\n onKeyDown={(e) => e.key === \"Enter\" && e.preventDefault()}\n onChange={(e) => onChange(e.target.value.replace(/\\r?\\n/g, \" \"))}\n className={cn(TEXT_FOCUS, \"min-h-8 py-1.5 leading-5\", variant === \"document\" && \"min-h-9 py-2\")}\n />\n );\n}\n\nexport function TextControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps) {\n return (\n <Textarea\n id={id}\n rows={field.rows ?? 3}\n value={str(value)}\n readOnly={readOnly}\n aria-invalid={invalid}\n placeholder={field.placeholder}\n onBlur={onBlur}\n onChange={(e) => onChange(e.target.value)}\n className={cn(TEXT_FOCUS, \"leading-5\")}\n />\n );\n}\n\nexport function EmailControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps) {\n const { variant } = useKitEnv();\n return (\n <Input\n id={id}\n size={variant === \"document\" ? \"lg\" : \"md\"}\n type=\"email\"\n value={str(value)}\n readOnly={readOnly}\n aria-invalid={invalid}\n onBlur={onBlur}\n placeholder={field.placeholder ?? \"name@company.com\"}\n leading={<IconMail stroke={1.5} />}\n onChange={(e) => onChange(e.target.value.trim())}\n className={TEXT_FOCUS}\n />\n );\n}\n\nexport function UrlControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps) {\n const v = str(value);\n const { variant } = useKitEnv();\n const open = /^https?:\\/\\/\\S+/.test(v);\n return (\n <Input\n id={id}\n size={variant === \"document\" ? \"lg\" : \"md\"}\n value={v}\n readOnly={readOnly}\n aria-invalid={invalid}\n onBlur={onBlur}\n placeholder={field.placeholder ?? \"https://example.com\"}\n onChange={(e) => onChange(e.target.value.trim())}\n leading={<IconWorld stroke={1.5} />}\n className={cn(TEXT_FOCUS, \"[&_input]:text-kit-accent-fg\")}\n trailing={\n open ? (\n <Tooltip content=\"Open link in a new tab\">\n <button\n type=\"button\"\n aria-label=\"Open link\"\n className=\"pointer-events-auto flex rounded-kit-md p-0.5 hover:bg-kit-selected hover:text-kit-fg\"\n onClick={() => window.open(v, \"_blank\", \"noopener\")}\n >\n <IconExternalLink className=\"size-4\" stroke={1.5} />\n </button>\n </Tooltip>\n ) : undefined\n }\n />\n );\n}\n\n/* ── Slug ──────────────────────────────────────────────────────────── */\nconst TITLE_KEYS = [\"title\", \"name\", \"heading\", \"question\", \"label\"];\n/** The text a slug follows: the first title-like sibling, else the document title. */\nexport function slugSource(parent: Record<string, unknown> | undefined, docTitle?: string) {\n for (const k of TITLE_KEYS) {\n const t = plainText(parent?.[k]);\n if (t) return t;\n }\n return docTitle ?? \"\";\n}\n/** What a keystroke may leave in a slug: lowercase letters, digits and hyphens (spaces become hyphens). */\nexport const slugTyping = (s: string) => s.toLowerCase().replace(/\\s+/g, \"-\").replace(/[^a-z0-9-]/g, \"\");\n/** The stored slug: no leading, trailing or doubled hyphens (the backend's pattern). */\nexport const slugTidy = (s: string) => slugTyping(s).replace(/-+/g, \"-\").replace(/^-|-$/g, \"\");\n\n/** Label-row \"Generate\" for slug fields (ACTIONS.slug; prod: ghost button in the label row). */\nexport function SlugGenerate({ parent, value, onChange, readOnly }: Pick<ControlProps, \"parent\" | \"value\" | \"onChange\" | \"readOnly\">) {\n const { docTitle } = useKitEnv();\n const src = slugSource(parent, docTitle);\n if (readOnly || !src) return null;\n const next = slugify(src);\n if (!next) return null;\n return (\n <Tooltip content={`Generate from “${src.length > 32 ? `${src.slice(0, 30)}…` : src}”`}>\n <Button size=\"xs\" variant=\"ghost\" className=\"h-5 px-1.5 text-kit-xs text-kit-fg-2\" disabled={next === value} onClick={() => onChange(next)}>\n Generate\n </Button>\n </Tooltip>\n );\n}\n\nexport function SlugControl({ value, onChange, readOnly, id, invalid, parent, path, onBlur }: ControlProps) {\n const v = str(value);\n const env = useKitEnv();\n const form = useForm();\n const { toast, redirectSlug, saveSlug } = useKitServices();\n const src = slugSource(parent, env.docTitle);\n /* Follows the title until someone edits it or the document is published (CPO-087), V2's rule (`!env.isPublished`):\n a host that passes no isPublished (the dock) follows too, as the help line says. It reacts to a title edit, never\n to mounting, so opening a form writes nothing. */\n const following = React.useRef(!env.isPublished && (v === \"\" || v === slugify(src)));\n const seenSrc = React.useRef(src);\n React.useEffect(() => {\n if (seenSrc.current === src) return;\n seenSrc.current = src;\n if (!following.current || readOnly) return;\n const next = slugify(src);\n if (next && next !== v) onChange(next);\n }, [src]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /* the address the site serves today: the published value, else (published doc, no published copy) the mount value.\n Only where the host says the slug IS the address: a slug prop or a key has no address to break. */\n const live = !env.slugIsAddress ? \"\" : form?.hasPublished ? str(form.publishedAt(path)) : env.isPublished ? str(form?.baselineAt(path) ?? \"\") : \"\";\n const [saving, setSaving] = React.useState(false);\n const [redirect, setRedirect] = React.useState(true);\n const [confirmed, setConfirmed] = React.useState<string | null>(null);\n const changedLive = !!live && live !== v && confirmed !== v;\n const host = env.urlPrefix?.replace(/^https?:\\/\\//, \"\");\n const url = host ? `https://${host}${v}` : \"\";\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Input\n id={id}\n value={v}\n readOnly={readOnly}\n aria-invalid={invalid}\n placeholder=\"empty-is-the-home-page\"\n className={cn(TEXT_FOCUS, \"font-kit-mono [&_input]:font-kit-mono\")}\n onChange={(e) => {\n following.current = false;\n onChange(slugTyping(e.target.value));\n }}\n onBlur={() => {\n const tidy = slugTidy(v);\n if (tidy !== v) onChange(tidy);\n onBlur?.();\n }}\n />\n {changedLive ? (\n <div className=\"flex flex-col gap-2 rounded-kit-md border border-kit-warning-line bg-kit-warning-soft px-3 py-2.5 text-kit-sm\">\n <p className=\"flex items-start gap-1.5 text-kit-warning-fg\">\n <IconAlertTriangle className=\"mt-0.5 size-4 shrink-0\" stroke={1.5} />\n <span>\n The old address <span className=\"font-kit-mono\">/{live}</span> will stop working.\n </span>\n </p>\n {/* only where the host files the redirect: the box must not promise one nothing creates */}\n {redirectSlug ? (\n <label className=\"flex items-center gap-2 text-kit-fg-2\">\n <Checkbox checked={redirect} onCheckedChange={(c) => setRedirect(c === true)} nativeButton render={<button type=\"button\" />} />\n Redirect it to the new address\n </label>\n ) : null}\n <div className=\"flex gap-1.5\">\n <Button\n size=\"xs\"\n variant=\"primary\"\n disabled={saving}\n onClick={async () => {\n const from = live;\n const to = v;\n const redirected = redirect && !!redirectSlug;\n setSaving(true);\n try {\n if (saveSlug) await saveSlug(to);\n } catch (err) {\n setSaving(false);\n toast?.(\"Couldn't save the new address\", { description: errorText(err) });\n return;\n }\n setSaving(false);\n setConfirmed(to);\n if (redirected) {\n try {\n await redirectSlug(from, to);\n } catch (err) {\n toast?.(\"New address saved. The redirect wasn't created\", { description: errorText(err) });\n return;\n }\n }\n toast?.success(\"New address saved\", { description: redirected ? `/${from} now redirects to /${to}` : `/${from} will return “Not found”` });\n }}\n >\n Save new address\n </Button>\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => {\n following.current = false;\n onChange(live);\n }}\n >\n Keep the old slug\n </Button>\n </div>\n </div>\n ) : null}\n {url && host ? (\n <AddressLine\n url={url}\n domain={host.replace(/\\/.*$/, \"\")}\n status={env.isPublished === undefined ? undefined : env.isPublished ? { live: true, label: \"Live\" } : { live: false, label: \"Not live yet\" }}\n onCopy={() => {\n void navigator.clipboard?.writeText(url).then(\n () => toast?.success(\"Address copied\", { description: url }),\n () => toast?.(\"Couldn't copy the address\", { description: \"The browser blocked clipboard access.\" }),\n );\n }}\n >\n {env.isPublished ? (\n <IconButton size=\"xs\" label=\"Open live\" onClick={() => window.open(url, \"_blank\", \"noopener\")}>\n <IconExternalLink stroke={1.5} />\n </IconButton>\n ) : null}\n </AddressLine>\n ) : null}\n </div>\n );\n}\n\n/** A host's refusal as one line (an Error's message, else the value itself). */\nconst errorText = (err: unknown) => (err instanceof Error ? err.message : String(err));\n\n/* V2 features/hosting/address-line.tsx (D66): one calm line under the slug — the mono URL (middle-truncated so the slug\n end stays; full URL in the tooltip; copies on click) · the live state as a dot and a word · trailing icon buttons. */\nfunction splitTail(display: string): [string, string] {\n const cut = display.indexOf(\"/\") >= 0 ? display.lastIndexOf(\"/\") : -1;\n let tail = cut > 0 ? display.slice(cut) : \"\";\n if (tail.length > 18) tail = tail.slice(-14);\n return [display.slice(0, display.length - tail.length), tail];\n}\n\nfunction AddressLine({ url, domain, status, onCopy, children }: { url: string; domain: string; status?: { live: boolean; label: string }; onCopy: () => void; children?: React.ReactNode }) {\n const display = url.replace(/^https?:\\/\\//, \"\");\n const [head, tail] = splitTail(display);\n const domainPart = head.startsWith(domain) ? domain : \"\";\n return (\n <div className=\"flex h-6 min-w-0 items-center gap-2\">\n <Tooltip content={<span className=\"font-kit-mono\">{display}</span>}>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={`Copy address ${url}`}\n className=\"-ml-1 flex h-6 min-w-0 items-center rounded-kit-md px-1 font-kit-mono text-kit-xs text-kit-fg-2 transition-colors hover:bg-kit-hover hover:text-kit-fg\"\n >\n <span className=\"min-w-0 truncate\">\n {domainPart ? <span className=\"text-kit-fg-3\">{domainPart}</span> : null}\n {head.slice(domainPart.length)}\n </span>\n {tail ? <span className=\"shrink-0 whitespace-pre\">{tail}</span> : null}\n </button>\n </Tooltip>\n <span className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {status ? (\n <span className=\"mr-0.5 inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-kit-xs text-kit-fg-2\">\n <span aria-hidden className={cn(\"size-1.5 shrink-0 rounded-full\", status.live ? \"bg-kit-success\" : \"bg-kit-fg-4\")} />\n {status.label}\n </span>\n ) : null}\n {children ? <span className=\"flex items-center gap-0.5\">{children}</span> : null}\n </span>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface UnknownValue {
|
|
2
|
+
/** what identifies the value to `onRemap` / `onRemove` */
|
|
3
|
+
key: string;
|
|
4
|
+
/** what the dock says: the stored value as stored, or its kind and name ("Heading 2 style “h2”") */
|
|
5
|
+
label: string;
|
|
6
|
+
/** the declared values it may be changed to; empty = remove only */
|
|
7
|
+
options: {
|
|
8
|
+
value: string;
|
|
9
|
+
label: string;
|
|
10
|
+
}[];
|
|
11
|
+
}
|
|
12
|
+
export declare function UnknownValueNote({ items, onRemap, onRemove, readOnly, }: {
|
|
13
|
+
items: readonly UnknownValue[];
|
|
14
|
+
onRemap: (key: string, to: string) => void;
|
|
15
|
+
onRemove: (key: string) => void;
|
|
16
|
+
readOnly?: boolean;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Button } from "../ui/button.js";
|
|
2
|
+
import { Menu, MenuContent, MenuItem, MenuLabel, MenuSeparator, MenuTrigger } from "../ui/overlay.js";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { IconAlertTriangle, IconChevronDown } from "@tabler/icons-react";
|
|
5
|
+
//#region src/controls/unknown-value.tsx
|
|
6
|
+
/**
|
|
7
|
+
* UNKNOWN VALUE — a stored value the field's schema no longer declares (H4).
|
|
8
|
+
*
|
|
9
|
+
* A select option that was renamed or removed, a rich-text style or mark the field's Accept list no longer names: the
|
|
10
|
+
* value is KEPT, by the control and by every save, and said here, with the two ways out a person can take on purpose:
|
|
11
|
+
* change it to a value the field does declare, or remove it. Nothing changes until they pick one. (Sanity empties the
|
|
12
|
+
* select and strips the mark; we never drop a value in silence.)
|
|
13
|
+
*/
|
|
14
|
+
function UnknownValueNote({ items, onRemap, onRemove, readOnly }) {
|
|
15
|
+
if (items.length === 0) return null;
|
|
16
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
17
|
+
"data-slot": "kit-unknown-values",
|
|
18
|
+
role: "status",
|
|
19
|
+
className: "flex flex-col gap-1",
|
|
20
|
+
children: items.map((item) => /* @__PURE__ */ jsxs("li", {
|
|
21
|
+
className: "flex min-h-8 min-w-0 items-center gap-2 rounded-kit-md bg-kit-warning-soft py-1 pl-2.5 pr-1 text-kit-xs text-kit-warning-fg",
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsx(IconAlertTriangle, {
|
|
24
|
+
"aria-hidden": true,
|
|
25
|
+
className: "size-3.5 shrink-0",
|
|
26
|
+
stroke: 1.5
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ jsxs("span", {
|
|
29
|
+
className: "min-w-0 flex-1 truncate",
|
|
30
|
+
children: [
|
|
31
|
+
"Unknown value ",
|
|
32
|
+
item.label,
|
|
33
|
+
". Kept as it is."
|
|
34
|
+
]
|
|
35
|
+
}),
|
|
36
|
+
readOnly ? null : /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, {
|
|
37
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
38
|
+
size: "xs",
|
|
39
|
+
variant: "ghost",
|
|
40
|
+
rightIcon: /* @__PURE__ */ jsx(IconChevronDown, { stroke: 1.5 }),
|
|
41
|
+
"aria-label": `Fix unknown value ${item.label}`
|
|
42
|
+
}),
|
|
43
|
+
children: "Fix"
|
|
44
|
+
}), /* @__PURE__ */ jsxs(MenuContent, {
|
|
45
|
+
align: "end",
|
|
46
|
+
children: [item.options.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
47
|
+
/* @__PURE__ */ jsx(MenuLabel, { children: "Change to" }),
|
|
48
|
+
item.options.map((o) => /* @__PURE__ */ jsx(MenuItem, {
|
|
49
|
+
onClick: () => onRemap(item.key, o.value),
|
|
50
|
+
children: o.label
|
|
51
|
+
}, o.value)),
|
|
52
|
+
/* @__PURE__ */ jsx(MenuSeparator, {})
|
|
53
|
+
] }) : null, /* @__PURE__ */ jsx(MenuItem, {
|
|
54
|
+
danger: true,
|
|
55
|
+
onClick: () => onRemove(item.key),
|
|
56
|
+
children: "Remove"
|
|
57
|
+
})]
|
|
58
|
+
})] })
|
|
59
|
+
]
|
|
60
|
+
}, item.key))
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { UnknownValueNote };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=unknown-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unknown-value.js","names":[],"sources":["../../src/controls/unknown-value.tsx"],"sourcesContent":["/**\n * UNKNOWN VALUE — a stored value the field's schema no longer declares (H4).\n *\n * A select option that was renamed or removed, a rich-text style or mark the field's Accept list no longer names: the\n * value is KEPT, by the control and by every save, and said here, with the two ways out a person can take on purpose:\n * change it to a value the field does declare, or remove it. Nothing changes until they pick one. (Sanity empties the\n * select and strips the mark; we never drop a value in silence.)\n */\nimport { IconAlertTriangle, IconChevronDown } from \"@tabler/icons-react\";\nimport { Button } from \"../ui/button\";\nimport { Menu, MenuContent, MenuItem, MenuLabel, MenuSeparator, MenuTrigger } from \"../ui/overlay\";\n\nexport interface UnknownValue {\n /** what identifies the value to `onRemap` / `onRemove` */\n key: string;\n /** what the dock says: the stored value as stored, or its kind and name (\"Heading 2 style “h2”\") */\n label: string;\n /** the declared values it may be changed to; empty = remove only */\n options: { value: string; label: string }[];\n}\n\nexport function UnknownValueNote({\n items,\n onRemap,\n onRemove,\n readOnly,\n}: {\n items: readonly UnknownValue[];\n onRemap: (key: string, to: string) => void;\n onRemove: (key: string) => void;\n readOnly?: boolean;\n}) {\n if (items.length === 0) return null;\n return (\n <ul data-slot=\"kit-unknown-values\" role=\"status\" className=\"flex flex-col gap-1\">\n {items.map((item) => (\n <li key={item.key} className=\"flex min-h-8 min-w-0 items-center gap-2 rounded-kit-md bg-kit-warning-soft py-1 pl-2.5 pr-1 text-kit-xs text-kit-warning-fg\">\n <IconAlertTriangle aria-hidden className=\"size-3.5 shrink-0\" stroke={1.5} />\n <span className=\"min-w-0 flex-1 truncate\">Unknown value {item.label}. Kept as it is.</span>\n {readOnly ? null : (\n <Menu>\n <MenuTrigger render={<Button size=\"xs\" variant=\"ghost\" rightIcon={<IconChevronDown stroke={1.5} />} aria-label={`Fix unknown value ${item.label}`} />}>\n Fix\n </MenuTrigger>\n <MenuContent align=\"end\">\n {item.options.length ? (\n <>\n <MenuLabel>Change to</MenuLabel>\n {item.options.map((o) => (\n <MenuItem key={o.value} onClick={() => onRemap(item.key, o.value)}>\n {o.label}\n </MenuItem>\n ))}\n <MenuSeparator />\n </>\n ) : null}\n <MenuItem danger onClick={() => onRemove(item.key)}>\n Remove\n </MenuItem>\n </MenuContent>\n </Menu>\n )}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAqBA,SAAgB,iBAAiB,EAC/B,OACA,SACA,UACA,YAMC;CACD,IAAI,MAAM,WAAW,GAAG,OAAO;CAC/B,OACE,oBAAC,MAAD;EAAI,aAAU;EAAqB,MAAK;EAAS,WAAU;EACxD,UAAA,MAAM,KAAK,SACV,qBAAC,MAAD;GAAmB,WAAU;GAA7B,UAAA;IACE,oBAAC,mBAAD;KAAmB,eAAA;KAAY,WAAU;KAAoB,QAAQ;IAAM,CAAA;IAC3E,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA;MAA0C;MAAe,KAAK;MAAM;KAAsB;;IACzF,WAAW,OACV,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,aAAD;KAAa,QAAQ,oBAAC,QAAD;MAAQ,MAAK;MAAK,SAAQ;MAAQ,WAAW,oBAAC,iBAAD,EAAiB,QAAQ,IAAM,CAAA;MAAG,cAAY,qBAAqB,KAAK;KAAU,CAAA;KAAG,UAAA;IAE1I,CAAA,GACb,qBAAC,aAAD;KAAa,OAAM;KAAnB,UAAA,CACG,KAAK,QAAQ,SACZ,qBAAA,UAAA,EAAA,UAAA;MACE,oBAAC,WAAD,EAAA,UAAW,YAAoB,CAAA;MAC9B,KAAK,QAAQ,KAAK,MACjB,oBAAC,UAAD;OAAwB,eAAe,QAAQ,KAAK,KAAK,EAAE,KAAK;OAC7D,UAAA,EAAE;MACK,GAFK,EAAE,KAEP,CACX;MACD,oBAAC,eAAD,CAAgB,CAAA;KAChB,EAAA,CAAA,IACA,MACJ,oBAAC,UAAD;MAAU,QAAA;MAAO,eAAe,SAAS,KAAK,GAAG;MAAG,UAAA;KAE1C,CAAA,CACC;IACT,CAAA,CAAA,EAAA,CAAA;GAEN;EA1BK,GAAA,KAAK,GA0BV,CACL;CACC,CAAA;AAER"}
|