@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":"path-crumbs.js","names":[],"sources":["../../src/kit/ui/path-crumbs.tsx"],"sourcesContent":["/**\n * PATH CRUMBS (CPO D38): the one breadcrumb for every drill-in path: Visuals inspector, Block Kit drill-in,\n * nested documents, media details, the workspace top bar.\n *\n * <PathCrumbs items={[{ id, label, icon, onSelect }, …, current]} />\n *\n * Look (D38 v3): ancestors fg-3 with an invisible 4px-radius pill that appears on hover (bg-hover) and darkens while\n * pressed (bg-selected); the current item is fg/semibold with its icon, NO box; thin fg-4 chevrons flush between pills (6px from text);\n * the fold chip is a ghost crumb (\"Columns… +2 ⌄\") whose open state is bg-selected; keyboard-only neutral focus ring.\n *\n * Back (←) and current never collapse, and every visible crumb keeps READABLE TEXT (no icon-only crumbs). The trail\n * adapts to the width it ACTUALLY has (ResizeObserver on the nav + document.fonts.ready, not viewport breakpoints),\n * using space greedily; the first plan that fits wins:\n *\n * stage 0 everything at full length\n * stage 1 long labels shorten to their first words (~16ch, word boundary: \"Seasoning & care…\", \"Columns…\"):\n * middle items root side first, then the parent, then the root\n * stage 2 the middle folds, root side first, into ONE readable chip \"[▦] Columns… +2\" (its first folded level +\n * the count) that opens the Pathway popover; the immediate parent stays out of the fold\n * stage 3 the root joins the fold, then (last) the parent\n * last the current item middle-truncates (\"Seasoning…ail kit\"), full name in a tooltip\n *\n * Every variant is measured once in a hidden mirror and the stage is picked in a layout effect, so the first paint\n * is already right (no flicker, no layout jump). The Pathway popover lists the whole path as an indented tree\n * (↑↓ · Enter · Esc, focus returns to the chip). Siblings menus on crumbs were considered and left out (D6 calm).\n *\n * Links: a crumb with `to` renders through `linkAs` (default: a plain <a href>), so a host can pass its router's Link.\n */\nimport * as React from \"react\";\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport { IconArrowLeft, IconChevronDown, IconChevronRight } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { IconButton } from \"./button\";\nimport { Menu, MenuContent, MenuTrigger, Tooltip } from \"./overlay\";\n\n/* ── Metrics: one 2/4/6/8 scale, two densities ─────────────────────────────────────────────\n * row text pill (h · px) icon gap separator back\n * sm 28 13/20 24 · 6 14 6 12 chevron (6 to text) 28\n * md 32 14/20 28 · 8 16 6 14 chevron (8 to text) 32\n * The chevron sits flush between pills, so the text-to-chevron distance IS the pill padding (one number to tune).\n * The pill is invisible at rest; hover = bg-hover, pressed = bg-selected, radius 4. Hit areas ≥ 24px. */\nconst METRICS = {\n sm: { row: \"h-7\", text: \"text-[13px] leading-5\", pill: \"h-6 px-1.5\", cur: \"pr-0.5\", gap: \"gap-1.5\", icon: \"[&_svg]:size-3.5\", sep: \"size-3\", back: \"sm\" as const },\n md: { row: \"h-8\", text: \"text-[14px] leading-5\", pill: \"h-7 px-2\", cur: \"pr-0.5\", gap: \"gap-1.5\", icon: \"[&_svg]:size-4\", sep: \"size-3.5\", back: \"md\" as const },\n};\n/** Ancestor / group pill: fg-3 at rest, a quiet pill on hover, darker while pressed, fg-4 + inert when it can't navigate. */\nconst PILL =\n \"inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-kit-sm text-kit-fg-3 transition-colors duration-100 hover:bg-kit-hover hover:text-kit-fg active:bg-kit-selected disabled:pointer-events-none disabled:text-kit-fg-4\";\n\nexport interface PathCrumb {\n /** stable key */\n id: string;\n label: string;\n /** type icon (16px glyph; sized by the crumb) */\n icon?: React.ReactNode;\n /** navigate here (ignored on the current item) */\n onSelect?: () => void;\n /** …or a link (rendered through PathCrumbs `linkAs`) */\n to?: string;\n /** a meaningful container (a block, a folder): may name the collapsed group (\"Columns +2\") */\n container?: boolean;\n /** red dot: something under this level has errors */\n errors?: number;\n}\n\nexport type PathCrumbLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & { to: string; ref?: React.Ref<HTMLAnchorElement> };\n\nfunction DefaultLink({ to, ...props }: PathCrumbLinkProps) {\n return <a href={to} {...props} />;\n}\n\nexport interface PathCrumbsProps {\n /** root → current; the last item is the current one */\n items: PathCrumb[];\n /** ← goes up one level. Default: the parent's onSelect/to. `false` hides it (top-bar style). */\n onBack?: (() => void) | false;\n /** tooltip/aria for ←, default \"Back to {parent}\" */\n backLabel?: string;\n /** a key hint in the ← tooltip, shown only while keyboard hints are on (D44) */\n backShortcut?: string;\n /** @deprecated (D38 v3): the current item is always text: weight + colour, never a box. Kept for call-site compat. */\n current?: \"chip\" | \"text\";\n /** nav aria-label */\n label?: string;\n size?: \"sm\" | \"md\";\n /** renders crumbs that have `to` (a router Link); must forward its ref and spread props. Default: <a href> */\n linkAs?: React.ComponentType<PathCrumbLinkProps>;\n className?: string;\n}\n\n/** Word-boundary shortening: the first 2–3 words that fit ~16ch (\"Seasoning & care kit\" → \"Seasoning & care…\",\n * \"Columns / Bento\" → \"Columns…\"). Never mid-word unless a single word is itself too long. */\nconst isJoiner = (w: string) => /^[/&·\\-–—|:,+]+$/.test(w);\nexport function clipWords(s: string, max = 16): string {\n const words = s.trim().split(/\\s+/);\n if (s.length <= 12 && words.length <= 2) return s;\n const out: string[] = [];\n for (let i = 0; i < words.length - 1; i++) {\n const next = [...out, words[i]].join(\" \");\n if (next.length > max) break;\n out.push(words[i]);\n }\n while (out.length && isJoiner(out[out.length - 1])) out.pop();\n if (!out.length) return words[0].length > max ? `${words[0].slice(0, max - 2)}…` : `${words[0]}…`;\n return `${out.join(\" \")}…`;\n}\nconst long = (s: string) => clipWords(s) !== s;\nconst clip = (s: string) => clipWords(s);\n\ntype Form = \"full\" | \"trunc\";\ntype Group = { start: number; end: number };\ntype Plan = { forms: Form[]; group: Group | null };\n\n/** Degradation order: the first plan that fits wins. Every visible crumb keeps readable text (no icon-only crumbs). */\nexport function plansFor(items: PathCrumb[]): Plan[] {\n const n = items.length;\n const plans: Plan[] = [];\n const forms: Form[] = items.map(() => \"full\");\n const push = (group: Group | null = null) => plans.push({ forms: [...forms], group: group ? { ...group } : null });\n push();\n if (n < 2) return plans;\n const parent = n - 2;\n const middle = Array.from({ length: Math.max(0, n - 2) }, (_, k) => k + 1); // 1 … n-2, root side first\n // 1 · long labels shorten to their first words: middle items root side first, then the parent, then the root\n for (const i of middle) if (i !== parent && long(items[i].label)) { forms[i] = \"trunc\"; push(); }\n if (parent >= 1 && long(items[parent].label)) { forms[parent] = \"trunc\"; push(); }\n if (long(items[0].label)) { forms[0] = \"trunc\"; push(); }\n // 2 · the middle folds, root side first, into ONE readable chip (\"Columns… +2\"); the parent stays out of it\n for (let end = 1; end <= parent - 1; end++) push({ start: 1, end });\n // 3 · the root joins the fold, then (last) the parent\n if (parent >= 1) push({ start: 0, end: parent - 1 });\n push({ start: 0, end: parent });\n return plans;\n}\n\n/** Keep the head and the tail: \"Seasoning wax & chainmail kit\" → \"Seasoning…mail kit\". */\nexport function middleEllipsis(text: string, maxPx: number, measure: (s: string) => number) {\n if (measure(text) <= maxPx) return text;\n let lo = 2;\n let hi = text.length - 1;\n let best = \"\";\n while (lo <= hi) {\n const keep = (lo + hi) >> 1;\n const head = Math.ceil(keep * 0.6);\n const s = `${text.slice(0, head).trimEnd()}…${text.slice(text.length - (keep - head)).trimStart()}`;\n if (measure(s) <= maxPx) { best = s; lo = keep + 1; } else hi = keep - 1;\n }\n return best || null;\n}\n\nlet canvas: HTMLCanvasElement | null = null;\nfunction textMeasurer(el: Element | null) {\n if (!el) return null;\n canvas ??= document.createElement(\"canvas\");\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n return null; // no canvas (test DOM): skip the last-resort truncation\n }\n if (!ctx) return null;\n const cs = getComputedStyle(el);\n ctx.font = `${cs.fontStyle} ${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`;\n return (s: string) => ctx.measureText(s).width;\n}\n\nexport function PathCrumbs({ items, onBack, backLabel, backShortcut, label = \"Breadcrumb\", size = \"sm\", linkAs: Link = DefaultLink, className }: PathCrumbsProps) {\n const n = items.length;\n const parent = n > 1 ? items[n - 2] : undefined;\n const back = onBack === false ? undefined : onBack ?? (parent ? () => go(parent) : undefined);\n const sig = items.map((i) => `${i.id}\\u0001${i.label}\\u0001${i.icon ? 1 : 0}\\u0001${i.errors ? 1 : 0}\\u0001${i.container ? 1 : 0}`).join(\"\\u0002\");\n const plans = React.useMemo(() => plansFor(items), [sig]); // eslint-disable-line react-hooks/exhaustive-deps\n const navRef = React.useRef<HTMLElement>(null);\n const mirrorRef = React.useRef<HTMLDivElement>(null);\n const backRef = React.useRef<HTMLDivElement>(null);\n const [fit, setFit] = React.useState<{ plan: number; currentText: string | null }>({ plan: 0, currentText: null });\n\n const measure = React.useCallback(() => {\n const nav = navRef.current;\n const mirror = mirrorRef.current;\n if (!nav || !mirror) return;\n // layout widths, not painted ones: an ancestor mid-animation (scale / pop-in) must not skew the fit\n const rect = nav.getBoundingClientRect().width;\n const scale = nav.offsetWidth && rect ? rect / nav.offsetWidth : 1;\n const w = (key: string) => (mirror.querySelector<HTMLElement>(`[data-m=\"${key}\"]`)?.getBoundingClientRect().width ?? 0) / scale;\n const avail = nav.clientWidth - (backRef.current ? backRef.current.getBoundingClientRect().width / scale : 0) - 0.5;\n const sep = w(\"sep\");\n const cur = w(\"cur\");\n const widthOf = (p: Plan) => {\n const parts: number[] = [];\n if (n > 1) {\n const gk = (g: Group) => `g:${g.start}:${g.end}`;\n if (p.group?.start === 0) parts.push(w(gk(p.group)));\n else {\n parts.push(w(`0:${p.forms[0]}`));\n if (p.group) parts.push(w(gk(p.group)));\n }\n for (let i = 1; i < n - 1; i++) if (!p.group || i > p.group.end) parts.push(w(`${i}:${p.forms[i]}`));\n }\n parts.push(cur);\n return parts.reduce((a, b) => a + b, 0) + sep * (parts.length - 1);\n };\n let pick = plans.length - 1;\n let total = 0;\n for (let k = 0; k < plans.length; k++) {\n total = widthOf(plans[k]);\n if (total <= avail) { pick = k; break; }\n }\n let currentText: string | null = null;\n if (pick === plans.length - 1 && (total = widthOf(plans[pick])) > avail) {\n // last resort: middle-truncate the current item to the room that's left\n const textEl = mirror.querySelector('[data-m=\"curtext\"]');\n const textW = textEl?.getBoundingClientRect().width ?? 0;\n const room = cur - (total - avail) - (cur - textW);\n const m = textMeasurer(textEl);\n if (m && room > 24) currentText = middleEllipsis(items[n - 1].label, room, m);\n }\n setFit((f) => (f.plan === pick && f.currentText === currentText ? f : { plan: pick, currentText }));\n }, [plans, n]); // eslint-disable-line react-hooks/exhaustive-deps\n\n React.useLayoutEffect(() => {\n measure();\n }, [measure, sig]);\n React.useLayoutEffect(() => {\n const nav = navRef.current;\n if (!nav || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => measure());\n ro.observe(nav);\n let alive = true;\n document.fonts?.ready.then(() => alive && measure());\n return () => {\n alive = false;\n ro.disconnect();\n };\n }, [measure]);\n\n if (!n) return null;\n const plan = plans[Math.min(fit.plan, plans.length - 1)];\n const m = METRICS[size];\n const curItem = items[n - 1];\n\n /* ── pieces (shared by the mirror and the real trail so the widths match) ── */\n const icon = (c: PathCrumb) => (c.icon ? <span className={cn(\"flex shrink-0 items-center\", m.icon)} aria-hidden>{c.icon}</span> : null);\n /* V2: the dot itself carries the name (role=\"img\" so assistive tech reads it; no hidden text in the crumb) */\n const dot = (c: PathCrumb) => (c.errors ? <span role=\"img\" aria-label=\"Has errors\" className=\"size-1.5 shrink-0 rounded-full bg-kit-danger\" /> : null);\n const crumbCls = cn(PILL, m.pill);\n const body = (c: PathCrumb, form: Form) => (\n <>\n {icon(c)}\n <span>{form === \"trunc\" ? clip(c.label) : c.label}</span>\n {dot(c)}\n </>\n );\n /** The fold chip names its first folded level (the root only when nothing else is folded): \"[▦] Columns… +2\". */\n const groupBody = (g: Group) => {\n const count = g.end - g.start + 1;\n const lead = items[g.start === 0 && g.end > 0 ? 1 : g.start];\n return (\n <>\n {icon(lead)}\n <span>{clipWords(lead.label, 12)}</span>\n {count > 1 ? <span className=\"tabular-nums\">+{count - 1}</span> : null}\n <IconChevronDown className={cn(\"-mx-0.5 shrink-0 text-kit-fg-4\", m.sep)} stroke={1.75} aria-hidden />\n </>\n );\n };\n // current = emphasis by weight + colour, never a box (D38 v3); same box metrics as a crumb so nothing shifts\n // it has no pill, so no trailing padding: only the leading inset that lines it up with the chevron rhythm\n const currentCls = cn(\"inline-flex min-w-0 max-w-full items-center whitespace-nowrap rounded-kit-sm font-semibold text-kit-fg\", m.pill, m.cur, m.gap, \"[&_[data-crumb-icon]]:text-kit-fg-2\");\n const sepEl = <IconChevronRight className={cn(\"shrink-0 text-kit-fg-4\", m.sep)} stroke={1.75} aria-hidden />;\n\n function go(c: PathCrumb) {\n c.onSelect?.();\n }\n\n const crumb = (c: PathCrumb, i: number, form: Form) => {\n const tip = form !== \"full\" || undefined;\n const inner = body(c, form);\n const aria = form === \"trunc\" ? (c.errors ? `${c.label}, has errors` : c.label) : undefined;\n const el = c.to ? (\n <Link to={c.to} className={crumbCls} aria-label={aria} onClick={c.onSelect}>{inner}</Link>\n ) : (\n <button type=\"button\" className={crumbCls} aria-label={aria} onClick={() => go(c)} disabled={!c.onSelect}>{inner}</button>\n );\n return (\n <li key={c.id} className=\"flex shrink-0 items-center\">\n {i > 0 ? sepEl : null}\n {tip ? <Tooltip content={c.label} side=\"bottom\">{el}</Tooltip> : el}\n </li>\n );\n };\n\n const shown: React.ReactNode[] = [];\n if (n > 1) {\n const g = plan.group;\n const group = (first?: boolean) => (\n <GroupLi key=\"grp\" items={items} group={g!} first={first} trigger={groupBody(g!)} sep={sepEl} navRef={navRef} label={label} cls={crumbCls} link={Link} />\n );\n if (g?.start === 0) shown.push(group(true));\n else {\n shown.push(crumb(items[0], 0, plan.forms[0]));\n if (g) shown.push(group());\n }\n for (let i = 1; i < n - 1; i++) if (!g || i > g.end) shown.push(crumb(items[i], i, plan.forms[i]));\n }\n const curLabel = fit.currentText ?? curItem.label;\n const curNode = (\n <span aria-current=\"page\" className={currentCls}>\n {curItem.icon ? <span data-crumb-icon className={cn(\"flex shrink-0 items-center\", m.icon)} aria-hidden>{curItem.icon}</span> : null}\n <span className=\"min-w-0 truncate\" aria-label={curLabel !== curItem.label ? curItem.label : undefined}>{curLabel}</span>\n {dot(curItem)}\n </span>\n );\n const backText = backLabel ?? (parent ? `Back to ${parent.label}` : \"Back\");\n\n return (\n <nav ref={navRef} aria-label={label} data-size={size} className={cn(\"relative flex min-w-0 flex-1 items-center\", m.row, m.text, className)}>\n {back ? (\n <div ref={backRef} className=\"flex shrink-0 items-center\">\n <Tooltip content={backText} shortcut={backShortcut}>\n <IconButton label={backText} size={m.back} onClick={back} className=\"shrink-0 rounded-kit-sm\">\n <IconArrowLeft stroke={1.75} />\n </IconButton>\n </Tooltip>\n </div>\n ) : null}\n <ol className=\"flex min-w-0 flex-1 items-center overflow-hidden\">\n {shown}\n <li className=\"flex min-w-0 shrink items-center\">\n {n > 1 ? sepEl : null}\n {fit.currentText || (fit.plan === plans.length - 1 && long(curItem.label)) ? (\n <Tooltip content={curItem.label} side=\"bottom\">\n <span tabIndex={0} className=\"flex min-w-0 rounded-kit-sm\">{curNode}</span>\n </Tooltip>\n ) : (\n curNode\n )}\n </li>\n </ol>\n\n {/* hidden mirror: every variant measured once (never painted, never announced) */}\n <div ref={mirrorRef} aria-hidden className=\"pointer-events-none invisible absolute left-0 top-0 h-0 w-0 overflow-hidden\">\n <div className=\"flex w-max flex-col items-start\">\n <span data-m=\"sep\" className=\"flex\">{sepEl}</span>\n {items.slice(0, -1).map((c, i) => (\n <React.Fragment key={c.id}>\n <span data-m={`${i}:full`} className={crumbCls}>{body(c, \"full\")}</span>\n <span data-m={`${i}:trunc`} className={crumbCls}>{body(c, \"trunc\")}</span>\n </React.Fragment>\n ))}\n {[0, 1].flatMap((start) =>\n items.slice(0, -1).map((_, end) =>\n end < start ? null : <span key={`g${start}:${end}`} data-m={`g:${start}:${end}`} className={crumbCls}>{groupBody({ start, end })}</span>,\n ),\n )}\n <span data-m=\"cur\" className={currentCls}>\n {curItem.icon ? <span data-crumb-icon className={cn(\"flex shrink-0 items-center\", m.icon)}>{curItem.icon}</span> : null}\n <span data-m=\"curtext\">{curItem.label}</span>\n {dot(curItem)}\n </span>\n </div>\n </div>\n </nav>\n );\n}\n\n/* ── The folded middle + its Pathway popover ───────────────────────────────────── */\nfunction GroupLi({\n items,\n group,\n trigger,\n sep,\n first,\n navRef,\n label,\n cls,\n link: Link,\n}: {\n items: PathCrumb[];\n group: Group;\n trigger: React.ReactNode;\n sep: React.ReactNode;\n first?: boolean;\n navRef: React.RefObject<HTMLElement | null>;\n label: string;\n cls: string;\n link: React.ComponentType<PathCrumbLinkProps>;\n}) {\n const count = group.end - group.start + 1;\n const last = items.length - 1;\n return (\n <li className=\"flex shrink-0 items-center\">\n {first ? null : sep}\n <Menu>\n <Tooltip content=\"Show the full path\" side=\"bottom\">\n <MenuTrigger\n data-crumb-group=\"\"\n className={cn(cls, \"aria-expanded:bg-kit-selected aria-expanded:text-kit-fg\")} /* = crumbCls: the mirror measures it */\n aria-label={`Show ${count} more ${count === 1 ? \"level\" : \"levels\"}`}\n >\n {trigger}\n </MenuTrigger>\n </Tooltip>\n {/* the kit MenuContent: §12 dismiss guards and the modal-layer marker (an open tooltip closes) */}\n <MenuContent\n align=\"start\"\n finalFocus={() => {\n // a jump re-lays the trail (or remounts the host) and the chip may be gone: land on the trail's chip,\n // ← or current item instead of <body>\n requestAnimationFrame(() => {\n const nav = navRef.current?.isConnected ? navRef.current : document.querySelector<HTMLElement>(`nav[aria-label=\"${CSS.escape(label)}\"]`);\n if (!nav) return;\n const chip = nav.querySelector<HTMLElement>(\"[data-crumb-group]\");\n (chip ?? nav.querySelector<HTMLElement>(\"button, [aria-current], [tabindex='0']\"))?.focus({ preventScroll: true });\n });\n return false;\n }}\n className=\"w-64 max-w-[calc(100vw-24px)] text-[13px] leading-5\"\n >\n <div className=\"px-2 pb-1 pt-1 text-kit-xs font-medium text-kit-fg-3\">Pathway</div>\n {/* role=none: the menu owns its menuitems directly (no list or listitem in between) */}\n <ol role=\"none\" className=\"flex flex-col\">\n {items.map((c, i) => {\n const isCurrent = i === last;\n const hidden = i >= group.start && i <= group.end;\n const rowCls = cn(\n \"relative flex h-7 select-none items-center gap-1.5 rounded-kit-sm pr-2 outline-none transition-colors\",\n isCurrent\n ? \"cursor-default font-semibold text-kit-fg data-[highlighted]:bg-kit-hover\"\n : cn(\"cursor-pointer data-[highlighted]:bg-kit-hover data-[highlighted]:text-kit-fg active:bg-kit-selected\", hidden ? \"text-kit-fg\" : \"text-kit-fg-3\"),\n );\n const style = { paddingLeft: 8 + Math.min(i, 8) * 12 };\n return (\n <li key={c.id} role=\"none\">\n {c.to && !isCurrent ? (\n <MenuPrimitive.LinkItem\n closeOnClick\n render={<Link to={c.to} />}\n onClick={() => c.onSelect?.()}\n className={rowCls}\n style={style}\n >\n <PathRow c={c} depth={i} />\n </MenuPrimitive.LinkItem>\n ) : (\n <MenuPrimitive.Item\n onClick={() => (isCurrent ? undefined : c.onSelect?.())}\n aria-current={isCurrent ? \"page\" : undefined}\n className={rowCls}\n style={style}\n >\n <PathRow c={c} depth={i} current={isCurrent} />\n </MenuPrimitive.Item>\n )}\n </li>\n );\n })}\n </ol>\n </MenuContent>\n </Menu>\n </li>\n );\n}\n\nfunction PathRow({ c, depth, current }: { c: PathCrumb; depth: number; current?: boolean }) {\n return (\n <>\n {depth > 0 ? <span aria-hidden className=\"-mt-2 h-3 w-2 shrink-0 rounded-bl-[3px] border-b border-l border-kit-line-strong\" /> : null}\n {c.icon ? <span aria-hidden className=\"flex shrink-0 items-center text-kit-fg-3 [&_svg]:size-3.5\">{c.icon}</span> : null}\n {c.label.length > 28 ? (\n <Tooltip content={c.label} side=\"right\">\n <span className=\"min-w-0 flex-1 truncate\">{c.label}</span>\n </Tooltip>\n ) : (\n <span className=\"min-w-0 flex-1 truncate\">{c.label}</span>\n )}\n {c.errors ? <span role=\"img\" aria-label=\"Has errors\" className=\"size-1.5 shrink-0 rounded-full bg-kit-danger\" /> : null}\n {current ? <span aria-hidden className=\"size-1.5 shrink-0 rounded-full bg-kit-accent\" /> : null}\n </>\n );\n}\n\n/* ── Specimen (design system): one crumb frozen in a state, built from the SAME constants ─── */\nexport type PathCrumbState = \"rest\" | \"hover\" | \"pressed\" | \"focus\" | \"open\" | \"current\" | \"disabled\";\nexport function PathCrumbSpecimen({ state, label, icon, group, size = \"sm\" }: { state: PathCrumbState; label: string; icon?: React.ReactNode; group?: number; size?: \"sm\" | \"md\" }) {\n const m = METRICS[size];\n const forced: Record<PathCrumbState, string> = {\n rest: \"\",\n hover: \"bg-kit-hover text-kit-fg\",\n pressed: \"bg-kit-selected text-kit-fg\",\n focus: \"shadow-[0_0_0_2px_var(--kit-surface),0_0_0_4px_var(--kit-focus-ring)]\",\n open: \"bg-kit-selected text-kit-fg\",\n current: \"font-semibold text-kit-fg hover:bg-transparent [&_[data-crumb-icon]]:text-kit-fg-2\",\n disabled: \"text-kit-fg-4 hover:bg-transparent hover:text-kit-fg-4\",\n };\n return (\n <span className={cn(\"inline-flex items-center\", m.text)}>\n <span className={cn(PILL, m.pill, \"pointer-events-none\", forced[state])}>\n {icon ? <span data-crumb-icon className={cn(\"flex shrink-0 items-center\", m.icon)} aria-hidden>{icon}</span> : null}\n <span>{label}</span>\n {group ? (\n <>\n <span className=\"tabular-nums\">+{group}</span>\n <IconChevronDown className={cn(\"-mx-0.5 shrink-0 text-kit-fg-4\", m.sep)} stroke={1.75} aria-hidden />\n </>\n ) : null}\n </span>\n </span>\n );\n}\n"],"mappings":"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"}
|
package/ui/presence.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** D63: AI agents in History (change bars, outlines, tags): neutral violet-grey, never a person's slot. */
|
|
2
|
+
export declare const AGENT_PRESENCE = "var(--kit-presence-agent)";
|
|
3
|
+
/**
|
|
4
|
+
* Assign slots to a workspace's members in join order (stable: the same roster always gives the same colours).
|
|
5
|
+
* Each member is then found by id, full name or email.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerPresenceRoster(members: {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
joinedAt?: string;
|
|
12
|
+
}[]): void;
|
|
13
|
+
/** Accepts a person id ("u_priya", "priya"), a full name ("Priya Nair") or an email; returns the slot 1…8. */
|
|
14
|
+
export declare function presenceSlot(person: string): number;
|
|
15
|
+
/** `var(--kit-presence-n)` for that person: use as a CSS colour (border, ring, background with presence-on text). */
|
|
16
|
+
export declare function presenceColor(person: string): string;
|
package/ui/presence.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//#region src/kit/ui/presence.ts
|
|
2
|
+
/**
|
|
3
|
+
* Presence colour: ONE slot per person, the same everywhere they appear (field border, avatar ring, canvas pill, caret flag,
|
|
4
|
+
* History change bars). Slots are the `--kit-presence-1…8` tokens (D56); text on a presence fill is `--kit-presence-on`.
|
|
5
|
+
* Known people keep their earlier colours: priya → 1, daniel → 2, sujay → 3.
|
|
6
|
+
*
|
|
7
|
+
* D61: everyone else gets a slot at join, in join order, from the slots still free (all 8, not 5), so a real team rarely
|
|
8
|
+
* shares a colour; once all 8 are taken the least recently assigned slot is reused. Register the workspace roster with
|
|
9
|
+
* `registerPresenceRoster`. Someone not on the roster hashes stably into 4…8.
|
|
10
|
+
* AI agents never take a person's slot: they use `--kit-presence-agent` (`AGENT_PRESENCE`).
|
|
11
|
+
*
|
|
12
|
+
* src/index.css declares the tokens app-wide (light and dark), so presenceColor() needs no fallback.
|
|
13
|
+
*/
|
|
14
|
+
var KNOWN = {
|
|
15
|
+
priya: 1,
|
|
16
|
+
daniel: 2,
|
|
17
|
+
sujay: 3
|
|
18
|
+
};
|
|
19
|
+
var SLOTS = 8;
|
|
20
|
+
/** D63: AI agents in History (change bars, outlines, tags): neutral violet-grey, never a person's slot. */
|
|
21
|
+
var AGENT_PRESENCE = "var(--kit-presence-agent)";
|
|
22
|
+
var keyOf = (person) => person.trim().toLowerCase().replace(/^u_/, "").split(/[\s@._-]+/)[0] ?? "";
|
|
23
|
+
/** roster assignments: key (first name, id or email head) → slot */
|
|
24
|
+
var assigned = /* @__PURE__ */ new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Assign slots to a workspace's members in join order (stable: the same roster always gives the same colours).
|
|
27
|
+
* Each member is then found by id, full name or email.
|
|
28
|
+
*/
|
|
29
|
+
function registerPresenceRoster(members) {
|
|
30
|
+
assigned.clear();
|
|
31
|
+
const order = [...members].sort((a, b) => a.joinedAt && b.joinedAt ? a.joinedAt.localeCompare(b.joinedAt) : 0);
|
|
32
|
+
const lastUse = /* @__PURE__ */ new Map();
|
|
33
|
+
Object.values(KNOWN).forEach((s, i) => lastUse.set(s, i));
|
|
34
|
+
let tick = 10;
|
|
35
|
+
for (const m of order) {
|
|
36
|
+
const keys = [
|
|
37
|
+
m.id.toLowerCase(),
|
|
38
|
+
keyOf(m.name),
|
|
39
|
+
m.email ? keyOf(m.email) : ""
|
|
40
|
+
].filter(Boolean);
|
|
41
|
+
let slot = keys.map((k) => KNOWN[k]).find(Boolean);
|
|
42
|
+
if (!slot) slot = Array.from({ length: SLOTS }, (_, i) => i + 1).filter((s) => !lastUse.has(s))[0] ?? [...lastUse.entries()].sort((a, b) => a[1] - b[1])[0][0];
|
|
43
|
+
lastUse.set(slot, tick++);
|
|
44
|
+
for (const k of keys) assigned.set(k, slot);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Accepts a person id ("u_priya", "priya"), a full name ("Priya Nair") or an email; returns the slot 1…8. */
|
|
48
|
+
function presenceSlot(person) {
|
|
49
|
+
const whole = person.trim().toLowerCase();
|
|
50
|
+
const key = keyOf(person);
|
|
51
|
+
if (KNOWN[key]) return KNOWN[key];
|
|
52
|
+
const hit = assigned.get(whole) ?? assigned.get(key);
|
|
53
|
+
if (hit) return hit;
|
|
54
|
+
let h = 0;
|
|
55
|
+
for (let i = 0; i < key.length; i++) h = h * 31 + key.charCodeAt(i) >>> 0;
|
|
56
|
+
return 4 + h % (SLOTS - 3);
|
|
57
|
+
}
|
|
58
|
+
/** `var(--kit-presence-n)` for that person: use as a CSS colour (border, ring, background with presence-on text). */
|
|
59
|
+
function presenceColor(person) {
|
|
60
|
+
return `var(--kit-presence-${presenceSlot(person)})`;
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { AGENT_PRESENCE, presenceColor, presenceSlot, registerPresenceRoster };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.js","names":[],"sources":["../../src/kit/ui/presence.ts"],"sourcesContent":["/**\n * Presence colour: ONE slot per person, the same everywhere they appear (field border, avatar ring, canvas pill, caret flag,\n * History change bars). Slots are the `--kit-presence-1…8` tokens (D56); text on a presence fill is `--kit-presence-on`.\n * Known people keep their earlier colours: priya → 1, daniel → 2, sujay → 3.\n *\n * D61: everyone else gets a slot at join, in join order, from the slots still free (all 8, not 5), so a real team rarely\n * shares a colour; once all 8 are taken the least recently assigned slot is reused. Register the workspace roster with\n * `registerPresenceRoster`. Someone not on the roster hashes stably into 4…8.\n * AI agents never take a person's slot: they use `--kit-presence-agent` (`AGENT_PRESENCE`).\n *\n * src/index.css declares the tokens app-wide (light and dark), so presenceColor() needs no fallback.\n */\nconst KNOWN: Record<string, number> = { priya: 1, daniel: 2, sujay: 3 };\nconst SLOTS = 8;\n\n/** D63: AI agents in History (change bars, outlines, tags): neutral violet-grey, never a person's slot. */\nexport const AGENT_PRESENCE = \"var(--kit-presence-agent)\";\n\nconst keyOf = (person: string) => person.trim().toLowerCase().replace(/^u_/, \"\").split(/[\\s@._-]+/)[0] ?? \"\";\n/** roster assignments: key (first name, id or email head) → slot */\nconst assigned = new Map<string, number>();\n\n/**\n * Assign slots to a workspace's members in join order (stable: the same roster always gives the same colours).\n * Each member is then found by id, full name or email.\n */\nexport function registerPresenceRoster(members: { id: string; name: string; email?: string; joinedAt?: string }[]) {\n assigned.clear();\n const order = [...members].sort((a, b) => (a.joinedAt && b.joinedAt ? a.joinedAt.localeCompare(b.joinedAt) : 0));\n const lastUse = new Map<number, number>(); // slot → assignment tick\n Object.values(KNOWN).forEach((s, i) => lastUse.set(s, i));\n let tick = 10;\n for (const m of order) {\n const keys = [m.id.toLowerCase(), keyOf(m.name), m.email ? keyOf(m.email) : \"\"].filter(Boolean);\n const known = keys.map((k) => KNOWN[k]).find(Boolean);\n let slot = known;\n if (!slot) {\n const free = Array.from({ length: SLOTS }, (_, i) => i + 1).filter((s) => !lastUse.has(s));\n // all 8 taken: reuse the least recently assigned slot\n slot = free[0] ?? [...lastUse.entries()].sort((a, b) => a[1] - b[1])[0][0];\n }\n lastUse.set(slot, tick++);\n for (const k of keys) assigned.set(k, slot);\n }\n}\n\n/** Accepts a person id (\"u_priya\", \"priya\"), a full name (\"Priya Nair\") or an email; returns the slot 1…8. */\nexport function presenceSlot(person: string): number {\n const whole = person.trim().toLowerCase();\n const key = keyOf(person);\n if (KNOWN[key]) return KNOWN[key];\n const hit = assigned.get(whole) ?? assigned.get(key);\n if (hit) return hit;\n let h = 0;\n for (let i = 0; i < key.length; i++) h = (h * 31 + key.charCodeAt(i)) >>> 0;\n return 4 + (h % (SLOTS - 3));\n}\n\n/** `var(--kit-presence-n)` for that person: use as a CSS colour (border, ring, background with presence-on text). */\nexport function presenceColor(person: string): string {\n const n = presenceSlot(person);\n return `var(--kit-presence-${n})`;\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAM,QAAgC;CAAE,OAAO;CAAG,QAAQ;CAAG,OAAO;CAAG;AACvE,IAAM,QAAQ;;AAGd,IAAa,iBAAiB;AAE9B,IAAM,SAAS,WAAmB,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,OAAO,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM;;AAE1G,IAAM,2BAAW,IAAI,KAAqB;;;;;AAM1C,SAAgB,uBAAuB,SAA4E;AACjH,UAAS,OAAO;CAChB,MAAM,QAAQ,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,cAAc,EAAE,SAAS,GAAG,EAAG;CAChH,MAAM,0BAAU,IAAI,KAAqB;AACzC,QAAO,OAAO,MAAM,CAAC,SAAS,GAAG,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;CACzD,IAAI,OAAO;AACX,MAAK,MAAM,KAAK,OAAO;EACrB,MAAM,OAAO;GAAC,EAAE,GAAG,aAAa;GAAE,MAAM,EAAE,KAAK;GAAE,EAAE,QAAQ,MAAM,EAAE,MAAM,GAAG;GAAG,CAAC,OAAO,QAAQ;EAE/F,IAAI,OADU,KAAK,KAAK,MAAM,MAAM,GAAG,CAAC,KAAK,QAAQ;AAErD,MAAI,CAAC,KAGH,QAFa,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC,QAAQ,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAE9E,MAAM,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG;AAE1E,UAAQ,IAAI,MAAM,OAAO;AACzB,OAAK,MAAM,KAAK,KAAM,UAAS,IAAI,GAAG,KAAK;;;;AAK/C,SAAgB,aAAa,QAAwB;CACnD,MAAM,QAAQ,OAAO,MAAM,CAAC,aAAa;CACzC,MAAM,MAAM,MAAM,OAAO;AACzB,KAAI,MAAM,KAAM,QAAO,MAAM;CAC7B,MAAM,MAAM,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,IAAI;AACpD,KAAI,IAAK,QAAO;CAChB,IAAI,IAAI;AACR,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAK,KAAK,IAAI,KAAK,IAAI,WAAW,EAAE,KAAM;AAC1E,QAAO,IAAK,KAAK,QAAQ;;;AAI3B,SAAgB,cAAc,QAAwB;AAEpD,QAAO,sBADG,aAAa,OAAO,CACC"}
|
package/ui/select.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export declare const SEARCH_THRESHOLD = 7;
|
|
3
|
+
export type SelectOption = {
|
|
4
|
+
value: string;
|
|
5
|
+
label: React.ReactNode;
|
|
6
|
+
/** leading visual (16px icon); ignored when `avatar` is set */
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
/** a person: renders a 20px avatar before the label */
|
|
9
|
+
avatar?: {
|
|
10
|
+
name: string;
|
|
11
|
+
src?: string;
|
|
12
|
+
};
|
|
13
|
+
/** secondary line under the label (e.g. an email) — searchable */
|
|
14
|
+
description?: string;
|
|
15
|
+
/** muted right-aligned text (e.g. "UTC+1", a count) — searchable */
|
|
16
|
+
meta?: string;
|
|
17
|
+
/** extra words that should match (aliases, ids) */
|
|
18
|
+
keywords?: string[];
|
|
19
|
+
/** group heading; options with the same group render together, in first-seen order */
|
|
20
|
+
group?: string;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
};
|
|
23
|
+
/** Plain text of a React node — lets `label` stay a ReactNode while still being searchable. */
|
|
24
|
+
export declare function nodeText(node: React.ReactNode): string;
|
|
25
|
+
/**
|
|
26
|
+
* Score how well `query` matches `text` (0 = no match). Every whitespace-separated term must match.
|
|
27
|
+
* Prefix > word start > substring > in-order characters ("nyk" → "New York").
|
|
28
|
+
*/
|
|
29
|
+
export declare function matchScore(text: string, query: string, { fuzzy }?: {
|
|
30
|
+
fuzzy?: boolean;
|
|
31
|
+
}): number;
|
|
32
|
+
/** Character indexes of `text` to emphasise for `query` (substring per term, else in-order characters). */
|
|
33
|
+
export declare function matchPositions(text: string, query: string): Set<number>;
|
|
34
|
+
/** Renders `text` with the characters that match `query` emphasised. */
|
|
35
|
+
export declare function Highlight({ text, query }: {
|
|
36
|
+
text: string;
|
|
37
|
+
query: string;
|
|
38
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
/** Filter + rank options for `query` (stable within equal scores). */
|
|
40
|
+
export declare function filterOptions<T extends SelectOption>(options: T[], query: string): T[];
|
|
41
|
+
declare function triggerClass(variant: "filled" | "outline" | "ghost", size: "sm" | "md" | "lg"): string;
|
|
42
|
+
/** The Select trigger look, for controls that open their own picker but must read as a Select (D57: one look per job). */
|
|
43
|
+
export declare const selectTriggerClass: typeof triggerClass;
|
|
44
|
+
export interface SelectProps {
|
|
45
|
+
id?: string;
|
|
46
|
+
"aria-label"?: string;
|
|
47
|
+
value?: string;
|
|
48
|
+
/** uncontrolled starting value (leave `value` undefined) */
|
|
49
|
+
defaultValue?: string;
|
|
50
|
+
onValueChange?: (v: string) => void;
|
|
51
|
+
options: SelectOption[];
|
|
52
|
+
placeholder?: string;
|
|
53
|
+
size?: "sm" | "md" | "lg";
|
|
54
|
+
className?: string;
|
|
55
|
+
triggerClassName?: string;
|
|
56
|
+
variant?: "filled" | "outline" | "ghost";
|
|
57
|
+
align?: "start" | "center" | "end";
|
|
58
|
+
disabled?: boolean;
|
|
59
|
+
/** "auto" (default): search appears when there are more than 7 options. */
|
|
60
|
+
searchable?: boolean | "auto";
|
|
61
|
+
searchPlaceholder?: string;
|
|
62
|
+
/** popover width for the searchable menu (defaults to the trigger, at least 240px) */
|
|
63
|
+
menuClassName?: string;
|
|
64
|
+
}
|
|
65
|
+
export declare function Select(props: SelectProps): import("react/jsx-runtime").JSX.Element;
|
|
66
|
+
export {};
|
package/ui/select.js
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { useFieldId, useFieldLabelledBy, useLabelFor } from "./field-context.js";
|
|
3
|
+
import { GLASS, KIT_SCOPE } from "./surfaces.js";
|
|
4
|
+
import { Avatar } from "./display.js";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { IconCheck, IconChevronDown, IconSearch } from "@tabler/icons-react";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { Select } from "@base-ui/react/select";
|
|
9
|
+
import { Combobox } from "@base-ui/react/combobox";
|
|
10
|
+
//#region src/kit/ui/select.tsx
|
|
11
|
+
var SEARCH_THRESHOLD = 7;
|
|
12
|
+
/** Plain text of a React node — lets `label` stay a ReactNode while still being searchable. */
|
|
13
|
+
function nodeText(node) {
|
|
14
|
+
if (node == null || typeof node === "boolean") return "";
|
|
15
|
+
if (typeof node === "string" || typeof node === "number") return String(node);
|
|
16
|
+
if (Array.isArray(node)) return node.map(nodeText).join("");
|
|
17
|
+
if (React.isValidElement(node)) return nodeText(node.props.children);
|
|
18
|
+
return "";
|
|
19
|
+
}
|
|
20
|
+
var SEP = /[\s\-_/.(@+]/;
|
|
21
|
+
var norm = (s) => s.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase();
|
|
22
|
+
/**
|
|
23
|
+
* Score how well `query` matches `text` (0 = no match). Every whitespace-separated term must match.
|
|
24
|
+
* Prefix > word start > substring > in-order characters ("nyk" → "New York").
|
|
25
|
+
*/
|
|
26
|
+
function matchScore(text, query, { fuzzy = true } = {}) {
|
|
27
|
+
const t = norm(text);
|
|
28
|
+
const terms = norm(query).trim().split(/\s+/).filter(Boolean);
|
|
29
|
+
if (!terms.length) return 1;
|
|
30
|
+
let score = 0;
|
|
31
|
+
for (const term of terms) {
|
|
32
|
+
const at = t.indexOf(term);
|
|
33
|
+
if (at === 0) score += 4;
|
|
34
|
+
else if (at > 0) score += SEP.test(t[at - 1]) ? 3 : 2;
|
|
35
|
+
else if (fuzzy && fuzzyPositions(t, term)) score += 1;
|
|
36
|
+
else return 0;
|
|
37
|
+
}
|
|
38
|
+
return score;
|
|
39
|
+
}
|
|
40
|
+
/** In-order characters of `term` in `t`, tight enough to be intended ("nyk" → New York, not across a paragraph). */
|
|
41
|
+
function fuzzyPositions(t, term) {
|
|
42
|
+
if (term.length < 2) return null;
|
|
43
|
+
for (let start = t.indexOf(term[0]); start >= 0; start = t.indexOf(term[0], start + 1)) {
|
|
44
|
+
if (start > 0 && !SEP.test(t[start - 1])) continue;
|
|
45
|
+
const out = [start];
|
|
46
|
+
let i = start + 1;
|
|
47
|
+
for (const ch of term.slice(1)) {
|
|
48
|
+
i = t.indexOf(ch, i);
|
|
49
|
+
if (i < 0) break;
|
|
50
|
+
out.push(i++);
|
|
51
|
+
}
|
|
52
|
+
if (out.length === term.length && out[out.length - 1] - start + 1 <= term.length * 3) return out;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
/** Character indexes of `text` to emphasise for `query` (substring per term, else in-order characters). */
|
|
57
|
+
function matchPositions(text, query) {
|
|
58
|
+
const t = norm(text);
|
|
59
|
+
const hits = /* @__PURE__ */ new Set();
|
|
60
|
+
for (const term of norm(query).trim().split(/\s+/).filter(Boolean)) {
|
|
61
|
+
const at = t.indexOf(term);
|
|
62
|
+
if (at >= 0) for (let k = 0; k < term.length; k++) hits.add(at + k);
|
|
63
|
+
else fuzzyPositions(t, term)?.forEach((k) => hits.add(k));
|
|
64
|
+
}
|
|
65
|
+
return hits;
|
|
66
|
+
}
|
|
67
|
+
/** Renders `text` with the characters that match `query` emphasised. */
|
|
68
|
+
function Highlight({ text, query }) {
|
|
69
|
+
if (!query.trim()) return /* @__PURE__ */ jsx(Fragment, { children: text });
|
|
70
|
+
if (norm(text).length !== text.length) return /* @__PURE__ */ jsx(Fragment, { children: text });
|
|
71
|
+
const hits = matchPositions(text, query);
|
|
72
|
+
if (!hits.size) return /* @__PURE__ */ jsx(Fragment, { children: text });
|
|
73
|
+
const parts = [];
|
|
74
|
+
let run = "";
|
|
75
|
+
let on = false;
|
|
76
|
+
const flush = (k) => {
|
|
77
|
+
if (!run) return;
|
|
78
|
+
parts.push(on ? /* @__PURE__ */ jsx("mark", {
|
|
79
|
+
className: "rounded-[2px] bg-transparent font-semibold text-kit-fg",
|
|
80
|
+
children: run
|
|
81
|
+
}, k) : run);
|
|
82
|
+
run = "";
|
|
83
|
+
};
|
|
84
|
+
for (let k = 0; k < text.length; k++) {
|
|
85
|
+
const h = hits.has(k);
|
|
86
|
+
if (h !== on) {
|
|
87
|
+
flush(k);
|
|
88
|
+
on = h;
|
|
89
|
+
}
|
|
90
|
+
run += text[k];
|
|
91
|
+
}
|
|
92
|
+
flush(text.length);
|
|
93
|
+
return /* @__PURE__ */ jsx(Fragment, { children: parts });
|
|
94
|
+
}
|
|
95
|
+
/** Filter + rank options for `query` (stable within equal scores). */
|
|
96
|
+
function filterOptions(options, query) {
|
|
97
|
+
if (!query.trim()) return options;
|
|
98
|
+
return options.map((o, i) => {
|
|
99
|
+
const label = nodeText(o.label);
|
|
100
|
+
const main = matchScore(label, query);
|
|
101
|
+
const rest = matchScore([
|
|
102
|
+
label,
|
|
103
|
+
o.description,
|
|
104
|
+
o.meta,
|
|
105
|
+
...o.keywords ?? []
|
|
106
|
+
].filter(Boolean).join(" "), query, { fuzzy: false });
|
|
107
|
+
const exact = o.keywords?.some((k) => norm(k) === norm(query.trim())) ? 9 : 0;
|
|
108
|
+
return {
|
|
109
|
+
o,
|
|
110
|
+
i,
|
|
111
|
+
s: Math.max(main ? main * 2 + 1 : rest, exact),
|
|
112
|
+
len: label.length
|
|
113
|
+
};
|
|
114
|
+
}).filter((x) => x.s > 0).sort((a, b) => b.s - a.s || a.len - b.len || a.i - b.i).map((x) => x.o);
|
|
115
|
+
}
|
|
116
|
+
function grouped(options) {
|
|
117
|
+
if (!options.some((o) => o.group)) return [{ items: options }];
|
|
118
|
+
const out = [];
|
|
119
|
+
for (const o of options) {
|
|
120
|
+
const g = out.find((x) => x.group === o.group);
|
|
121
|
+
if (g) g.items.push(o);
|
|
122
|
+
else out.push({
|
|
123
|
+
group: o.group,
|
|
124
|
+
items: [o]
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
function triggerClass(variant, size) {
|
|
130
|
+
return cn("group inline-flex w-full min-w-0 items-center justify-between gap-2 rounded-kit-md border px-2.5 text-left text-kit-fg transition-colors data-[placeholder]:text-kit-fg-3 disabled:cursor-not-allowed disabled:opacity-60 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-60", variant === "filled" && "border-kit-field-border bg-kit-field-bg shadow-kit-field hover:border-kit-field-border-hover", variant === "outline" && "border-kit-line bg-kit-field-bg shadow-kit-xs hover:border-kit-line-strong", variant === "ghost" && "w-auto border-transparent bg-transparent px-2 text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg", size === "sm" ? "h-7 text-kit-sm" : size === "lg" ? "h-9 text-kit-base" : "h-8 text-kit-sm");
|
|
131
|
+
}
|
|
132
|
+
/** The Select trigger look, for controls that open their own picker but must read as a Select (D57: one look per job). */
|
|
133
|
+
var selectTriggerClass = triggerClass;
|
|
134
|
+
var floatingClass = cn("rounded-kit-lg border text-kit-fg outline-none data-[open]:animate-kit-pop-in", GLASS);
|
|
135
|
+
var itemClass = "relative flex cursor-pointer select-none items-center gap-2 rounded-kit-md py-1.5 pl-2 pr-8 text-kit-sm text-kit-fg outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40 data-[highlighted]:bg-kit-hover [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:text-kit-fg-2";
|
|
136
|
+
var groupHeading = "px-2 pb-1 pt-2 text-kit-xs font-medium text-kit-fg-3";
|
|
137
|
+
function Lead({ o }) {
|
|
138
|
+
if (o.avatar) return /* @__PURE__ */ jsx(Avatar, {
|
|
139
|
+
name: o.avatar.name,
|
|
140
|
+
src: o.avatar.src,
|
|
141
|
+
size: 20,
|
|
142
|
+
decorative: true
|
|
143
|
+
});
|
|
144
|
+
return o.icon ? /* @__PURE__ */ jsx(Fragment, { children: o.icon }) : null;
|
|
145
|
+
}
|
|
146
|
+
function Select$1(props) {
|
|
147
|
+
const { searchable = "auto", options } = props;
|
|
148
|
+
return searchable === true || searchable === "auto" && options.length > 7 ? /* @__PURE__ */ jsx(SearchSelect, { ...props }) : /* @__PURE__ */ jsx(PlainSelect, { ...props });
|
|
149
|
+
}
|
|
150
|
+
function useTriggerA11y(id, ariaLabel, placeholder) {
|
|
151
|
+
const fieldId = useFieldId();
|
|
152
|
+
const labelledBy = useFieldLabelledBy();
|
|
153
|
+
const labelFor = useLabelFor(id ?? fieldId);
|
|
154
|
+
return {
|
|
155
|
+
id: id ?? fieldId,
|
|
156
|
+
"aria-label": ariaLabel ?? (fieldId || labelledBy || labelFor ? void 0 : typeof placeholder === "string" && placeholder !== "Select…" ? placeholder : void 0),
|
|
157
|
+
"aria-labelledby": ariaLabel ? void 0 : labelFor ?? (id || fieldId ? void 0 : labelledBy)
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** Value that is controlled when `value` is passed and internal otherwise. */
|
|
161
|
+
function useSelectValue(value, defaultValue, onValueChange) {
|
|
162
|
+
const [inner, setInner] = React.useState(defaultValue);
|
|
163
|
+
const controlled = value !== void 0;
|
|
164
|
+
const current = controlled ? value : inner;
|
|
165
|
+
const set = (v) => {
|
|
166
|
+
if (!controlled) setInner(v);
|
|
167
|
+
onValueChange?.(v);
|
|
168
|
+
};
|
|
169
|
+
return [current, set];
|
|
170
|
+
}
|
|
171
|
+
function PlainSelect({ value, defaultValue, onValueChange, options, placeholder = "Select…", size = "md", className, triggerClassName, variant = "filled", align = "start", disabled, id, "aria-label": ariaLabel }) {
|
|
172
|
+
const a11y = useTriggerA11y(id, ariaLabel, placeholder);
|
|
173
|
+
const [current, setCurrent] = useSelectValue(value, defaultValue, onValueChange);
|
|
174
|
+
const [open, setOpen] = React.useState(false);
|
|
175
|
+
const items = React.useMemo(() => options.map((o) => ({
|
|
176
|
+
value: o.value,
|
|
177
|
+
label: o.label
|
|
178
|
+
})), [options]);
|
|
179
|
+
const renderItem = (o) => /* @__PURE__ */ jsxs(Select.Item, {
|
|
180
|
+
value: o.value,
|
|
181
|
+
disabled: o.disabled,
|
|
182
|
+
className: itemClass,
|
|
183
|
+
children: [
|
|
184
|
+
/* @__PURE__ */ jsx(Lead, { o }),
|
|
185
|
+
/* @__PURE__ */ jsxs("div", {
|
|
186
|
+
className: "min-w-0 flex-1",
|
|
187
|
+
children: [/* @__PURE__ */ jsx(Select.ItemText, { children: o.label }), o.description ? /* @__PURE__ */ jsx("div", {
|
|
188
|
+
className: "text-kit-xs text-kit-fg-3",
|
|
189
|
+
children: o.description
|
|
190
|
+
}) : null]
|
|
191
|
+
}),
|
|
192
|
+
o.meta ? /* @__PURE__ */ jsx("span", {
|
|
193
|
+
className: "shrink-0 text-kit-xs tabular-nums text-kit-fg-3",
|
|
194
|
+
children: o.meta
|
|
195
|
+
}) : null,
|
|
196
|
+
/* @__PURE__ */ jsx(Select.ItemIndicator, {
|
|
197
|
+
className: "absolute right-2",
|
|
198
|
+
children: /* @__PURE__ */ jsx(IconCheck, { className: "size-4 !text-kit-fg" })
|
|
199
|
+
})
|
|
200
|
+
]
|
|
201
|
+
}, o.value);
|
|
202
|
+
return /* @__PURE__ */ jsxs(Select.Root, {
|
|
203
|
+
items,
|
|
204
|
+
value: current ?? null,
|
|
205
|
+
onValueChange: (v) => v != null && setCurrent(v),
|
|
206
|
+
onOpenChange: setOpen,
|
|
207
|
+
disabled,
|
|
208
|
+
children: [/* @__PURE__ */ jsxs(Select.Trigger, {
|
|
209
|
+
...a11y,
|
|
210
|
+
"data-state": open ? "open" : "closed",
|
|
211
|
+
className: cn(triggerClass(variant, size), triggerClassName, className),
|
|
212
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
213
|
+
className: "flex min-w-0 items-center gap-2 truncate [&_svg]:size-4 [&_svg]:text-kit-fg-3",
|
|
214
|
+
children: /* @__PURE__ */ jsx(Select.Value, { placeholder })
|
|
215
|
+
}), /* @__PURE__ */ jsx(Select.Icon, { children: /* @__PURE__ */ jsx(IconChevronDown, { className: "size-3.5 text-kit-fg-3 transition-transform group-data-[popup-open]:rotate-180" }) })]
|
|
216
|
+
}), /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsx(Select.Positioner, {
|
|
217
|
+
align,
|
|
218
|
+
sideOffset: 6,
|
|
219
|
+
alignItemWithTrigger: false,
|
|
220
|
+
className: "z-[80]",
|
|
221
|
+
"data-floating-layer": "",
|
|
222
|
+
...KIT_SCOPE,
|
|
223
|
+
children: /* @__PURE__ */ jsx(Select.Popup, {
|
|
224
|
+
className: cn(floatingClass, "max-h-[min(360px,var(--available-height))] min-w-[var(--anchor-width)] overflow-y-auto p-1"),
|
|
225
|
+
children: /* @__PURE__ */ jsx(Select.List, { children: grouped(options).map((g, gi) => g.group ? /* @__PURE__ */ jsxs(Select.Group, { children: [/* @__PURE__ */ jsx(Select.GroupLabel, {
|
|
226
|
+
className: groupHeading,
|
|
227
|
+
children: g.group
|
|
228
|
+
}), g.items.map(renderItem)] }, g.group + gi) : g.items.map(renderItem)) })
|
|
229
|
+
})
|
|
230
|
+
}) })]
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/** V2 scrollIntoContainer (block "nearest", 4px margin): scroll `el` into view inside `list` ONLY, never the shell behind it.
|
|
234
|
+
* Rects are transformed while the menu pops in (scaled), so measure in layout pixels. */
|
|
235
|
+
function revealInList(list, el, margin = 4) {
|
|
236
|
+
if (!el) return;
|
|
237
|
+
const br = list.getBoundingClientRect();
|
|
238
|
+
const er = el.getBoundingClientRect();
|
|
239
|
+
const k = list.offsetHeight ? br.height / list.offsetHeight || 1 : 1;
|
|
240
|
+
const top = (er.top - br.top) / k + list.scrollTop;
|
|
241
|
+
const h = er.height / k;
|
|
242
|
+
let next = list.scrollTop;
|
|
243
|
+
if (top < list.scrollTop) next = top - margin;
|
|
244
|
+
else if (top + h > list.scrollTop + list.clientHeight) next = top + h - list.clientHeight + margin;
|
|
245
|
+
next = Math.max(0, Math.min(next, list.scrollHeight - list.clientHeight));
|
|
246
|
+
if (Math.abs(next - list.scrollTop) > .5) list.scrollTop = next;
|
|
247
|
+
}
|
|
248
|
+
function SearchSelect({ value, defaultValue, onValueChange, options, placeholder = "Select…", size = "md", className, triggerClassName, variant = "filled", align = "start", disabled, id, "aria-label": ariaLabel, searchPlaceholder = "Search…", menuClassName }) {
|
|
249
|
+
const a11y = useTriggerA11y(id, ariaLabel, placeholder);
|
|
250
|
+
const [current, setCurrent] = useSelectValue(value, defaultValue, onValueChange);
|
|
251
|
+
const [open, setOpen] = React.useState(false);
|
|
252
|
+
const [query, setQuery] = React.useState("");
|
|
253
|
+
const selected = options.find((o) => o.value === current);
|
|
254
|
+
const shown = React.useMemo(() => filterOptions(options, query), [options, query]);
|
|
255
|
+
const shownValues = React.useMemo(() => shown.map((o) => o.value), [shown]);
|
|
256
|
+
const listRef = React.useRef(null);
|
|
257
|
+
React.useEffect(() => {
|
|
258
|
+
if (!open) return;
|
|
259
|
+
let raf = 0;
|
|
260
|
+
const reveal = (tries) => {
|
|
261
|
+
const list = listRef.current;
|
|
262
|
+
if (!(list && list.scrollHeight > list.clientHeight) && tries > 0) return void (raf = requestAnimationFrame(() => reveal(tries - 1)));
|
|
263
|
+
if (list) revealInList(list, list.querySelector("[data-checked=\"true\"]"));
|
|
264
|
+
};
|
|
265
|
+
reveal(6);
|
|
266
|
+
return () => cancelAnimationFrame(raf);
|
|
267
|
+
}, [open]);
|
|
268
|
+
const openWith = (q) => {
|
|
269
|
+
setQuery(q);
|
|
270
|
+
setOpen(true);
|
|
271
|
+
};
|
|
272
|
+
return /* @__PURE__ */ jsxs(Combobox.Root, {
|
|
273
|
+
value: current ?? null,
|
|
274
|
+
onValueChange: (v) => {
|
|
275
|
+
if (v == null) return;
|
|
276
|
+
setCurrent(v);
|
|
277
|
+
setOpen(false);
|
|
278
|
+
},
|
|
279
|
+
open,
|
|
280
|
+
onOpenChange: (o) => o ? openWith("") : setOpen(false),
|
|
281
|
+
inputValue: query,
|
|
282
|
+
onInputValueChange: (q, details) => {
|
|
283
|
+
if (details.reason === "input-change" || details.reason === "input-clear") setQuery(q);
|
|
284
|
+
},
|
|
285
|
+
items: shownValues,
|
|
286
|
+
filter: null,
|
|
287
|
+
autoHighlight: true,
|
|
288
|
+
loopFocus: true,
|
|
289
|
+
disabled,
|
|
290
|
+
children: [/* @__PURE__ */ jsxs(Combobox.Trigger, {
|
|
291
|
+
...a11y,
|
|
292
|
+
"data-state": open ? "open" : "closed",
|
|
293
|
+
"data-placeholder": selected ? void 0 : "",
|
|
294
|
+
className: cn(triggerClass(variant, size), triggerClassName, className),
|
|
295
|
+
onKeyDown: (e) => {
|
|
296
|
+
if (e.metaKey || e.ctrlKey || e.altKey) return;
|
|
297
|
+
if (e.key.length === 1 && e.key !== " ") {
|
|
298
|
+
e.preventDefault();
|
|
299
|
+
e.preventBaseUIHandler();
|
|
300
|
+
openWith(e.key);
|
|
301
|
+
} else if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
302
|
+
e.preventDefault();
|
|
303
|
+
e.preventBaseUIHandler();
|
|
304
|
+
openWith("");
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
308
|
+
className: "flex min-w-0 items-center gap-2 truncate [&_svg]:size-4 [&_svg]:text-kit-fg-3",
|
|
309
|
+
children: selected ? /* @__PURE__ */ jsxs(Fragment, { children: [selected.avatar ? /* @__PURE__ */ jsx(Avatar, {
|
|
310
|
+
name: selected.avatar.name,
|
|
311
|
+
src: selected.avatar.src,
|
|
312
|
+
size: 16,
|
|
313
|
+
decorative: true
|
|
314
|
+
}) : null, /* @__PURE__ */ jsx("span", {
|
|
315
|
+
className: "truncate",
|
|
316
|
+
children: selected.label
|
|
317
|
+
})] }) : /* @__PURE__ */ jsx("span", {
|
|
318
|
+
className: "truncate",
|
|
319
|
+
children: placeholder
|
|
320
|
+
})
|
|
321
|
+
}), /* @__PURE__ */ jsx(IconChevronDown, {
|
|
322
|
+
"aria-hidden": true,
|
|
323
|
+
className: "size-3.5 shrink-0 text-kit-fg-3 transition-transform group-data-[popup-open]:rotate-180"
|
|
324
|
+
})]
|
|
325
|
+
}), /* @__PURE__ */ jsx(Combobox.Portal, { children: /* @__PURE__ */ jsx(Combobox.Positioner, {
|
|
326
|
+
align,
|
|
327
|
+
sideOffset: 6,
|
|
328
|
+
collisionPadding: 12,
|
|
329
|
+
className: "z-[80]",
|
|
330
|
+
"data-floating-layer": "",
|
|
331
|
+
...KIT_SCOPE,
|
|
332
|
+
children: /* @__PURE__ */ jsxs(Combobox.Popup, {
|
|
333
|
+
className: cn(floatingClass, "flex max-h-[min(400px,var(--available-height))] w-[max(var(--anchor-width),240px)] max-w-[min(400px,calc(100vw-24px))] flex-col overflow-hidden", menuClassName),
|
|
334
|
+
children: [
|
|
335
|
+
/* @__PURE__ */ jsxs("div", {
|
|
336
|
+
className: "flex h-9 shrink-0 items-center gap-2 border-b border-kit-line-subtle px-2.5 text-kit-fg-3",
|
|
337
|
+
children: [/* @__PURE__ */ jsx(IconSearch, {
|
|
338
|
+
"aria-hidden": true,
|
|
339
|
+
className: "size-4 shrink-0"
|
|
340
|
+
}), /* @__PURE__ */ jsx(Combobox.Input, {
|
|
341
|
+
"aria-label": typeof a11y["aria-label"] === "string" ? a11y["aria-label"] : "Options",
|
|
342
|
+
placeholder: searchPlaceholder,
|
|
343
|
+
className: "h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-4"
|
|
344
|
+
})]
|
|
345
|
+
}),
|
|
346
|
+
shown.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
347
|
+
className: "px-2 py-6 text-center text-kit-sm text-kit-fg-3",
|
|
348
|
+
children: "No matches"
|
|
349
|
+
}) : null,
|
|
350
|
+
/* @__PURE__ */ jsx(Combobox.List, {
|
|
351
|
+
ref: listRef,
|
|
352
|
+
className: "min-h-0 flex-1 overflow-y-auto overscroll-contain p-1 empty:hidden",
|
|
353
|
+
children: grouped(shown).map((g, gi) => {
|
|
354
|
+
const items = g.items.map((o) => {
|
|
355
|
+
const text = nodeText(o.label);
|
|
356
|
+
const checked = o.value === current;
|
|
357
|
+
return /* @__PURE__ */ jsxs(Combobox.Item, {
|
|
358
|
+
value: o.value,
|
|
359
|
+
disabled: o.disabled,
|
|
360
|
+
"data-checked": checked,
|
|
361
|
+
className: itemClass,
|
|
362
|
+
children: [
|
|
363
|
+
/* @__PURE__ */ jsx(Lead, { o }),
|
|
364
|
+
/* @__PURE__ */ jsxs("div", {
|
|
365
|
+
className: "min-w-0 flex-1",
|
|
366
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
367
|
+
className: "truncate",
|
|
368
|
+
children: typeof o.label === "string" ? /* @__PURE__ */ jsx(Highlight, {
|
|
369
|
+
text,
|
|
370
|
+
query
|
|
371
|
+
}) : o.label
|
|
372
|
+
}), o.description ? /* @__PURE__ */ jsx("div", {
|
|
373
|
+
className: "truncate text-kit-xs text-kit-fg-3",
|
|
374
|
+
children: /* @__PURE__ */ jsx(Highlight, {
|
|
375
|
+
text: o.description,
|
|
376
|
+
query
|
|
377
|
+
})
|
|
378
|
+
}) : null]
|
|
379
|
+
}),
|
|
380
|
+
o.meta ? /* @__PURE__ */ jsx("span", {
|
|
381
|
+
className: "shrink-0 text-kit-xs tabular-nums text-kit-fg-3",
|
|
382
|
+
children: o.meta
|
|
383
|
+
}) : null,
|
|
384
|
+
checked ? /* @__PURE__ */ jsx(IconCheck, {
|
|
385
|
+
"aria-hidden": true,
|
|
386
|
+
className: "absolute right-2 size-4 !text-kit-fg"
|
|
387
|
+
}) : null
|
|
388
|
+
]
|
|
389
|
+
}, o.value);
|
|
390
|
+
});
|
|
391
|
+
return g.group ? /* @__PURE__ */ jsxs(Combobox.Group, { children: [/* @__PURE__ */ jsx(Combobox.GroupLabel, {
|
|
392
|
+
className: groupHeading,
|
|
393
|
+
children: g.group
|
|
394
|
+
}), items] }, g.group + gi) : /* @__PURE__ */ jsx(React.Fragment, { children: items }, "g" + gi);
|
|
395
|
+
})
|
|
396
|
+
})
|
|
397
|
+
]
|
|
398
|
+
})
|
|
399
|
+
}) })]
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
//#endregion
|
|
403
|
+
export { Highlight, SEARCH_THRESHOLD, Select$1 as Select, filterOptions, matchPositions, matchScore, nodeText, selectTriggerClass };
|
|
404
|
+
|
|
405
|
+
//# sourceMappingURL=select.js.map
|