@bettercms-ai/kit 0.1.1 → 1.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/_virtual/_rolldown/runtime.js +13 -0
- package/adapters/icons.d.ts +15 -0
- package/adapters/icons.js +27 -0
- package/adapters/icons.js.map +1 -0
- package/adapters/lossy.d.ts +267 -0
- package/adapters/lossy.js +233 -0
- package/adapters/lossy.js.map +1 -0
- package/adapters/prod-types.d.ts +468 -0
- package/adapters/prod-types.js +646 -0
- package/adapters/prod-types.js.map +1 -0
- package/adapters/schema.d.ts +115 -0
- package/adapters/schema.js +2203 -0
- package/adapters/schema.js.map +1 -0
- package/adapters/values.d.ts +200 -0
- package/adapters/values.js +553 -0
- package/adapters/values.js.map +1 -0
- package/brand/logo.d.ts +17 -0
- package/brand/logo.js +9 -0
- package/brand/logo.js.map +1 -0
- package/context.d.ts +269 -0
- package/context.js +214 -0
- package/context.js.map +1 -0
- package/controls/button.d.ts +58 -0
- package/controls/button.js +507 -0
- package/controls/button.js.map +1 -0
- package/controls/c1.d.ts +11 -0
- package/controls/c1.js +24 -0
- package/controls/c1.js.map +1 -0
- package/controls/c2.d.ts +10 -0
- package/controls/c2.js +19 -0
- package/controls/c2.js.map +1 -0
- package/controls/choice.d.ts +39 -0
- package/controls/choice.js +410 -0
- package/controls/choice.js.map +1 -0
- package/controls/code-register.d.ts +1 -0
- package/controls/code-register.js +8 -0
- package/controls/code-register.js.map +1 -0
- package/controls/code.d.ts +42 -0
- package/controls/code.js +396 -0
- package/controls/code.js.map +1 -0
- package/controls/color.d.ts +5 -0
- package/controls/color.js +130 -0
- package/controls/color.js.map +1 -0
- package/controls/component-services.d.ts +114 -0
- package/controls/date-register.d.ts +1 -0
- package/controls/date-register.js +9 -0
- package/controls/date-register.js.map +1 -0
- package/controls/date-zone.d.ts +104 -0
- package/controls/date-zone.js +272 -0
- package/controls/date-zone.js.map +1 -0
- package/controls/date.d.ts +7 -0
- package/controls/date.js +458 -0
- package/controls/date.js.map +1 -0
- package/controls/form-picker-register.d.ts +1 -0
- package/controls/form-picker-register.js +19 -0
- package/controls/form-picker-register.js.map +1 -0
- package/controls/form-picker.d.ts +43 -0
- package/controls/form-picker.js +83 -0
- package/controls/form-picker.js.map +1 -0
- package/controls/icon-register.d.ts +1 -0
- package/controls/icon-register.js +8 -0
- package/controls/icon-register.js.map +1 -0
- package/controls/icon.d.ts +38 -0
- package/controls/icon.js +355 -0
- package/controls/icon.js.map +1 -0
- package/controls/index.d.ts +5 -0
- package/controls/index.js +37 -0
- package/controls/index.js.map +1 -0
- package/controls/json-register.d.ts +1 -0
- package/controls/json-register.js +8 -0
- package/controls/json-register.js.map +1 -0
- package/controls/json.d.ts +2 -0
- package/controls/json.js +72 -0
- package/controls/json.js.map +1 -0
- package/controls/link.d.ts +260 -0
- package/controls/link.js +1186 -0
- package/controls/link.js.map +1 -0
- package/controls/location-register.d.ts +1 -0
- package/controls/location-register.js +8 -0
- package/controls/location-register.js.map +1 -0
- package/controls/location.d.ts +16 -0
- package/controls/location.js +197 -0
- package/controls/location.js.map +1 -0
- package/controls/media-register.d.ts +1 -0
- package/controls/media-register.js +12 -0
- package/controls/media-register.js.map +1 -0
- package/controls/media-services.d.ts +40 -0
- package/controls/media.d.ts +73 -0
- package/controls/media.js +1076 -0
- package/controls/media.js.map +1 -0
- package/controls/number.d.ts +22 -0
- package/controls/number.js +195 -0
- package/controls/number.js.map +1 -0
- package/controls/reference-register.d.ts +1 -0
- package/controls/reference-register.js +10 -0
- package/controls/reference-register.js.map +1 -0
- package/controls/reference-services.d.ts +54 -0
- package/controls/reference.d.ts +23 -0
- package/controls/reference.js +761 -0
- package/controls/reference.js.map +1 -0
- package/controls/rich-text/blocks.d.ts +28 -0
- package/controls/rich-text/blocks.js +1532 -0
- package/controls/rich-text/blocks.js.map +1 -0
- package/controls/rich-text/catalog.d.ts +98 -0
- package/controls/rich-text/catalog.js +613 -0
- package/controls/rich-text/catalog.js.map +1 -0
- package/controls/rich-text/codec.d.ts +56 -0
- package/controls/rich-text/codec.js +32 -0
- package/controls/rich-text/codec.js.map +1 -0
- package/controls/rich-text/component-card.d.ts +14 -0
- package/controls/rich-text/component-card.js +706 -0
- package/controls/rich-text/component-card.js.map +1 -0
- package/controls/rich-text/control.d.ts +21 -0
- package/controls/rich-text/control.js +254 -0
- package/controls/rich-text/control.js.map +1 -0
- package/controls/rich-text/dom.d.ts +190 -0
- package/controls/rich-text/dom.js +690 -0
- package/controls/rich-text/dom.js.map +1 -0
- package/controls/rich-text/editor.d.ts +50 -0
- package/controls/rich-text/editor.js +1530 -0
- package/controls/rich-text/editor.js.map +1 -0
- package/controls/rich-text/floating.d.ts +23 -0
- package/controls/rich-text/floating.js +137 -0
- package/controls/rich-text/floating.js.map +1 -0
- package/controls/rich-text/index.d.ts +1 -0
- package/controls/rich-text/index.js +12 -0
- package/controls/rich-text/index.js.map +1 -0
- package/controls/rich-text/link-form.d.ts +13 -0
- package/controls/rich-text/link-form.js +111 -0
- package/controls/rich-text/link-form.js.map +1 -0
- package/controls/rich-text/markdown.d.ts +6 -0
- package/controls/rich-text/markdown.js +179 -0
- package/controls/rich-text/markdown.js.map +1 -0
- package/controls/rich-text/ops.d.ts +35 -0
- package/controls/rich-text/ops.js +314 -0
- package/controls/rich-text/ops.js.map +1 -0
- package/controls/rich-text/toolbar.d.ts +85 -0
- package/controls/rich-text/toolbar.js +338 -0
- package/controls/rich-text/toolbar.js.map +1 -0
- package/controls/scale.d.ts +56 -0
- package/controls/scale.js +563 -0
- package/controls/scale.js.map +1 -0
- package/controls/slot-register.d.ts +1 -0
- package/controls/slot-register.js +16 -0
- package/controls/slot-register.js.map +1 -0
- package/controls/slot-services.d.ts +97 -0
- package/controls/slot-services.js +38 -0
- package/controls/slot-services.js.map +1 -0
- package/controls/slot.d.ts +33 -0
- package/controls/slot.js +348 -0
- package/controls/slot.js.map +1 -0
- package/controls/table/index.d.ts +1 -0
- package/controls/table/index.js +12 -0
- package/controls/table/index.js.map +1 -0
- package/controls/table/prod.d.ts +21 -0
- package/controls/table/prod.js +79 -0
- package/controls/table/prod.js.map +1 -0
- package/controls/table/refs.d.ts +50 -0
- package/controls/table/refs.js +68 -0
- package/controls/table/refs.js.map +1 -0
- package/controls/table/stored.d.ts +15 -0
- package/controls/table/stored.js +44 -0
- package/controls/table/stored.js.map +1 -0
- package/controls/table/table-editor.d.ts +103 -0
- package/controls/table/table-editor.js +2722 -0
- package/controls/table/table-editor.js.map +1 -0
- package/controls/table/table-link.d.ts +24 -0
- package/controls/table/table-link.js +180 -0
- package/controls/table/table-link.js.map +1 -0
- package/controls/table/table.d.ts +9 -0
- package/controls/table/table.js +103 -0
- package/controls/table/table.js.map +1 -0
- package/controls/text.d.ts +17 -0
- package/controls/text.js +287 -0
- package/controls/text.js.map +1 -0
- package/engine/array.d.ts +101 -0
- package/engine/array.js +893 -0
- package/engine/array.js.map +1 -0
- package/engine/bits.d.ts +24 -0
- package/engine/bits.js +60 -0
- package/engine/bits.js.map +1 -0
- package/engine/breadcrumb.d.ts +45 -0
- package/engine/breadcrumb.js +87 -0
- package/engine/breadcrumb.js.map +1 -0
- package/engine/expand.d.ts +68 -0
- package/engine/expand.js +170 -0
- package/engine/expand.js.map +1 -0
- package/engine/field-list.d.ts +20 -0
- package/engine/field-list.js +19 -0
- package/engine/field-list.js.map +1 -0
- package/engine/field-shell.d.ts +49 -0
- package/engine/field-shell.js +860 -0
- package/engine/field-shell.js.map +1 -0
- package/engine/frame.d.ts +120 -0
- package/engine/frame.js +599 -0
- package/engine/frame.js.map +1 -0
- package/engine/group-summary.d.ts +4 -0
- package/engine/group-summary.js +66 -0
- package/engine/group-summary.js.map +1 -0
- package/engine/grouping.d.ts +224 -0
- package/engine/grouping.js +824 -0
- package/engine/grouping.js.map +1 -0
- package/engine/item-list.d.ts +89 -0
- package/engine/item-list.js +703 -0
- package/engine/item-list.js.map +1 -0
- package/engine/kit-field.d.ts +72 -0
- package/engine/kit-field.js +523 -0
- package/engine/kit-field.js.map +1 -0
- package/engine/schema-form.d.ts +91 -0
- package/engine/schema-form.js +320 -0
- package/engine/schema-form.js.map +1 -0
- package/engine/slot.d.ts +13 -0
- package/engine/slot.js +226 -0
- package/engine/slot.js.map +1 -0
- package/index.d.ts +46 -0
- package/index.js +55 -0
- package/index.js.map +1 -0
- package/kit.css +56 -0
- package/lib/cn.d.ts +4 -0
- package/lib/cn.js +53 -0
- package/lib/cn.js.map +1 -0
- package/lib/columns.d.ts +14 -0
- package/lib/columns.js +27 -0
- package/lib/columns.js.map +1 -0
- package/lib/frames.d.ts +36 -0
- package/lib/frames.js +214 -0
- package/lib/frames.js.map +1 -0
- package/lib/icons.d.ts +16 -0
- package/lib/icons.js +172 -0
- package/lib/icons.js.map +1 -0
- package/lib/path.d.ts +29 -0
- package/lib/path.js +64 -0
- package/lib/path.js.map +1 -0
- package/lib/schema.d.ts +49 -0
- package/lib/schema.js +287 -0
- package/lib/schema.js.map +1 -0
- package/lib/utils.d.ts +7 -0
- package/lib/utils.js +37 -0
- package/lib/utils.js.map +1 -0
- package/lib/validate.d.ts +20 -0
- package/lib/validate.js +150 -0
- package/lib/validate.js.map +1 -0
- package/package.json +31 -59
- package/schema/adapters.d.ts +28 -0
- package/schema/adapters.js +493 -0
- package/schema/adapters.js.map +1 -0
- package/schema/help.d.ts +25 -0
- package/schema/help.js +54 -0
- package/schema/help.js.map +1 -0
- package/schema/scale.d.ts +69 -0
- package/schema/scale.js +250 -0
- package/schema/scale.js.map +1 -0
- package/schema/sources.d.ts +103 -0
- package/schema/sources.js +65 -0
- package/schema/sources.js.map +1 -0
- package/schema/table.d.ts +319 -0
- package/schema/table.js +1198 -0
- package/schema/table.js.map +1 -0
- package/schema/types.d.ts +269 -0
- package/schema/types.js +14 -0
- package/schema/types.js.map +1 -0
- package/types.d.ts +17 -0
- package/ui/action-tray.d.ts +54 -0
- package/ui/action-tray.js +153 -0
- package/ui/action-tray.js.map +1 -0
- package/ui/button.d.ts +57 -0
- package/ui/button.js +202 -0
- package/ui/button.js.map +1 -0
- package/ui/choice-switch.d.ts +36 -0
- package/ui/choice-switch.js +57 -0
- package/ui/choice-switch.js.map +1 -0
- package/ui/controls.d.ts +83 -0
- package/ui/controls.js +319 -0
- package/ui/controls.js.map +1 -0
- package/ui/display.d.ts +156 -0
- package/ui/display.js +444 -0
- package/ui/display.js.map +1 -0
- package/ui/expanded-editor-modal.d.ts +26 -0
- package/ui/expanded-editor-modal.js +140 -0
- package/ui/expanded-editor-modal.js.map +1 -0
- package/ui/field-context.d.ts +12 -0
- package/ui/field-context.js +23 -0
- package/ui/field-context.js.map +1 -0
- package/ui/floating-panel.d.ts +152 -0
- package/ui/floating-panel.js +912 -0
- package/ui/floating-panel.js.map +1 -0
- package/ui/index.d.ts +12 -0
- package/ui/index.js +13 -0
- package/ui/input.d.ts +78 -0
- package/ui/input.js +250 -0
- package/ui/input.js.map +1 -0
- package/ui/mode-bar.d.ts +31 -0
- package/ui/mode-bar.js +65 -0
- package/ui/mode-bar.js.map +1 -0
- package/ui/overlay.d.ts +123 -0
- package/ui/overlay.js +378 -0
- package/ui/overlay.js.map +1 -0
- package/ui/path-crumbs.d.ts +90 -0
- package/ui/path-crumbs.js +532 -0
- package/ui/path-crumbs.js.map +1 -0
- package/ui/presence.d.ts +16 -0
- package/ui/presence.js +65 -0
- package/ui/presence.js.map +1 -0
- package/ui/select.d.ts +66 -0
- package/ui/select.js +405 -0
- package/ui/select.js.map +1 -0
- package/ui/shortcut-hint.d.ts +14 -0
- package/ui/shortcut-hint.js +35 -0
- package/ui/shortcut-hint.js.map +1 -0
- package/ui/surfaces.d.ts +23 -0
- package/ui/surfaces.js +26 -0
- package/ui/surfaces.js.map +1 -0
- package/ui/tooltip-root.d.ts +12 -0
- package/ui/tooltip-root.js +76 -0
- package/ui/tooltip-root.js.map +1 -0
- package/ui/variants.d.ts +15 -0
- package/ui/variants.js +14 -0
- package/ui/variants.js.map +1 -0
- package/LICENSE +0 -21
- package/README.md +0 -27
- 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.d.ts +0 -3140
- package/dist/index.js +0 -2036
- package/dist/index.mjs +0 -2044
- package/dist/theme.d.mts +0 -1506
- package/dist/theme.d.ts +0 -1506
- package/dist/theme.js +0 -4126
- 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":"media.js","names":[],"sources":["../../src/kit/controls/media.tsx"],"sourcesContent":["/**\n * MEDIA — image · gallery · file · video (V2 HEAD 9829bf1 kit/controls/media.tsx, DESIGN.md 8.15).\n *\n * Production parity: dashed drop well (\"Add an image / Or drop or paste one here\"), filled 16:9 preview with Replace and\n * Remove pills, the caption \"{file} · W × H · No alt text\" and a ⋯ whose \"Alt text and details\" opens a popover (alt\n * text, focal point, file name). The media library picker, the upload and the asset metadata are KitServices\n * (media-services.ts): the kit never imports a feature, and a missing service is named in words, never faked.\n *\n * Kit deviations from V2, each because of what the backend stores (adapters/values.ts):\n * - no \"Crop for this placement\" dropdown: `imageToProd` cannot store a crop preset (it becomes a pixel rect only with\n * the asset's size, and never reads back as the preset), so the dock would refuse every write that carried one;\n * - a picked asset's width / height / size are read for the caption, never written into the value (prod rebuilds the\n * value from url, id, name, altText and focal; the rest would be refused);\n * - where the host stores the URL string only (`imageStoresUrl`, the dock's top-level image props) the value stays a\n * string, and alt text and focal point are the media library's (said in the details popover);\n * - no built-in demo picker, no simulated upload, no stock poster frames;\n * - the gallery sorts with the engine's `useDragReorder` (@dnd-kit is not on the kit allow-list);\n * - a typed video URL is held as a draft until it is one prod stores (http(s) or a site path), so the dock never\n * refuses a half-typed address.\n */\nimport * as React from \"react\";\nimport {\n IconAlertTriangle,\n IconDots,\n IconDownload,\n IconExternalLink,\n IconFileText,\n IconFocusCentered,\n IconLink,\n IconPhoto,\n IconPlayerPlay,\n IconPlus,\n IconReplace,\n IconTrash,\n IconUpload,\n IconVideo,\n IconWorld,\n IconX,\n} from \"@tabler/icons-react\";\nimport type {} from \"./media-services\";\nimport { Button } from \"../ui/button\";\nimport { Input, Textarea } from \"../ui/input\";\nimport { Progress } from \"../ui/controls\";\nimport { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Popover, PopoverAnchor, PopoverContent, Tooltip } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport { isObj } from \"../lib/path\";\nimport { useDragReorder } from \"../engine/item-list\";\nimport { useKitEnv, useKitServices, type KitMediaAsset, type KitServices } from \"../context\";\nimport type { ControlProps } from \"../types\";\n\n/* ── Values ─────────────────────────────────────────────────────────── */\n/** The image value the kit edits (V2 ImageValue, minus what prod cannot store: crop, caption, width, height, size). */\nexport interface ImageValue {\n url: string;\n alt?: string;\n /** percent */\n focal?: { x: number; y: number };\n name?: string;\n id?: string;\n [key: string]: unknown;\n}\n\nexport const fileNameFromUrl = (url: string) => {\n const last = url.split(\"?\")[0].split(\"#\")[0].split(\"/\").filter(Boolean).pop() ?? \"\";\n try {\n return decodeURIComponent(last);\n } catch {\n return last;\n }\n};\n\nexport const normImage = (v: unknown): ImageValue | null => {\n if (typeof v === \"string\") return v ? { url: v } : null;\n return isObj(v) && typeof v.url === \"string\" && v.url ? (v as ImageValue) : null;\n};\n\n/** What an asset becomes in a value: the keys prod keeps (url, id, name, alt), nothing measured. */\nexport const fromAsset = (a: KitMediaAsset): ImageValue => {\n const out: ImageValue = { url: a.url, id: a.id };\n if (a.name) out.name = a.name;\n if (a.alt) out.alt = a.alt;\n return out;\n};\n\nexport const formatBytes = (n: number) => (n >= 1_000_000 ? `${(n / 1_000_000).toFixed(1)} MB` : `${Math.max(1, Math.round(n / 1000))} KB`);\n\nconst HTTP = /^https?:\\/\\/\\S+$/i;\n/** An http(s) URL or a site path: what prod's video value takes (video-value.ts isVideoUrl). */\nexport const isVideoUrl = (s: string) => s === \"\" || HTTP.test(s.trim()) || /^\\/(?!\\/)\\S*$/.test(s.trim());\n\nconst NO_ASSET = () => undefined;\nconst NO_SRC = (u: string) => u;\n\n/** The services the media controls read, each hook stable across renders. */\nfunction useMedia() {\n const s = useKitServices();\n return { s, useAsset: s.useMediaAsset ?? NO_ASSET, src: s.mediaSrc ?? NO_SRC };\n}\n\n/** Files the field takes, by `accept` (an `image/*`, `.pdf`, `*` list). */\nexport function acceptsFile(accept: string, file: Pick<File, \"type\" | \"name\">): boolean {\n return accept.split(\",\").some((raw) => {\n const rule = raw.trim().toLowerCase();\n if (!rule || rule === \"*\" || rule === \"*/*\") return true;\n if (rule.startsWith(\".\")) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(rule.slice(0, -1));\n return file.type.toLowerCase() === rule;\n });\n}\n\n/* ── Picker and upload (services) ─────────────────────────────────────── */\nexport function MediaPicker(p: React.ComponentProps<NonNullable<KitServices[\"MediaPicker\"]>>) {\n const Picker = useKitServices().MediaPicker;\n return Picker ? <Picker {...p} /> : null;\n}\n\n/**\n * Upload through the host's media library: progress while it runs, the assets handed to `onDone`, and a named reason\n * when it fails or a file is the wrong kind. `run` is undefined when the host has no upload service.\n */\nexport function useUpload(accept: string, kind: string, onDone: (a: KitMediaAsset[]) => void) {\n const { uploadMedia, onUploaded, toast } = useKitServices();\n const [progress, setProgress] = React.useState<number | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const alive = React.useRef(true);\n React.useEffect(\n () => () => {\n alive.current = false;\n },\n [],\n );\n const run = uploadMedia\n ? (files: File[]) => {\n if (!files.length || progress != null) return;\n const bad = files.find((f) => !acceptsFile(accept, f));\n if (bad) {\n setError(`${bad.name || \"That file\"} isn't ${kind === \"file\" ? \"a file this field takes\" : `an ${kind}`}.`);\n return;\n }\n setError(null);\n setProgress(0);\n uploadMedia(files, { onProgress: (f) => alive.current && setProgress(Math.round(Math.min(1, Math.max(0, f)) * 100)) })\n .then((assets) => {\n if (!alive.current) return;\n setProgress(null);\n onUploaded?.(assets);\n onDone(assets);\n toast?.success(files.length > 1 ? `${files.length} files uploaded` : `${assets[0]?.name ?? files[0].name} uploaded`, { description: \"Added to the media library\" });\n })\n .catch((e: unknown) => {\n if (!alive.current) return;\n setProgress(null);\n setError(`Upload failed: ${e instanceof Error ? e.message : String(e)}`);\n });\n }\n : undefined;\n return { progress, error, setError, run };\n}\n\n/** A line under a control that says why something did not happen (role=\"alert\": it is the answer to an action). */\nfunction Reason({ children, tone = \"danger\" }: { children: React.ReactNode; tone?: \"danger\" | \"muted\" }) {\n return (\n <p role={tone === \"danger\" ? \"alert\" : \"note\"} className={cn(\"text-kit-xs\", tone === \"danger\" ? \"text-kit-danger-fg\" : \"text-kit-fg-3\")}>\n {children}\n </p>\n );\n}\n\n/* ── Drop well (drag · paste · upload · library · URL) ─────────────── */\nfunction DropWell({\n id,\n title,\n hint,\n accept,\n multiple,\n icon,\n disabled,\n onFiles,\n onLibrary,\n onUrl,\n refuse,\n progress,\n}: {\n id?: string;\n title: string;\n hint: string;\n accept: string;\n multiple?: boolean;\n icon: React.ReactNode;\n disabled?: boolean;\n /** undefined: the host has no upload service (no Upload button, drop or paste) */\n onFiles?: (f: File[]) => void;\n /** undefined: the host has no media library */\n onLibrary?: () => void;\n onUrl?: (url: string) => void;\n /** set: Media library and Upload stay drawn (V2's well) when the host has no such service, and a click, drop or\n * paste says why through this instead */\n refuse?: (reason: string) => void;\n progress: number | null;\n}) {\n const [over, setOver] = React.useState(false);\n const [urlMode, setUrlMode] = React.useState(false);\n const [url, setUrl] = React.useState(\"\");\n const [urlError, setUrlError] = React.useState<string | null>(null);\n const input = React.useRef<HTMLInputElement>(null);\n const takesFiles = (!!onFiles || !!refuse) && !disabled;\n const files = (f: File[]) => (onFiles ? onFiles(f) : refuse?.(NO_UPLOAD));\n const pickFiles = () => (onFiles ? input.current?.click() : refuse?.(NO_UPLOAD));\n return (\n <div\n id={id}\n tabIndex={disabled ? -1 : 0}\n role=\"group\"\n aria-label={takesFiles ? `${title}. Paste an image or press Enter to upload` : title}\n onPaste={(e) => {\n const pasted = Array.from(e.clipboardData.files);\n if (pasted.length && takesFiles) {\n e.preventDefault();\n files(pasted);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && e.target === e.currentTarget && takesFiles) {\n e.preventDefault();\n pickFiles();\n }\n }}\n onDragOver={(e) => {\n if (!takesFiles) return;\n e.preventDefault();\n setOver(true);\n }}\n onDragLeave={(e) => {\n // entering a child (the URL button, the input) fires dragleave on the well: only leaving the well clears it\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setOver(false);\n }}\n onDrop={(e) => {\n if (!takesFiles) return;\n e.preventDefault();\n setOver(false);\n files(Array.from(e.dataTransfer.files));\n }}\n data-slot=\"kit-drop-well\"\n className={cn(\n \"relative flex flex-col items-center gap-2.5 rounded-kit-lg border border-dashed px-4 py-5 text-center transition-colors\",\n over ? \"border-kit-accent bg-kit-accent-softer\" : \"border-kit-line-strong bg-kit-subtle hover:border-kit-field-border-hover\",\n )}\n >\n <span className={cn(\"flex size-9 items-center justify-center rounded-kit-lg border border-kit-line bg-kit-control-bg text-kit-fg-3 [&_svg]:size-[18px]\", over && \"text-kit-accent-fg\")}>{icon}</span>\n <div>\n <div className=\"text-kit-sm font-medium text-kit-fg\">{over ? \"Drop to upload\" : title}</div>\n {takesFiles ? <div className=\"text-kit-xs text-kit-fg-3\">{hint}</div> : null}\n </div>\n {urlMode && onUrl ? (\n <form\n className=\"flex w-full max-w-sm flex-col gap-1.5\"\n onSubmit={(e) => {\n e.preventDefault();\n e.stopPropagation();\n const v = url.trim();\n if (HTTP.test(v)) {\n onUrl(v);\n setUrlMode(false);\n setUrl(\"\");\n setUrlError(null);\n } else setUrlError(\"Use a full image URL, like https://…/photo.jpg\");\n }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setUrlMode(false);\n setUrlError(null);\n }\n }}\n >\n <div className=\"flex items-center gap-1.5\">\n <Input\n autoFocus\n size=\"sm\"\n value={url}\n aria-label=\"Image URL\"\n aria-invalid={urlError ? true : undefined}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://…/photo.jpg\"\n leading={<IconLink stroke={1.5} />}\n className=\"flex-1\"\n />\n <Button size=\"sm\" type=\"submit\" variant=\"primary\">\n Add\n </Button>\n </div>\n {urlError ? <Reason>{urlError}</Reason> : null}\n </form>\n ) : (\n <div className=\"flex flex-wrap justify-center gap-1.5\">\n {onLibrary || refuse ? (\n <Button size=\"sm\" variant=\"secondary\" onClick={onLibrary ?? (() => refuse!(NO_LIBRARY))} disabled={disabled}>\n Media library\n </Button>\n ) : null}\n {onFiles || refuse ? (\n <Button size=\"sm\" variant=\"ghost\" leftIcon={<IconUpload stroke={1.5} />} onClick={pickFiles} disabled={disabled}>\n Upload\n </Button>\n ) : null}\n {onUrl ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setUrlMode(true)} disabled={disabled}>\n Paste URL\n </Button>\n ) : null}\n </div>\n )}\n {onFiles ? (\n <input\n ref={input}\n type=\"file\"\n hidden\n tabIndex={-1}\n aria-hidden\n accept={accept}\n multiple={multiple}\n onChange={(e) => {\n onFiles(Array.from(e.target.files ?? []));\n e.target.value = \"\";\n }}\n />\n ) : null}\n {progress != null ? (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 rounded-kit-lg bg-kit-surface px-8\">\n <span className=\"text-kit-sm text-kit-fg-2\">\n <span role=\"status\">Uploading…</span> {progress}%\n </span>\n <Progress value={progress} tone=\"ink\" label=\"Upload progress\" className=\"max-w-56\" />\n </div>\n ) : null}\n </div>\n );\n}\n\n/** Why the drop well offers nothing to pick with (no library, no upload): said once, in words. */\nconst NO_SOURCE = \"No media library or upload is connected to this editor, so nothing can be chosen here.\";\nconst NO_LIBRARY = \"No media library is connected to this editor, so nothing can be picked from it here.\";\nconst NO_UPLOAD = \"No upload is connected to this editor, so files can't be uploaded here.\";\n\n/* ── Image ─────────────────────────────────────────────────────────── */\nfunction ImageDetails({\n v,\n onChange,\n readOnly,\n label,\n urlOnly,\n size,\n asset,\n}: {\n v: ImageValue;\n onChange: (n: ImageValue) => void;\n readOnly?: boolean;\n label: string;\n urlOnly: boolean;\n size?: { w: number; h: number };\n asset?: KitMediaAsset;\n}) {\n const { src } = useMedia();\n const focal = v.focal ?? { x: 50, y: 50 };\n const setFocal = (x: number, y: number) => onChange({ ...v, focal: { x: Math.round(Math.min(100, Math.max(0, x))), y: Math.round(Math.min(100, Math.max(0, y))) } });\n const fromPointer = (e: React.PointerEvent<HTMLDivElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n if (!r.width || !r.height) return;\n setFocal(((e.clientX - r.left) / r.width) * 100, ((e.clientY - r.top) / r.height) * 100);\n };\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-kit-sm font-medium text-kit-fg\">Alt text and details</span>\n {size ? (\n <span className=\"tabular-nums text-kit-2xs text-kit-fg-3\">\n {size.w} × {size.h}\n </span>\n ) : null}\n </div>\n {urlOnly ? (\n <>\n <Reason tone=\"muted\">This placement stores the image address only, so its alt text and focal point are the media library's.</Reason>\n {asset?.alt ? (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-kit-xs text-kit-fg-3\">Alt text in the media library</span>\n <span className=\"text-kit-sm text-kit-fg\">{asset.alt}</span>\n </div>\n ) : null}\n </>\n ) : (\n <>\n <label className=\"flex flex-col gap-1.5\">\n <span className=\"text-kit-xs text-kit-fg-3\">Alt text</span>\n <Textarea\n rows={2}\n value={v.alt ?? \"\"}\n readOnly={readOnly}\n onChange={(e) => {\n const alt = e.target.value;\n const next = { ...v };\n if (alt) next.alt = alt;\n else delete next.alt;\n onChange(next);\n }}\n placeholder=\"Describe the image for accessibility\"\n className=\"min-h-14 text-kit-sm\"\n aria-label={`${label} alt text`}\n />\n </label>\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"flex items-center gap-1 text-kit-xs text-kit-fg-3\">\n <IconFocusCentered className=\"size-3.5\" stroke={1.5} aria-hidden />\n Focal point\n </span>\n <span className=\"tabular-nums text-kit-2xs text-kit-fg-3\">\n Focal {focal.x}%, {focal.y}%\n </span>\n </div>\n <div\n role=\"slider\"\n aria-label=\"Focal point. Click the subject.\"\n aria-valuetext={`${focal.x}% across, ${focal.y}% down`}\n aria-valuenow={focal.x}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-readonly={readOnly || undefined}\n tabIndex={0}\n onPointerDown={(e) => !readOnly && fromPointer(e)}\n onKeyDown={(e) => {\n const d = e.shiftKey ? 10 : 2;\n const m: Record<string, [number, number]> = { ArrowLeft: [-d, 0], ArrowRight: [d, 0], ArrowUp: [0, -d], ArrowDown: [0, d] };\n const step = m[e.key];\n if (!step || readOnly) return;\n e.preventDefault();\n setFocal(focal.x + step[0], focal.y + step[1]);\n }}\n className=\"relative mt-1 aspect-[3/2] cursor-crosshair overflow-hidden rounded-kit-md border border-kit-line bg-kit-muted\"\n >\n <img src={src(v.url)} alt=\"\" draggable={false} className=\"pointer-events-none size-full select-none object-cover transition-[object-position] duration-200 motion-reduce:transition-none\" style={{ objectPosition: `${focal.x}% ${focal.y}%` }} />\n <span\n aria-hidden\n className=\"pointer-events-none absolute size-5 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-kit-fg-inverse bg-kit-inverse/30 shadow-kit-md transition-[left,top] duration-150 motion-reduce:transition-none\"\n style={{ left: `${focal.x}%`, top: `${focal.y}%` }}\n />\n </div>\n <span className=\"text-kit-2xs text-kit-fg-3\">Click the subject. It stays in frame on every screen size.</span>\n </div>\n </>\n )}\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-kit-xs text-kit-fg-3\">File name</span>\n <span className=\"truncate font-kit-mono text-kit-xs text-kit-fg\">{asset?.name ?? v.name ?? fileNameFromUrl(v.url)}</span>\n </div>\n </div>\n );\n}\n\n/** The width × height a stored image value carries (positive numbers only), else undefined. */\nfunction storedSize(value: unknown): { w: number; h: number } | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const { width, height } = value as { width?: unknown; height?: unknown };\n return typeof width === \"number\" && typeof height === \"number\" && width > 0 && height > 0 ? { w: width, h: height } : undefined;\n}\n\nconst PILL = \"flex h-7 items-center gap-1 rounded-full border border-kit-swatch-ring bg-kit-control-bg px-2.5 text-kit-xs font-medium text-kit-fg shadow-kit-sm\";\n\nexport function ImageControl({ field, value, onChange: write, readOnly, id, path }: ControlProps) {\n const { s, useAsset, src } = useMedia();\n const env = useKitEnv();\n const urlOnly = !!s.imageStoresUrl?.(path);\n const legacyString = typeof value === \"string\" || field.valueShape === \"string\";\n const v = normImage(value);\n const asset = useAsset({ id: v?.id, url: v?.url ?? \"\" });\n const [natural, setNatural] = React.useState<{ w: number; h: number } | undefined>();\n React.useEffect(() => setNatural(undefined), [v?.url]);\n // V2's order: the library asset's dimensions, then the ones stored on the value (an imported or retina source keeps\n // its real size there), and only then the loaded preview's natural size (a resized preview reads smaller)\n const stored = storedSize(value);\n const size = asset?.width && asset.height ? { w: asset.width, h: asset.height } : stored ?? natural;\n\n /* the URL-string placements write the URL; legacy strings stay strings until alt or focal needs the object */\n const onChange = (n: ImageValue | null) => {\n if (!n) return write(urlOnly ? \"\" : null);\n if (urlOnly) return write(n.url);\n if (legacyString && !n.alt && !n.focal) return write(n.url);\n write(n);\n };\n const [picker, setPicker] = React.useState(false);\n const [details, setDetails] = React.useState(false);\n const up = useUpload(\"image/*\", \"image\", (a) => a[0] && onChange(fromAsset(a[0])));\n const library = s.MediaPicker && !readOnly ? () => setPicker(true) : undefined;\n\n if (!v)\n return (\n <div className=\"flex flex-col gap-1.5\">\n <DropWell\n id={id}\n title=\"Add an image\"\n hint=\"Or drop or paste one here\"\n accept=\"image/*\"\n icon={<IconPhoto stroke={1.5} />}\n onFiles={up.run}\n onLibrary={library}\n onUrl={readOnly ? undefined : (url) => onChange({ url, name: fileNameFromUrl(url) || undefined })}\n refuse={up.setError}\n disabled={readOnly}\n progress={up.progress}\n />\n {up.error ? <Reason>{up.error}</Reason> : null}\n <MediaPicker open={picker} onOpenChange={setPicker} accept={[\"image\", \"svg\"]} onPick={(a) => a[0] && onChange(fromAsset(a[0]))} />\n </div>\n );\n\n const focal = v.focal ?? { x: 50, y: 50 };\n const alt = urlOnly ? asset?.alt : v.alt;\n const name = asset?.name ?? v.name ?? fileNameFromUrl(v.url);\n const replace = (a: KitMediaAsset) => {\n const next = fromAsset(a);\n if (!next.alt && v.alt) next.alt = v.alt;\n if (v.focal) next.focal = v.focal;\n onChange(next);\n };\n const openDetails = () => window.setTimeout(() => setDetails(true), 0);\n return (\n <Popover open={details} onOpenChange={setDetails}>\n <PopoverAnchor\n className={cn(\"flex flex-col gap-1.5\", env.variant === \"document\" && \"max-w-xl\")}\n onPaste={(e: React.ClipboardEvent) => {\n const files = Array.from(e.clipboardData.files);\n if (files.length && up.run && !readOnly) {\n e.preventDefault();\n up.run(files);\n }\n }}\n >\n <div className=\"group/img relative aspect-video overflow-hidden rounded-kit-lg border border-kit-line bg-kit-muted\">\n <button\n id={id}\n type=\"button\"\n disabled={readOnly}\n onClick={() => (library ? library() : openDetails())}\n aria-label={library ? `Replace ${field.title}` : `${field.title} details`}\n className=\"block size-full outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-kit-focus-ring focus-visible:[outline-style:solid] [html[data-input-modality=pointer]_&]:focus-visible:outline-none\"\n >\n <img\n src={src(v.url)}\n alt={alt ?? \"\"}\n onLoad={(e) => {\n const img = e.currentTarget;\n if (img.naturalWidth && img.naturalHeight) setNatural({ w: img.naturalWidth, h: img.naturalHeight });\n }}\n className=\"size-full object-cover\"\n style={{ objectPosition: `${focal.x}% ${focal.y}%` }}\n />\n </button>\n {readOnly ? null : (\n <div className=\"absolute right-2 top-2 flex gap-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/img:opacity-100 [@media(pointer:coarse)]:opacity-100\">\n {library ? (\n <button type=\"button\" onClick={library} className={PILL}>\n <IconReplace className=\"size-3.5\" stroke={1.5} aria-hidden />\n Replace\n </button>\n ) : null}\n <Tooltip content=\"Remove image\">\n <button type=\"button\" aria-label=\"Remove image\" onClick={() => onChange(null)} className={cn(PILL, \"size-7 justify-center px-0\")}>\n <IconX className=\"size-3.5\" stroke={1.5} aria-hidden />\n </button>\n </Tooltip>\n </div>\n )}\n {up.progress != null ? (\n <div className=\"absolute inset-x-3 bottom-3\">\n <Progress value={up.progress} tone=\"ink\" size=\"sm\" label=\"Upload progress\" />\n </div>\n ) : null}\n </div>\n <div className=\"flex min-w-0 items-center gap-1.5 pl-0.5\">\n <span data-slot=\"kit-image-caption\" className=\"min-w-0 flex-1 truncate text-kit-xs text-kit-fg-3\">\n {name}\n {size ? (\n <>\n {\" · \"}\n <span className=\"tabular-nums\">\n {size.w} × {size.h}\n </span>\n </>\n ) : null}\n {\" · \"}\n {alt ? (\n <span className=\"text-kit-fg-2\">Alt text set</span>\n ) : (\n <span className=\"inline-flex items-center gap-0.5 text-kit-warning-fg\">\n <IconAlertTriangle className=\"size-3\" stroke={1.5} aria-hidden />\n No alt text\n </span>\n )}\n </span>\n <Menu>\n <MenuTrigger\n aria-label=\"Image actions\"\n className=\"flex size-6 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg data-[popup-open]:bg-kit-hover\"\n >\n <IconDots className=\"size-4\" stroke={1.5} aria-hidden />\n </MenuTrigger>\n <MenuContent align=\"end\" className=\"w-52\">\n <MenuItem icon={<IconFocusCentered stroke={1.5} />} onClick={openDetails}>\n Alt text and details\n </MenuItem>\n {library ? (\n <MenuItem icon={<IconReplace stroke={1.5} />} onClick={library}>\n Replace\n </MenuItem>\n ) : null}\n <MenuItem icon={<IconExternalLink stroke={1.5} />} onClick={() => window.open(src(v.url), \"_blank\", \"noopener\")}>\n Open original\n </MenuItem>\n {readOnly ? null : (\n <>\n <MenuSeparator />\n <MenuItem danger icon={<IconTrash stroke={1.5} />} onClick={() => onChange(null)}>\n Remove\n </MenuItem>\n </>\n )}\n </MenuContent>\n </Menu>\n </div>\n {up.error ? <Reason>{up.error}</Reason> : null}\n </PopoverAnchor>\n <PopoverContent className=\"w-[320px]\" align=\"start\" side=\"bottom\">\n <ImageDetails v={v} onChange={onChange} readOnly={readOnly} label={field.title} urlOnly={urlOnly} size={size} asset={asset} />\n </PopoverContent>\n <MediaPicker open={picker} onOpenChange={setPicker} accept={[\"image\", \"svg\"]} onPick={(a) => a[0] && replace(a[0])} />\n </Popover>\n );\n}\n\n/* ── Gallery (array of images) ─────────────────────────────────────── */\ntype GItem = { key: string; v: ImageValue; raw: unknown };\n\nfunction Thumb({\n item,\n label,\n readOnly,\n sort,\n onRemove,\n onOpen,\n}: {\n item: GItem;\n label: string;\n readOnly?: boolean;\n sort: ReturnType<typeof useDragReorder>;\n onRemove: () => void;\n onOpen: () => void;\n}) {\n const { src } = useMedia();\n const handle = sort.handle(item.key);\n return (\n <div\n ref={sort.register(item.key)}\n role=\"listitem\"\n style={sort.style(item.key)}\n className={cn(\"group/thumb relative aspect-square overflow-hidden rounded-kit-md border border-kit-line bg-kit-muted\", sort.active === item.key && \"z-10 shadow-kit-lg ring-2 ring-kit-line-strong\")}\n >\n <div\n {...(readOnly ? {} : handle)}\n tabIndex={0}\n aria-label={readOnly ? label : `${label}, drag to reorder`}\n onDoubleClick={onOpen}\n onKeyDown={(e) => {\n if (!readOnly && (e.key === \"Delete\" || e.key === \"Backspace\")) {\n e.preventDefault();\n onRemove();\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n onOpen();\n return;\n }\n if (!readOnly) handle.onKeyDown(e);\n }}\n className={cn(\n \"size-full touch-none outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-kit-focus-ring focus-visible:[outline-style:solid] [html[data-input-modality=pointer]_&]:focus-visible:outline-none\",\n !readOnly && \"cursor-grab active:cursor-grabbing\",\n )}\n >\n <img src={src(item.v.url)} alt={item.v.alt ?? \"\"} className=\"pointer-events-none size-full select-none object-cover\" draggable={false} />\n </div>\n {!item.v.alt ? <span role=\"img\" className=\"absolute bottom-1 left-1 size-1.5 rounded-full bg-kit-warning ring-2 ring-kit-surface\" aria-label=\"No alt text\" /> : null}\n {readOnly ? null : (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onRemove}\n className=\"absolute right-1 top-1 flex size-6 items-center justify-center rounded-kit-md bg-kit-inverse/80 text-kit-fg-inverse opacity-0 transition-opacity focus-visible:opacity-100 group-hover/thumb:opacity-100 [@media(pointer:coarse)]:opacity-100\"\n >\n <IconX className=\"size-3.5\" stroke={1.5} aria-hidden />\n </button>\n )}\n </div>\n );\n}\n\n/** An array of images: a sortable grid of tiles with a dashed \"Add images\" tile last (hidden at `max`). */\nexport function GalleryControl({ value, onChange, readOnly, field, id }: ControlProps) {\n const { s, src } = useMedia();\n const raw = Array.isArray(value) ? value : [];\n /* a key that survives a move (keyboard reorder refocuses the grip by key); an index suffix only for duplicates */\n const seen = new Map<string, number>();\n const items: GItem[] = raw.map((x) => {\n const v = normImage(x) ?? { url: \"\" };\n const base = v.id ?? v.url;\n const n = seen.get(base) ?? 0;\n seen.set(base, n + 1);\n return { key: n ? `${base}#${n}` : base, v, raw: x };\n });\n /* strings stay strings (a legacy list of URLs); a picked asset joins as the object prod stores */\n const asStrings = raw.length > 0 && raw.every((x) => typeof x === \"string\");\n const out = (v: ImageValue) => (asStrings && !v.alt && !v.focal ? v.url : v);\n const write = (list: unknown[]) => onChange(list);\n const add = (assets: KitMediaAsset[]) => write([...raw, ...assets.map((a) => out(fromAsset(a)))]);\n const [picker, setPicker] = React.useState(false);\n const up = useUpload(\"image/*\", \"image\", add);\n const keys = items.map((it) => it.key);\n const sort = useDragReorder(\n keys,\n (from, to) => {\n const next = [...raw];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n write(next);\n },\n { axis: \"grid\", disabled: readOnly },\n );\n const max = field.validation?.max;\n const canAdd = !readOnly && (max == null || items.length < max) && (s.MediaPicker || up.run);\n const noun = (i: number, it: GItem) => it.v.name ?? (fileNameFromUrl(it.v.url) || `Image ${i + 1}`);\n return (\n <div className=\"flex flex-col gap-2\">\n <div id={id} role=\"list\" aria-label={field.title} className=\"grid grid-cols-3 gap-1.5 @[520px]:grid-cols-5\">\n {items.map((it, i) => (\n <Thumb\n key={it.key}\n item={it}\n label={noun(i, it)}\n readOnly={readOnly}\n sort={sort}\n onOpen={() => window.open(src(it.v.url), \"_blank\", \"noopener\")}\n onRemove={() => write(raw.filter((_, j) => j !== i))}\n />\n ))}\n {canAdd ? (\n // a real grid cell, not `display: contents`: V2 draws the tile as the grid's own child, and a box-less wrapper\n // would put the tile beside nothing (the Panel walker measures its gap from the thumbs beside it)\n <div role=\"listitem\" className=\"grid\">\n <button\n type=\"button\"\n onClick={() => (s.MediaPicker ? setPicker(true) : up.run && document.getElementById(`${id}-files`)?.click())}\n onPaste={(e) => {\n const files = Array.from(e.clipboardData.files);\n if (files.length && up.run) {\n e.preventDefault();\n up.run(files);\n }\n }}\n onDragOver={(e) => up.run && e.preventDefault()}\n onDrop={(e) => {\n if (!up.run) return;\n e.preventDefault();\n up.run(Array.from(e.dataTransfer.files));\n }}\n className=\"flex aspect-square flex-col items-center justify-center gap-1 rounded-kit-md border border-dashed border-kit-line-strong bg-kit-subtle text-kit-xs text-kit-fg-3 transition-colors hover:border-kit-field-border-hover hover:text-kit-fg\"\n >\n <IconPlus className=\"size-4\" stroke={1.5} aria-hidden />\n Add images\n </button>\n </div>\n ) : null}\n </div>\n {sort.a11y}\n {up.run && !s.MediaPicker ? (\n <input\n id={`${id}-files`}\n type=\"file\"\n hidden\n tabIndex={-1}\n aria-hidden\n accept=\"image/*\"\n multiple\n onChange={(e) => {\n up.run?.(Array.from(e.target.files ?? []));\n e.target.value = \"\";\n }}\n />\n ) : null}\n {up.progress != null ? <Progress value={up.progress} tone=\"ink\" size=\"sm\" label=\"Upload progress\" /> : null}\n {up.error ? <Reason>{up.error}</Reason> : null}\n {!readOnly && !s.MediaPicker && !up.run ? <Reason tone=\"muted\">{NO_SOURCE}</Reason> : null}\n <MediaPicker open={picker} onOpenChange={setPicker} multiple accept={[\"image\", \"svg\"]} onPick={(a) => a.length && add(max != null ? a.slice(0, Math.max(0, max - items.length)) : a)} />\n </div>\n );\n}\n\n/* ── File ──────────────────────────────────────────────────────────── */\n/** A file value prod stores: the same envelope as an image, `{ url, id?, name? }` (or a legacy URL string). */\ntype FileValue = { url: string; id?: string; name?: string; [key: string]: unknown };\nconst normFile = (v: unknown): FileValue | null => {\n if (typeof v === \"string\") return v ? { url: v } : null;\n return isObj(v) && typeof v.url === \"string\" && v.url ? (v as FileValue) : null;\n};\nconst fileFromAsset = (a: KitMediaAsset): FileValue => ({ url: a.url, id: a.id, ...(a.name ? { name: a.name } : {}) });\n\nexport function FileControl({ value, onChange, readOnly, id }: ControlProps) {\n const { s, useAsset, src } = useMedia();\n const v = normFile(value);\n const asset = useAsset({ id: v?.id, url: v?.url ?? \"\" });\n const [picker, setPicker] = React.useState(false);\n const up = useUpload(\"*\", \"file\", (a) => a[0] && onChange(fileFromAsset(a[0])));\n const library = s.MediaPicker && !readOnly ? () => setPicker(true) : undefined;\n const pickerEl = <MediaPicker open={picker} onOpenChange={setPicker} accept={[\"file\"]} onPick={(a) => a[0] && onChange(fileFromAsset(a[0]))} />;\n if (!v)\n return (\n <div className=\"flex flex-col gap-1.5\">\n <DropWell id={id} title=\"Add a file\" hint=\"Or drop or paste one here\" accept=\"*\" icon={<IconFileText stroke={1.5} />} onFiles={up.run} onLibrary={library} refuse={up.setError} disabled={readOnly} progress={up.progress} />\n {up.error ? <Reason>{up.error}</Reason> : null}\n {pickerEl}\n </div>\n );\n const name = asset?.name ?? v.name ?? fileNameFromUrl(v.url);\n const ext = (name.includes(\".\") ? name.split(\".\").pop() : \"\")?.toUpperCase() || \"FILE\";\n const meta = [ext.toLowerCase(), asset?.size ? formatBytes(asset.size) : null].filter(Boolean).join(\" · \");\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-control-bg p-2\">\n <span aria-hidden className=\"flex size-14 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-subtle font-kit-mono text-kit-2xs font-medium text-kit-fg-2\">\n {ext}\n </span>\n <div className=\"min-w-0 flex-1\">\n <a id={id} href={src(v.url)} target=\"_blank\" rel=\"noreferrer\" className=\"block truncate text-kit-sm font-medium text-kit-accent-fg hover:underline\">\n {name}\n </a>\n <div className=\"text-kit-xs text-kit-fg-3\">{meta}</div>\n </div>\n {library ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={library}>\n Replace\n </Button>\n ) : null}\n <Menu>\n <MenuTrigger aria-label=\"File actions\" className=\"flex size-7 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg data-[popup-open]:bg-kit-hover\">\n <IconDots className=\"size-4\" stroke={1.5} aria-hidden />\n </MenuTrigger>\n <MenuContent align=\"end\">\n <MenuItem icon={<IconDownload stroke={1.5} />} onClick={() => window.open(src(v.url), \"_blank\", \"noopener\")}>\n Open\n </MenuItem>\n {readOnly ? null : (\n <>\n <MenuSeparator />\n <MenuItem danger icon={<IconTrash stroke={1.5} />} onClick={() => onChange(null)}>\n Remove\n </MenuItem>\n </>\n )}\n </MenuContent>\n </Menu>\n </div>\n {pickerEl}\n </div>\n );\n}\n\n/* ── Video (paste a URL → preview) ─────────────────────────────────── */\nexport const videoProvider = (url: string) =>\n /youtu/.test(url) ? \"YouTube\" : /vimeo/.test(url) ? \"Vimeo\" : /loom/.test(url) ? \"Loom\" : /\\.(mp4|webm|mov)(\\?|$)/i.test(url) ? \"MP4\" : url ? \"Link\" : \"\";\nexport const youTubeId = (url: string) => url.match(/(?:youtu\\.be\\/|v=|embed\\/|shorts\\/)([\\w-]{11})/)?.[1];\nconst isFileVideo = (url: string) => /\\.(mp4|webm|mov)(\\?|$)/i.test(url);\n\nexport function VideoPreview({ url, poster, title }: { url: string; poster?: string; title: string }) {\n const { src } = useMedia();\n const [playing, setPlaying] = React.useState(false);\n React.useEffect(() => setPlaying(false), [url]);\n const yt = youTubeId(url);\n const thumb = poster ? src(poster) : yt ? `https://i.ytimg.com/vi/${yt}/hqdefault.jpg` : undefined;\n if (playing && yt)\n return <iframe title={title} src={`https://www.youtube-nocookie.com/embed/${yt}?autoplay=1`} allow=\"autoplay; encrypted-media\" className=\"aspect-video w-full rounded-kit-lg border border-kit-line\" />;\n if (playing && isFileVideo(url)) return <video src={src(url)} poster={thumb} controls autoPlay className=\"aspect-video w-full rounded-kit-lg border border-kit-line bg-kit-inverse\" />;\n const playable = !!yt || isFileVideo(url);\n return (\n <div className=\"relative aspect-video overflow-hidden rounded-kit-lg border border-kit-line bg-kit-inverse\">\n {thumb ? <img src={thumb} alt={`${title} poster`} className=\"size-full object-cover opacity-85\" /> : null}\n <button\n type=\"button\"\n aria-label={playable ? \"Play preview\" : \"Open video link\"}\n onClick={() => (playable ? setPlaying(true) : window.open(src(url), \"_blank\", \"noopener\"))}\n className=\"absolute inset-0 m-auto flex size-12 items-center justify-center rounded-full bg-kit-control-bg text-kit-fg shadow-kit-lg transition-transform hover:scale-105\"\n >\n {playable ? <IconPlayerPlay className=\"size-5\" stroke={1.5} aria-hidden /> : <IconExternalLink className=\"size-5\" stroke={1.5} aria-hidden />}\n </button>\n <span className=\"absolute left-2 top-2 inline-flex items-center gap-1 rounded-kit-md bg-kit-inverse/70 px-1.5 py-0.5 text-kit-xs text-kit-fg-inverse\">\n <IconVideo className=\"size-3.5\" stroke={1.5} aria-hidden />\n {videoProvider(url)}\n </span>\n </div>\n );\n}\n\n/**\n * A URL input with a live preview. The value keeps its stored shape: a URL string stays a string, a `{ url, poster… }`\n * object keeps its other keys. What is typed is a draft until it is an address prod stores (http(s) or a site path);\n * until then the field keeps the saved value and says why under the input.\n */\nexport function VideoControl({ field, value, onChange, readOnly, id, onBlur }: ControlProps) {\n const obj = isObj(value) && typeof value.url === \"string\" ? (value as { url: string; poster?: string }) : null;\n const stored = typeof value === \"string\" ? value : (obj?.url ?? \"\");\n const [draft, setDraft] = React.useState(stored);\n const [touched, setTouched] = React.useState(false);\n React.useEffect(() => setDraft(stored), [stored]);\n const commit = (raw: string) => {\n const url = raw.trim();\n if (url === stored || !isVideoUrl(url)) return;\n if (url === \"\") return onChange(obj ? null : \"\");\n onChange(obj ? { ...obj, url } : url);\n };\n const bad = draft.trim() !== \"\" && !isVideoUrl(draft);\n const errorId = `${id}-error`;\n return (\n <div className=\"flex flex-col gap-2\">\n <Input\n id={id}\n value={draft}\n readOnly={readOnly}\n aria-invalid={bad && touched ? true : undefined}\n aria-describedby={bad && touched ? errorId : undefined}\n onBlur={() => {\n setTouched(true);\n onBlur?.();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && draft !== stored) {\n e.stopPropagation();\n setDraft(stored);\n }\n }}\n placeholder=\"Paste a YouTube, Vimeo, Loom or MP4 link\"\n leading={<IconWorld stroke={1.5} />}\n onChange={(e) => {\n setDraft(e.target.value);\n commit(e.target.value);\n }}\n />\n {bad && touched ? (\n <p id={errorId} role=\"alert\" className=\"text-kit-xs text-kit-danger-fg\">\n Not saved: use a full link starting with https://, or a site path starting with /.\n </p>\n ) : null}\n {/* V2 promises \"a poster frame automatically\", which nothing here makes; this note says what is true and, like V2's,\n wraps to two lines at Panel widths (420 and 360) */}\n {stored ? <VideoPreview url={stored} poster={obj?.poster} title={field.title} /> : <p className=\"text-kit-xs text-kit-fg-3\">No video yet. The embed lazy-loads on the page, so it doesn't block the first paint.</p>}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import type { ControlProps } from "../types";
|
|
3
|
+
/** Registered by the choice / scale lane: the control for a number with a scale. */
|
|
4
|
+
export declare const NUMBER_SCALE: {
|
|
5
|
+
control?: ComponentType<ControlProps>;
|
|
6
|
+
};
|
|
7
|
+
export declare const toNum: (v: unknown) => number | null;
|
|
8
|
+
export declare function NumberControl(p: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare function PlainNumber({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
/** Prod's rating scale, from the field's numeric bounds (0 · 5 · 1 unset). */
|
|
11
|
+
export declare function ratingScale(field: ControlProps["field"]): {
|
|
12
|
+
min: number;
|
|
13
|
+
max: number;
|
|
14
|
+
step: number;
|
|
15
|
+
};
|
|
16
|
+
/** A typed rating snapped onto its scale; null when it cannot be (empty, not a number). */
|
|
17
|
+
export declare function snapRating(x: number, { min, max, step }: {
|
|
18
|
+
min: number;
|
|
19
|
+
max: number;
|
|
20
|
+
step: number;
|
|
21
|
+
}): number;
|
|
22
|
+
export declare function RatingControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { useKitEnv } from "../context.js";
|
|
3
|
+
import { Tooltip } from "../ui/overlay.js";
|
|
4
|
+
import { fieldScale } from "../schema/scale.js";
|
|
5
|
+
import { FallbackControl } from "../engine/kit-field.js";
|
|
6
|
+
import { TEXT_FOCUS } from "./text.js";
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { IconStarFilled } from "@tabler/icons-react";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
//#region src/kit/controls/number.tsx
|
|
11
|
+
/**
|
|
12
|
+
* NUMBER — a plain input, NO stepper (prod CPO-068), V2 HEAD 9829bf1 kit/controls/number.tsx, DESIGN §8.4.
|
|
13
|
+
* ↑/↓ step (Shift ×10), the value commits on blur or Enter, clamped to min/max and rounded to the step's precision only when the schema sets a step (V2 rounds to a default step of 1; prod never rounds, so a typed 2.5 stays 2.5);
|
|
14
|
+
* the unit suffix scrubs on drag (Shift ×10); the wheel never changes a value (it blurs).
|
|
15
|
+
* A number with a scale (`field.scale`, or `layout: "slider"` + min/max) is the scale control, which the choice lane
|
|
16
|
+
* registers in NUMBER_SCALE; a host that never registered it edits the raw value (FallbackControl), never a plain box.
|
|
17
|
+
* RATING — stars across the prod scale (config.min 0 · max 5 · step 1 unset) plus a number box for half steps.
|
|
18
|
+
*
|
|
19
|
+
* Stored shapes (prod `number`, `typeof === "number"`): a number, or null when cleared. A rating stays on its scale
|
|
20
|
+
* (ratingToProd refuses anything off it), so the control only ever writes a step of the scale or null.
|
|
21
|
+
*/
|
|
22
|
+
/** Registered by the choice / scale lane: the control for a number with a scale. */
|
|
23
|
+
var NUMBER_SCALE = {};
|
|
24
|
+
var toNum = (v) => typeof v === "number" && Number.isFinite(v) ? v : typeof v === "string" && v.trim() !== "" && Number.isFinite(Number(v)) ? Number(v) : null;
|
|
25
|
+
/** What a keystroke may leave in a number box: an optional minus, digits, one decimal point. */
|
|
26
|
+
var NUMBER_TYPING = /^-?\d*\.?\d*$/;
|
|
27
|
+
var decimals = (n) => (String(n).split(".")[1] ?? "").length;
|
|
28
|
+
function NumberControl(p) {
|
|
29
|
+
if (!fieldScale(p.field)) return /* @__PURE__ */ jsx(PlainNumber, { ...p });
|
|
30
|
+
return /* @__PURE__ */ jsx(NUMBER_SCALE.control ?? FallbackControl, { ...p });
|
|
31
|
+
}
|
|
32
|
+
function PlainNumber({ field, value, onChange, readOnly, id, invalid, onBlur }) {
|
|
33
|
+
const { variant } = useKitEnv();
|
|
34
|
+
const n = toNum(value);
|
|
35
|
+
const step = field.numeric?.step && field.numeric.step > 0 ? field.numeric.step : 1;
|
|
36
|
+
const lo = field.numeric?.min ?? -Infinity;
|
|
37
|
+
const hi = field.numeric?.max ?? Infinity;
|
|
38
|
+
const setStep = !!field.numeric?.step && field.numeric.step > 0;
|
|
39
|
+
const clamp = (x, from) => {
|
|
40
|
+
const precision = setStep ? decimals(step) : from == null ? null : Math.max(decimals(step), decimals(from));
|
|
41
|
+
return Math.min(hi, Math.max(lo, precision == null ? x : Number(x.toFixed(precision))));
|
|
42
|
+
};
|
|
43
|
+
const [draft, setDraft] = React.useState(null);
|
|
44
|
+
const start = React.useRef(null);
|
|
45
|
+
const unit = field.numeric?.unit;
|
|
46
|
+
const commit = () => {
|
|
47
|
+
if (draft !== null) {
|
|
48
|
+
const t = draft.trim();
|
|
49
|
+
const x = Number(t);
|
|
50
|
+
if (t === "") onChange(null);
|
|
51
|
+
else if (t !== "-" && t !== "." && Number.isFinite(x)) onChange(clamp(x));
|
|
52
|
+
}
|
|
53
|
+
setDraft(null);
|
|
54
|
+
};
|
|
55
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
56
|
+
"data-slot": "kit-number",
|
|
57
|
+
className: cn("flex w-full max-w-40 items-center rounded-kit-md border border-kit-field-border bg-kit-field-bg shadow-kit-field transition-colors hover:border-kit-field-border-hover focus-within:border-kit-field-border-focus", variant === "document" ? "h-9" : "h-8", invalid && "border-[var(--kit-field-invalid)] hover:border-[var(--kit-field-invalid)]", readOnly && "opacity-80"),
|
|
58
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
59
|
+
id,
|
|
60
|
+
inputMode: "decimal",
|
|
61
|
+
value: draft ?? (n == null ? "" : String(n)),
|
|
62
|
+
readOnly,
|
|
63
|
+
"aria-invalid": invalid,
|
|
64
|
+
placeholder: field.placeholder ?? "0",
|
|
65
|
+
onWheel: (e) => e.currentTarget.blur(),
|
|
66
|
+
onChange: (e) => NUMBER_TYPING.test(e.target.value) && setDraft(e.target.value),
|
|
67
|
+
onBlur: () => {
|
|
68
|
+
commit();
|
|
69
|
+
onBlur?.();
|
|
70
|
+
},
|
|
71
|
+
onKeyDown: (e) => {
|
|
72
|
+
if (readOnly) return;
|
|
73
|
+
if (e.key === "Enter") e.currentTarget.blur();
|
|
74
|
+
if (e.key === "Escape" && draft !== null) {
|
|
75
|
+
e.stopPropagation();
|
|
76
|
+
setDraft(null);
|
|
77
|
+
}
|
|
78
|
+
if (e.key === "ArrowUp" || e.key === "ArrowDown") {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
const base = draft !== null && Number.isFinite(Number(draft)) && draft.trim() !== "" ? Number(draft) : n ?? 0;
|
|
81
|
+
const d = (e.key === "ArrowUp" ? 1 : -1) * step * (e.shiftKey ? 10 : 1);
|
|
82
|
+
setDraft(null);
|
|
83
|
+
onChange(clamp(base + d, base));
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
className: cn(TEXT_FOCUS, "h-full min-w-0 flex-1 bg-transparent px-2.5 text-kit-sm tabular-nums text-kit-fg outline-none placeholder:text-kit-fg-4")
|
|
87
|
+
}), unit ? /* @__PURE__ */ jsx(Tooltip, {
|
|
88
|
+
content: readOnly ? void 0 : "Drag to adjust · Shift for ×10",
|
|
89
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
90
|
+
"data-slot": "kit-number-unit",
|
|
91
|
+
onPointerDown: (e) => {
|
|
92
|
+
if (readOnly) return;
|
|
93
|
+
e.currentTarget.setPointerCapture?.(e.pointerId);
|
|
94
|
+
start.current = {
|
|
95
|
+
x: e.clientX,
|
|
96
|
+
v: n ?? 0
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
onPointerMove: (e) => {
|
|
100
|
+
if (!start.current) return;
|
|
101
|
+
const dx = e.clientX - start.current.x;
|
|
102
|
+
const next = clamp(start.current.v + Math.round(dx / 4) * step * (e.shiftKey ? 10 : 1), start.current.v);
|
|
103
|
+
if (next !== n) onChange(next);
|
|
104
|
+
},
|
|
105
|
+
onPointerUp: () => start.current = null,
|
|
106
|
+
onPointerCancel: () => start.current = null,
|
|
107
|
+
className: cn("flex h-full select-none items-center pl-1 pr-2.5 text-kit-xs text-kit-fg-3", !readOnly && "cursor-ew-resize hover:text-kit-fg"),
|
|
108
|
+
children: unit
|
|
109
|
+
})
|
|
110
|
+
}) : null]
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** Prod's rating scale, from the field's numeric bounds (0 · 5 · 1 unset). */
|
|
114
|
+
function ratingScale(field) {
|
|
115
|
+
return {
|
|
116
|
+
min: field.numeric?.min ?? 0,
|
|
117
|
+
max: field.numeric?.max ?? 5,
|
|
118
|
+
step: field.numeric?.step && field.numeric.step > 0 ? field.numeric.step : 1
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/** A typed rating snapped onto its scale; null when it cannot be (empty, not a number). */
|
|
122
|
+
function snapRating(x, { min, max, step }) {
|
|
123
|
+
const snapped = min + Math.round((x - min) / step) * step;
|
|
124
|
+
return Number(Math.min(max, Math.max(min, snapped)).toFixed(decimals(step)));
|
|
125
|
+
}
|
|
126
|
+
function RatingControl({ field, value, onChange, readOnly, id, invalid, onBlur }) {
|
|
127
|
+
const scale = ratingScale(field);
|
|
128
|
+
const stars = Math.max(1, Math.min(10, Math.ceil(scale.max)));
|
|
129
|
+
const n = toNum(value);
|
|
130
|
+
const [hover, setHover] = React.useState(null);
|
|
131
|
+
const [draft, setDraft] = React.useState(null);
|
|
132
|
+
const shown = hover ?? n ?? 0;
|
|
133
|
+
const commit = () => {
|
|
134
|
+
if (draft !== null) {
|
|
135
|
+
const t = draft.trim();
|
|
136
|
+
if (t === "") onChange(null);
|
|
137
|
+
else if (Number.isFinite(Number(t)) && t !== ".") onChange(snapRating(Number(t), scale));
|
|
138
|
+
}
|
|
139
|
+
setDraft(null);
|
|
140
|
+
};
|
|
141
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
142
|
+
className: "flex items-center gap-3",
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsx("div", {
|
|
145
|
+
role: "radiogroup",
|
|
146
|
+
"aria-label": `${field.title} rating`,
|
|
147
|
+
className: "flex items-center",
|
|
148
|
+
onMouseLeave: () => setHover(null),
|
|
149
|
+
children: Array.from({ length: stars }, (_, k) => k + 1).map((i) => {
|
|
150
|
+
const fill = Math.max(0, Math.min(1, shown - (i - 1)));
|
|
151
|
+
const pick = snapRating(i, scale);
|
|
152
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
153
|
+
type: "button",
|
|
154
|
+
role: "radio",
|
|
155
|
+
"aria-checked": n != null && Math.ceil(n) === i,
|
|
156
|
+
"aria-label": `${i} star${i > 1 ? "s" : ""}`,
|
|
157
|
+
disabled: readOnly,
|
|
158
|
+
onMouseEnter: () => setHover(i),
|
|
159
|
+
onClick: () => onChange(pick),
|
|
160
|
+
className: "relative flex size-7 items-center justify-center transition-transform hover:scale-110 disabled:hover:scale-100",
|
|
161
|
+
children: [/* @__PURE__ */ jsx(IconStarFilled, { className: "size-[18px] text-kit-line-strong" }), /* @__PURE__ */ jsx("span", {
|
|
162
|
+
className: "absolute inset-0 flex items-center justify-center overflow-hidden",
|
|
163
|
+
style: { clipPath: `inset(0 ${100 - fill * 100}% 0 0)` },
|
|
164
|
+
children: /* @__PURE__ */ jsx(IconStarFilled, { className: "size-[18px] text-kit-warning" })
|
|
165
|
+
})]
|
|
166
|
+
}, i);
|
|
167
|
+
})
|
|
168
|
+
}),
|
|
169
|
+
/* @__PURE__ */ jsx("input", {
|
|
170
|
+
id,
|
|
171
|
+
inputMode: "decimal",
|
|
172
|
+
value: draft ?? (n == null ? "" : String(n)),
|
|
173
|
+
readOnly,
|
|
174
|
+
"aria-invalid": invalid,
|
|
175
|
+
placeholder: "–",
|
|
176
|
+
onWheel: (e) => e.currentTarget.blur(),
|
|
177
|
+
onChange: (e) => /^\d*\.?\d*$/.test(e.target.value) && setDraft(e.target.value),
|
|
178
|
+
onBlur: () => {
|
|
179
|
+
commit();
|
|
180
|
+
onBlur?.();
|
|
181
|
+
},
|
|
182
|
+
onKeyDown: (e) => e.key === "Enter" && e.currentTarget.blur(),
|
|
183
|
+
className: cn(TEXT_FOCUS, "h-7 w-12 rounded-kit-md border border-kit-field-border bg-kit-field-bg px-2 text-kit-sm tabular-nums text-kit-fg shadow-kit-field outline-none hover:border-kit-field-border-hover focus:border-kit-field-border-focus aria-[invalid=true]:border-[var(--kit-field-invalid)]")
|
|
184
|
+
}),
|
|
185
|
+
/* @__PURE__ */ jsxs("span", {
|
|
186
|
+
className: "text-kit-xs text-kit-fg-3",
|
|
187
|
+
children: ["out of ", scale.max]
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
//#endregion
|
|
193
|
+
export { NUMBER_SCALE, NumberControl, RatingControl };
|
|
194
|
+
|
|
195
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.js","names":[],"sources":["../../src/kit/controls/number.tsx"],"sourcesContent":["/**\n * NUMBER — a plain input, NO stepper (prod CPO-068), V2 HEAD 9829bf1 kit/controls/number.tsx, DESIGN §8.4.\n * ↑/↓ step (Shift ×10), the value commits on blur or Enter, clamped to min/max and rounded to the step's precision only when the schema sets a step (V2 rounds to a default step of 1; prod never rounds, so a typed 2.5 stays 2.5);\n * the unit suffix scrubs on drag (Shift ×10); the wheel never changes a value (it blurs).\n * A number with a scale (`field.scale`, or `layout: \"slider\"` + min/max) is the scale control, which the choice lane\n * registers in NUMBER_SCALE; a host that never registered it edits the raw value (FallbackControl), never a plain box.\n * RATING — stars across the prod scale (config.min 0 · max 5 · step 1 unset) plus a number box for half steps.\n *\n * Stored shapes (prod `number`, `typeof === \"number\"`): a number, or null when cleared. A rating stays on its scale\n * (ratingToProd refuses anything off it), so the control only ever writes a step of the scale or null.\n */\nimport * as React from \"react\";\nimport type { ComponentType } from \"react\";\nimport { IconStarFilled } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { useKitEnv } from \"../context\";\nimport { fieldScale } from \"../schema/scale\";\nimport { FallbackControl } from \"../engine/kit-field\";\nimport { Tooltip } from \"../ui/overlay\";\nimport type { ControlProps } from \"../types\";\nimport { TEXT_FOCUS } from \"./text\";\n\n/** Registered by the choice / scale lane: the control for a number with a scale. */\nexport const NUMBER_SCALE: { control?: ComponentType<ControlProps> } = {};\n\nexport const toNum = (v: unknown): number | null =>\n typeof v === \"number\" && Number.isFinite(v) ? v : typeof v === \"string\" && v.trim() !== \"\" && Number.isFinite(Number(v)) ? Number(v) : null;\n/** What a keystroke may leave in a number box: an optional minus, digits, one decimal point. */\nconst NUMBER_TYPING = /^-?\\d*\\.?\\d*$/;\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\n\nexport function NumberControl(p: ControlProps) {\n if (!fieldScale(p.field)) return <PlainNumber {...p} />;\n const Scale = NUMBER_SCALE.control ?? FallbackControl;\n return <Scale {...p} />;\n}\n\nexport function PlainNumber({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps) {\n const { variant } = useKitEnv();\n const n = toNum(value);\n const step = field.numeric?.step && field.numeric.step > 0 ? field.numeric.step : 1;\n const lo = field.numeric?.min ?? -Infinity;\n const hi = field.numeric?.max ?? Infinity;\n /* Round to the step only when the schema sets one: with no step a typed 2.5 stays 2.5 (prod NumberField never rounds).\n The rounding then only trims float noise from ↑/↓ (2.5 + 1 → 3.5, 0.1 + 0.2 → 0.3). */\n const setStep = !!field.numeric?.step && field.numeric.step > 0;\n const clamp = (x: number, from?: number) => {\n const precision = setStep ? decimals(step) : from == null ? null : Math.max(decimals(step), decimals(from));\n return Math.min(hi, Math.max(lo, precision == null ? x : Number(x.toFixed(precision))));\n };\n const [draft, setDraft] = React.useState<string | null>(null);\n const start = React.useRef<{ x: number; v: number } | null>(null);\n const unit = field.numeric?.unit;\n const commit = () => {\n if (draft !== null) {\n const t = draft.trim();\n const x = Number(t);\n if (t === \"\") onChange(null);\n else if (t !== \"-\" && t !== \".\" && Number.isFinite(x)) onChange(clamp(x));\n }\n setDraft(null);\n };\n return (\n <div\n data-slot=\"kit-number\"\n className={cn(\n \"flex w-full max-w-40 items-center rounded-kit-md border border-kit-field-border bg-kit-field-bg shadow-kit-field transition-colors hover:border-kit-field-border-hover focus-within:border-kit-field-border-focus\",\n variant === \"document\" ? \"h-9\" : \"h-8\",\n invalid && \"border-[var(--kit-field-invalid)] hover:border-[var(--kit-field-invalid)]\",\n readOnly && \"opacity-80\",\n )}\n >\n <input\n id={id}\n inputMode=\"decimal\"\n value={draft ?? (n == null ? \"\" : String(n))}\n readOnly={readOnly}\n aria-invalid={invalid}\n placeholder={field.placeholder ?? \"0\"}\n onWheel={(e) => e.currentTarget.blur()}\n onChange={(e) => NUMBER_TYPING.test(e.target.value) && setDraft(e.target.value)}\n onBlur={() => {\n commit();\n onBlur?.();\n }}\n onKeyDown={(e) => {\n if (readOnly) return;\n if (e.key === \"Enter\") e.currentTarget.blur();\n if (e.key === \"Escape\" && draft !== null) {\n e.stopPropagation();\n setDraft(null);\n }\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const base = draft !== null && Number.isFinite(Number(draft)) && draft.trim() !== \"\" ? Number(draft) : (n ?? 0);\n const d = (e.key === \"ArrowUp\" ? 1 : -1) * step * (e.shiftKey ? 10 : 1);\n setDraft(null);\n onChange(clamp(base + d, base));\n }\n }}\n className={cn(TEXT_FOCUS, \"h-full min-w-0 flex-1 bg-transparent px-2.5 text-kit-sm tabular-nums text-kit-fg outline-none placeholder:text-kit-fg-4\")}\n />\n {unit ? (\n <Tooltip content={readOnly ? undefined : \"Drag to adjust · Shift for ×10\"}>\n <span\n data-slot=\"kit-number-unit\"\n onPointerDown={(e) => {\n if (readOnly) return;\n e.currentTarget.setPointerCapture?.(e.pointerId);\n start.current = { x: e.clientX, v: n ?? 0 };\n }}\n onPointerMove={(e) => {\n if (!start.current) return;\n const dx = e.clientX - start.current.x;\n const next = clamp(start.current.v + Math.round(dx / 4) * step * (e.shiftKey ? 10 : 1), start.current.v);\n if (next !== n) onChange(next);\n }}\n onPointerUp={() => (start.current = null)}\n onPointerCancel={() => (start.current = null)}\n className={cn(\"flex h-full select-none items-center pl-1 pr-2.5 text-kit-xs text-kit-fg-3\", !readOnly && \"cursor-ew-resize hover:text-kit-fg\")}\n >\n {unit}\n </span>\n </Tooltip>\n ) : null}\n </div>\n );\n}\n\n/** Prod's rating scale, from the field's numeric bounds (0 · 5 · 1 unset). */\nexport function ratingScale(field: ControlProps[\"field\"]) {\n const min = field.numeric?.min ?? 0;\n const max = field.numeric?.max ?? 5;\n const step = field.numeric?.step && field.numeric.step > 0 ? field.numeric.step : 1;\n return { min, max, step };\n}\n/** A typed rating snapped onto its scale; null when it cannot be (empty, not a number). */\nexport function snapRating(x: number, { min, max, step }: { min: number; max: number; step: number }): number {\n const snapped = min + Math.round((x - min) / step) * step;\n return Number(Math.min(max, Math.max(min, snapped)).toFixed(decimals(step)));\n}\n\nexport function RatingControl({ field, value, onChange, readOnly, id, invalid, onBlur }: ControlProps) {\n const scale = ratingScale(field);\n const stars = Math.max(1, Math.min(10, Math.ceil(scale.max)));\n const n = toNum(value);\n const [hover, setHover] = React.useState<number | null>(null);\n const [draft, setDraft] = React.useState<string | null>(null);\n const shown = hover ?? n ?? 0;\n const commit = () => {\n if (draft !== null) {\n const t = draft.trim();\n if (t === \"\") onChange(null);\n else if (Number.isFinite(Number(t)) && t !== \".\") onChange(snapRating(Number(t), scale));\n }\n setDraft(null);\n };\n return (\n <div className=\"flex items-center gap-3\">\n <div role=\"radiogroup\" aria-label={`${field.title} rating`} className=\"flex items-center\" onMouseLeave={() => setHover(null)}>\n {Array.from({ length: stars }, (_, k) => k + 1).map((i) => {\n const fill = Math.max(0, Math.min(1, shown - (i - 1)));\n const pick = snapRating(i, scale);\n return (\n <button\n key={i}\n type=\"button\"\n role=\"radio\"\n aria-checked={n != null && Math.ceil(n) === i}\n aria-label={`${i} star${i > 1 ? \"s\" : \"\"}`}\n disabled={readOnly}\n onMouseEnter={() => setHover(i)}\n onClick={() => onChange(pick)}\n className=\"relative flex size-7 items-center justify-center transition-transform hover:scale-110 disabled:hover:scale-100\"\n >\n <IconStarFilled className=\"size-[18px] text-kit-line-strong\" />\n <span className=\"absolute inset-0 flex items-center justify-center overflow-hidden\" style={{ clipPath: `inset(0 ${100 - fill * 100}% 0 0)` }}>\n <IconStarFilled className=\"size-[18px] text-kit-warning\" />\n </span>\n </button>\n );\n })}\n </div>\n <input\n id={id}\n inputMode=\"decimal\"\n value={draft ?? (n == null ? \"\" : String(n))}\n readOnly={readOnly}\n aria-invalid={invalid}\n placeholder=\"–\"\n onWheel={(e) => e.currentTarget.blur()}\n onChange={(e) => /^\\d*\\.?\\d*$/.test(e.target.value) && setDraft(e.target.value)}\n onBlur={() => {\n commit();\n onBlur?.();\n }}\n onKeyDown={(e) => e.key === \"Enter\" && e.currentTarget.blur()}\n className={cn(\n TEXT_FOCUS,\n \"h-7 w-12 rounded-kit-md border border-kit-field-border bg-kit-field-bg px-2 text-kit-sm tabular-nums text-kit-fg shadow-kit-field outline-none hover:border-kit-field-border-hover focus:border-kit-field-border-focus aria-[invalid=true]:border-[var(--kit-field-invalid)]\",\n )}\n />\n <span className=\"text-kit-xs text-kit-fg-3\">out of {scale.max}</span>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ARRAY_CONTROLS } from "../engine/array.js";
|
|
2
|
+
import { CONTROLS } from "../engine/kit-field.js";
|
|
3
|
+
import { ReferenceControl, ReferencesControl } from "./reference.js";
|
|
4
|
+
//#region src/kit/controls/reference-register.ts
|
|
5
|
+
/** Lane C4: the reference controls in the engine's dispatch tables (one line per type; merge with other lanes by line). */
|
|
6
|
+
CONTROLS.reference = ReferenceControl;
|
|
7
|
+
ARRAY_CONTROLS.references = ReferencesControl;
|
|
8
|
+
//#endregion
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=reference-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-register.js","names":[],"sources":["../../src/kit/controls/reference-register.ts"],"sourcesContent":["/** Lane C4: the reference controls in the engine's dispatch tables (one line per type; merge with other lanes by line). */\nimport { CONTROLS } from \"../engine/kit-field\";\nimport { ARRAY_CONTROLS } from \"../engine/array\";\nimport { ReferenceControl, ReferencesControl } from \"./reference\";\n\nCONTROLS.reference = ReferenceControl;\nARRAY_CONTROLS.references = ReferencesControl;\n"],"mappings":";;;;;AAKA,SAAS,YAAY;AACrB,eAAe,aAAa"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reference services the reference and multi-reference controls read (lane C4), declared as an augmentation of
|
|
3
|
+
* KitServices so context.tsx stays untouched by this lane. The host implements them over the real API:
|
|
4
|
+
*
|
|
5
|
+
* searchReferences → POST /content/reference-options (entries of the target models, then pages, forms, collections,
|
|
6
|
+
* each kept only when it passes the field's filter; `truncated` when the filter scan stopped early)
|
|
7
|
+
* lookupReferences → the stored ids read back by id (entry / page / form / collection), so a chosen value shows its
|
|
8
|
+
* title, and a deleted one shows as Missing
|
|
9
|
+
* createReference → only where a real create path exists (a draft entry in one model); absent hides "Create new"
|
|
10
|
+
*
|
|
11
|
+
* Each rejects with an Error whose message is the reason in words (the backend's named code included); the control
|
|
12
|
+
* shows it in place.
|
|
13
|
+
*/
|
|
14
|
+
/** "shopify": a V2 target with no integration in prod (the backend refuses it by name, reference_target_unsupported);
|
|
15
|
+
* a host that does hold such records (the /style-guide/kit sandbox's V2 demo products) hands them back as this kind. */
|
|
16
|
+
export type KitReferenceKind = "entry" | "page" | "form" | "collection" | "shopify";
|
|
17
|
+
export interface KitReferenceOption {
|
|
18
|
+
id: string;
|
|
19
|
+
kind: KitReferenceKind;
|
|
20
|
+
title: string;
|
|
21
|
+
/** "{Model} · {slug}" for an entry, the slug for a page */
|
|
22
|
+
subtitle?: string | null;
|
|
23
|
+
status?: string | null;
|
|
24
|
+
/** an entry's model (its slug): "Open {title}" hands it to the host's stacked editor */
|
|
25
|
+
modelSlug?: string;
|
|
26
|
+
/** a person's photo (an author entry's avatar), drawn as the row's round thumbnail; absent → the kind's icon */
|
|
27
|
+
photo?: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface KitReferenceQuery {
|
|
30
|
+
/** the field's `reference.to`: entry model ids or slugs, and "page" / "form" / "collection" */
|
|
31
|
+
to: string[];
|
|
32
|
+
filter?: string;
|
|
33
|
+
q: string;
|
|
34
|
+
limit: number;
|
|
35
|
+
/** the document being edited, never listed */
|
|
36
|
+
excludeId?: string;
|
|
37
|
+
signal?: AbortSignal;
|
|
38
|
+
}
|
|
39
|
+
declare module "../context" {
|
|
40
|
+
interface KitServices {
|
|
41
|
+
searchReferences?: (query: KitReferenceQuery) => Promise<{
|
|
42
|
+
options: KitReferenceOption[];
|
|
43
|
+
truncated: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
/** The options for these ids, in any order; an id it cannot find is left out (the control shows it as Missing). */
|
|
46
|
+
lookupReferences?: (ids: string[], to: string[]) => Promise<KitReferenceOption[]>;
|
|
47
|
+
/** Create a draft in the one entry model `to` names and hand back its option. */
|
|
48
|
+
createReference?: (req: {
|
|
49
|
+
to: string;
|
|
50
|
+
title: string;
|
|
51
|
+
}) => Promise<KitReferenceOption>;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { KitReferenceOption } from "./reference-services";
|
|
2
|
+
import type { ControlProps } from "../types";
|
|
3
|
+
/** The noun the picker uses (D48: "CMS item" where V2 says "entry"). */
|
|
4
|
+
export declare function referenceNoun(to: string[]): string;
|
|
5
|
+
export declare function RefThumb({ o, size }: {
|
|
6
|
+
o: Pick<KitReferenceOption, "kind" | "title" | "photo"> | null;
|
|
7
|
+
size?: number;
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
/**
|
|
10
|
+
* The records behind `ids`, read once per id through `lookupReferences`. An id the service does not hand back is
|
|
11
|
+
* `missing`; a failed read is `error` (in words). A row picked in the picker is `remember`ed, so it shows at once.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useReferenceRecords(ids: string[], to: string[]): {
|
|
14
|
+
known: Record<string, KitReferenceOption>;
|
|
15
|
+
missing: ReadonlySet<string>;
|
|
16
|
+
loading: boolean;
|
|
17
|
+
error: string | null;
|
|
18
|
+
remember: (o: KitReferenceOption) => void;
|
|
19
|
+
canLookup: boolean;
|
|
20
|
+
};
|
|
21
|
+
export declare function ReferenceControl({ field, value, onChange, readOnly, id }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
/** Multi-reference: an array of reference ids. `field` is the ARRAY field; the engine hands it the item's `reference`. */
|
|
23
|
+
export declare function ReferencesControl({ field, value, onChange, readOnly, id }: ControlProps): import("react/jsx-runtime").JSX.Element;
|