@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,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACTION TRAY: Figma 61014:66265 "Bottom". The soft, slightly raised bar at the bottom of editors, inspectors,
|
|
3
|
+
* sheets and dialogs: surface → light grey gradient, 1px top hairline, 12px side padding, 6px vertical, 44px tall +
|
|
4
|
+
* hairline (a 32px button fits exactly). No blur (D21).
|
|
5
|
+
*
|
|
6
|
+
* <ActionTray meta={<TrayMeta name="Priya Nair" at={iso} onClick={openHistory} />}>
|
|
7
|
+
* <Button variant="primary" leftIcon={<IconUpload />}>Publish</Button>
|
|
8
|
+
* <TrayMore>…menu items…</TrayMore>
|
|
9
|
+
* </ActionTray>
|
|
10
|
+
*
|
|
11
|
+
* Use for sticky bottom ACTION bars only, never on cards or content areas.
|
|
12
|
+
*/
|
|
13
|
+
import * as React from "react";
|
|
14
|
+
/** Class string for footers that can't take the component (e.g. a shared footer primitive). */
|
|
15
|
+
export declare const actionTrayClass: string;
|
|
16
|
+
export declare function ActionTray({ meta, children, className, as: Tag, clearToasts, ...props }: Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
|
|
17
|
+
/** Left slot, usually <TrayMeta>. */
|
|
18
|
+
meta?: React.ReactNode;
|
|
19
|
+
/** Right slot: actions (primary last-but-one, ⋯ last). */
|
|
20
|
+
children?: React.ReactNode;
|
|
21
|
+
as?: "div" | "footer";
|
|
22
|
+
/** a page-level bar at the bottom of the window: bottom toasts sit above it, never over its buttons */
|
|
23
|
+
clearToasts?: boolean;
|
|
24
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
/** V2 relTime: "just now", "5m ago", "3h ago", "2d ago", "1w ago", then a date. */
|
|
26
|
+
export declare function relTime(at: string | number | Date, now?: number): string;
|
|
27
|
+
/**
|
|
28
|
+
* Left meta: avatar 20 · name 13/500 · "Edited 3h ago" 13 muted (Figma). The tooltip carries the full timestamp;
|
|
29
|
+
* when `onClick` is set the whole line is a button (opens History).
|
|
30
|
+
*/
|
|
31
|
+
export declare function TrayMeta({ name, avatarName, src, people, at, verb, note, onClick, actionHint, }: {
|
|
32
|
+
name: string;
|
|
33
|
+
/** Full name for the avatar when `name` is shortened ("You", first names). */
|
|
34
|
+
avatarName?: string;
|
|
35
|
+
src?: string;
|
|
36
|
+
/** Several editors → avatar stack (first is the last editor). */
|
|
37
|
+
people?: {
|
|
38
|
+
name: string;
|
|
39
|
+
src?: string;
|
|
40
|
+
}[];
|
|
41
|
+
/** When it was edited; omit for "just now" states you phrase yourself via `note`. */
|
|
42
|
+
at?: string | number | Date;
|
|
43
|
+
verb?: string;
|
|
44
|
+
/** Overrides the relative-time text, e.g. "Edited just now". */
|
|
45
|
+
note?: string;
|
|
46
|
+
onClick?: () => void;
|
|
47
|
+
actionHint?: string;
|
|
48
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
49
|
+
/** The tray's "⋯" (32×32 ghost, Figma "Button - Modal actions") opening a menu above the bar. Children are menu items. */
|
|
50
|
+
export declare function TrayMore({ label, children, menuClassName, }: {
|
|
51
|
+
label?: string;
|
|
52
|
+
children: React.ReactNode;
|
|
53
|
+
menuClassName?: string;
|
|
54
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { TRAY } from "./surfaces.js";
|
|
3
|
+
import { HintTooltip, IconButton } from "./button.js";
|
|
4
|
+
import { Menu, MenuContent, MenuTrigger } from "./overlay.js";
|
|
5
|
+
import { Avatar, AvatarStack } from "./display.js";
|
|
6
|
+
import * as React from "react";
|
|
7
|
+
import { IconDots } from "@tabler/icons-react";
|
|
8
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/kit/ui/action-tray.tsx
|
|
10
|
+
/**
|
|
11
|
+
* ACTION TRAY: Figma 61014:66265 "Bottom". The soft, slightly raised bar at the bottom of editors, inspectors,
|
|
12
|
+
* sheets and dialogs: surface → light grey gradient, 1px top hairline, 12px side padding, 6px vertical, 44px tall +
|
|
13
|
+
* hairline (a 32px button fits exactly). No blur (D21).
|
|
14
|
+
*
|
|
15
|
+
* <ActionTray meta={<TrayMeta name="Priya Nair" at={iso} onClick={openHistory} />}>
|
|
16
|
+
* <Button variant="primary" leftIcon={<IconUpload />}>Publish</Button>
|
|
17
|
+
* <TrayMore>…menu items…</TrayMore>
|
|
18
|
+
* </ActionTray>
|
|
19
|
+
*
|
|
20
|
+
* Use for sticky bottom ACTION bars only, never on cards or content areas.
|
|
21
|
+
*/
|
|
22
|
+
var clearing = /* @__PURE__ */ new Set();
|
|
23
|
+
function syncToastOffset() {
|
|
24
|
+
if (typeof document === "undefined") return;
|
|
25
|
+
let lift = 0;
|
|
26
|
+
for (const el of clearing) {
|
|
27
|
+
const r = el.getBoundingClientRect();
|
|
28
|
+
if (r.height) lift = Math.max(lift, window.innerHeight - r.top + 12);
|
|
29
|
+
}
|
|
30
|
+
if (lift > 0) document.documentElement.style.setProperty("--toast-offset-bottom", `${Math.round(lift)}px`);
|
|
31
|
+
else document.documentElement.style.removeProperty("--toast-offset-bottom");
|
|
32
|
+
}
|
|
33
|
+
function useToastClearance(ref, on) {
|
|
34
|
+
React.useLayoutEffect(() => {
|
|
35
|
+
const el = ref.current;
|
|
36
|
+
if (!on || !el) return;
|
|
37
|
+
clearing.add(el);
|
|
38
|
+
syncToastOffset();
|
|
39
|
+
const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(syncToastOffset) : null;
|
|
40
|
+
ro?.observe(el);
|
|
41
|
+
window.addEventListener("resize", syncToastOffset);
|
|
42
|
+
return () => {
|
|
43
|
+
clearing.delete(el);
|
|
44
|
+
ro?.disconnect();
|
|
45
|
+
window.removeEventListener("resize", syncToastOffset);
|
|
46
|
+
syncToastOffset();
|
|
47
|
+
};
|
|
48
|
+
}, [ref, on]);
|
|
49
|
+
}
|
|
50
|
+
/** Class string for footers that can't take the component (e.g. a shared footer primitive). */
|
|
51
|
+
var actionTrayClass = cn("shrink-0 border-t", TRAY);
|
|
52
|
+
function ActionTray({ meta, children, className, as: Tag = "div", clearToasts = false, ...props }) {
|
|
53
|
+
const ref = React.useRef(null);
|
|
54
|
+
useToastClearance(ref, clearToasts);
|
|
55
|
+
return /* @__PURE__ */ jsxs(Tag, {
|
|
56
|
+
ref,
|
|
57
|
+
"data-action-tray": "",
|
|
58
|
+
className: cn(actionTrayClass, "@container/tray flex min-h-[45px] items-center justify-between gap-2 px-3 py-1.5", className),
|
|
59
|
+
...props,
|
|
60
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
61
|
+
className: "flex min-w-0 flex-1 items-center gap-2",
|
|
62
|
+
children: meta
|
|
63
|
+
}), children ? /* @__PURE__ */ jsx("div", {
|
|
64
|
+
className: "flex shrink-0 items-center gap-[5px]",
|
|
65
|
+
children
|
|
66
|
+
}) : null]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** V2 relTime: "just now", "5m ago", "3h ago", "2d ago", "1w ago", then a date. */
|
|
70
|
+
function relTime(at, now = Date.now()) {
|
|
71
|
+
const s = Math.round((now - new Date(at).getTime()) / 1e3);
|
|
72
|
+
if (s < 45) return "just now";
|
|
73
|
+
const m = Math.round(s / 60);
|
|
74
|
+
if (m < 60) return `${m}m ago`;
|
|
75
|
+
const h = Math.round(m / 60);
|
|
76
|
+
if (h < 24) return `${h}h ago`;
|
|
77
|
+
const days = Math.round(h / 24);
|
|
78
|
+
if (days < 7) return `${days}d ago`;
|
|
79
|
+
const w = Math.round(days / 7);
|
|
80
|
+
if (w < 5) return `${w}w ago`;
|
|
81
|
+
return new Date(at).toLocaleDateString("en-US", {
|
|
82
|
+
month: "short",
|
|
83
|
+
day: "numeric",
|
|
84
|
+
year: "numeric"
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
var fullStamp = (at) => new Date(at).toLocaleString("en-US", {
|
|
88
|
+
weekday: "short",
|
|
89
|
+
month: "short",
|
|
90
|
+
day: "numeric",
|
|
91
|
+
year: "numeric",
|
|
92
|
+
hour: "numeric",
|
|
93
|
+
minute: "2-digit"
|
|
94
|
+
});
|
|
95
|
+
/**
|
|
96
|
+
* Left meta: avatar 20 · name 13/500 · "Edited 3h ago" 13 muted (Figma). The tooltip carries the full timestamp;
|
|
97
|
+
* when `onClick` is set the whole line is a button (opens History).
|
|
98
|
+
*/
|
|
99
|
+
function TrayMeta({ name, avatarName, src, people, at, verb = "Edited", note, onClick, actionHint = "Open history" }) {
|
|
100
|
+
const when = note ?? (at ? `${verb} ${relTime(at).replace("just now", "a moment ago")}` : verb);
|
|
101
|
+
const inner = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("span", {
|
|
102
|
+
className: "flex shrink-0 items-center gap-1",
|
|
103
|
+
children: [people && people.length > 1 ? /* @__PURE__ */ jsx(AvatarStack, {
|
|
104
|
+
people,
|
|
105
|
+
size: 20,
|
|
106
|
+
max: 3
|
|
107
|
+
}) : /* @__PURE__ */ jsx(Avatar, {
|
|
108
|
+
name: avatarName ?? name,
|
|
109
|
+
src,
|
|
110
|
+
size: 20,
|
|
111
|
+
decorative: true
|
|
112
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
113
|
+
className: "hidden whitespace-nowrap text-kit-sm font-medium text-kit-fg @[34rem]/tray:inline",
|
|
114
|
+
children: name
|
|
115
|
+
})]
|
|
116
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
117
|
+
className: "hidden min-w-0 truncate text-kit-sm text-kit-fg-3 @[34rem]/tray:inline",
|
|
118
|
+
children: when
|
|
119
|
+
})] });
|
|
120
|
+
return /* @__PURE__ */ jsx(HintTooltip, {
|
|
121
|
+
content: at ? `${name} · ${verb} ${fullStamp(at)}${onClick ? ` · ${actionHint}` : ""}` : onClick ? `${name} · ${when} · ${actionHint}` : `${name} · ${when}`,
|
|
122
|
+
children: onClick ? /* @__PURE__ */ jsx("button", {
|
|
123
|
+
type: "button",
|
|
124
|
+
onClick,
|
|
125
|
+
"aria-label": `${name}, ${when}. ${actionHint}`,
|
|
126
|
+
className: "-mx-1 flex min-w-0 items-center gap-2 rounded-kit-md px-1 py-0.5 transition-colors hover:bg-kit-hover",
|
|
127
|
+
children: inner
|
|
128
|
+
}) : /* @__PURE__ */ jsxs("span", {
|
|
129
|
+
className: "flex min-w-0 items-center gap-2",
|
|
130
|
+
children: [inner, /* @__PURE__ */ jsx("span", {
|
|
131
|
+
className: "sr-only @[34rem]/tray:hidden",
|
|
132
|
+
children: `${name}, ${when}`
|
|
133
|
+
})]
|
|
134
|
+
})
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/** The tray's "⋯" (32×32 ghost, Figma "Button - Modal actions") opening a menu above the bar. Children are menu items. */
|
|
138
|
+
function TrayMore({ label = "More options", children, menuClassName }) {
|
|
139
|
+
return /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
|
|
140
|
+
label,
|
|
141
|
+
size: "md",
|
|
142
|
+
children: /* @__PURE__ */ jsx(IconDots, { "aria-hidden": true })
|
|
143
|
+
}) }), /* @__PURE__ */ jsx(MenuContent, {
|
|
144
|
+
side: "top",
|
|
145
|
+
align: "end",
|
|
146
|
+
className: cn("w-60 font-kit-sans", menuClassName),
|
|
147
|
+
children
|
|
148
|
+
})] });
|
|
149
|
+
}
|
|
150
|
+
//#endregion
|
|
151
|
+
export { ActionTray, TrayMeta, TrayMore, actionTrayClass, relTime };
|
|
152
|
+
|
|
153
|
+
//# sourceMappingURL=action-tray.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-tray.js","names":[],"sources":["../../src/kit/ui/action-tray.tsx"],"sourcesContent":["/**\n * ACTION TRAY: Figma 61014:66265 \"Bottom\". The soft, slightly raised bar at the bottom of editors, inspectors,\n * sheets and dialogs: surface → light grey gradient, 1px top hairline, 12px side padding, 6px vertical, 44px tall +\n * hairline (a 32px button fits exactly). No blur (D21).\n *\n * <ActionTray meta={<TrayMeta name=\"Priya Nair\" at={iso} onClick={openHistory} />}>\n * <Button variant=\"primary\" leftIcon={<IconUpload />}>Publish</Button>\n * <TrayMore>…menu items…</TrayMore>\n * </ActionTray>\n *\n * Use for sticky bottom ACTION bars only, never on cards or content areas.\n */\nimport * as React from \"react\";\nimport { IconDots } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { HintTooltip, IconButton } from \"./button\";\nimport { Avatar, AvatarStack } from \"./display\";\nimport { Menu, MenuContent, MenuTrigger } from \"./overlay\";\nimport { TRAY } from \"./surfaces\";\n\n/* ── Toasts clear the tray (S1: a toast covered the schema draft bar's Apply) ─────────────────────────────────────────\n A tray with `clearToasts` lifts the app's bottom toasts above itself while it is mounted: it writes\n `--toast-offset-bottom` on the root (the host's Toaster reads it as its bottom offset), the highest tray winning. */\nconst clearing = new Set<HTMLElement>();\nfunction syncToastOffset() {\n if (typeof document === \"undefined\") return;\n let lift = 0;\n for (const el of clearing) {\n const r = el.getBoundingClientRect();\n if (r.height) lift = Math.max(lift, window.innerHeight - r.top + 12);\n }\n if (lift > 0) document.documentElement.style.setProperty(\"--toast-offset-bottom\", `${Math.round(lift)}px`);\n else document.documentElement.style.removeProperty(\"--toast-offset-bottom\");\n}\nfunction useToastClearance(ref: React.RefObject<HTMLElement | null>, on: boolean) {\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!on || !el) return;\n clearing.add(el);\n syncToastOffset();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(syncToastOffset) : null;\n ro?.observe(el);\n window.addEventListener(\"resize\", syncToastOffset);\n return () => {\n clearing.delete(el);\n ro?.disconnect();\n window.removeEventListener(\"resize\", syncToastOffset);\n syncToastOffset();\n };\n }, [ref, on]);\n}\n\n/** Class string for footers that can't take the component (e.g. a shared footer primitive). */\nexport const actionTrayClass = cn(\"shrink-0 border-t\", TRAY);\n\nexport function ActionTray({\n meta,\n children,\n className,\n as: Tag = \"div\",\n clearToasts = false,\n ...props\n}: Omit<React.HTMLAttributes<HTMLElement>, \"children\"> & {\n /** Left slot, usually <TrayMeta>. */\n meta?: React.ReactNode;\n /** Right slot: actions (primary last-but-one, ⋯ last). */\n children?: React.ReactNode;\n as?: \"div\" | \"footer\";\n /** a page-level bar at the bottom of the window: bottom toasts sit above it, never over its buttons */\n clearToasts?: boolean;\n}) {\n const ref = React.useRef<HTMLElement>(null);\n useToastClearance(ref, clearToasts);\n return (\n <Tag\n ref={ref as React.Ref<HTMLDivElement>}\n data-action-tray=\"\"\n className={cn(actionTrayClass, \"@container/tray flex min-h-[45px] items-center justify-between gap-2 px-3 py-1.5\", className)}\n {...props}\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">{meta}</div>\n {children ? <div className=\"flex shrink-0 items-center gap-[5px]\">{children}</div> : null}\n </Tag>\n );\n}\n\n/** V2 relTime: \"just now\", \"5m ago\", \"3h ago\", \"2d ago\", \"1w ago\", then a date. */\nexport function relTime(at: string | number | Date, now = Date.now()) {\n const s = Math.round((now - new Date(at).getTime()) / 1000);\n if (s < 45) return \"just now\";\n const m = Math.round(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60);\n if (h < 24) return `${h}h ago`;\n const days = Math.round(h / 24);\n if (days < 7) return `${days}d ago`;\n const w = Math.round(days / 7);\n if (w < 5) return `${w}w ago`;\n return new Date(at).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", year: \"numeric\" });\n}\n\nconst fullStamp = (at: string | number | Date) =>\n new Date(at).toLocaleString(\"en-US\", { weekday: \"short\", month: \"short\", day: \"numeric\", year: \"numeric\", hour: \"numeric\", minute: \"2-digit\" });\n\n/**\n * Left meta: avatar 20 · name 13/500 · \"Edited 3h ago\" 13 muted (Figma). The tooltip carries the full timestamp;\n * when `onClick` is set the whole line is a button (opens History).\n */\nexport function TrayMeta({\n name,\n avatarName,\n src,\n people,\n at,\n verb = \"Edited\",\n note,\n onClick,\n actionHint = \"Open history\",\n}: {\n name: string;\n /** Full name for the avatar when `name` is shortened (\"You\", first names). */\n avatarName?: string;\n src?: string;\n /** Several editors → avatar stack (first is the last editor). */\n people?: { name: string; src?: string }[];\n /** When it was edited; omit for \"just now\" states you phrase yourself via `note`. */\n at?: string | number | Date;\n verb?: string;\n /** Overrides the relative-time text, e.g. \"Edited just now\". */\n note?: string;\n onClick?: () => void;\n actionHint?: string;\n}) {\n const when = note ?? (at ? `${verb} ${relTime(at).replace(\"just now\", \"a moment ago\")}` : verb);\n const inner = (\n <>\n <span className=\"flex shrink-0 items-center gap-1\">\n {people && people.length > 1 ? (\n <AvatarStack people={people} size={20} max={3} />\n ) : (\n <Avatar name={avatarName ?? name} src={src} size={20} decorative />\n )}\n {/* narrow trays (the grid drawer): just the avatar, the words move into the tooltip; never a clipped \"Edit…\" */}\n <span className=\"hidden whitespace-nowrap text-kit-sm font-medium text-kit-fg @[34rem]/tray:inline\">{name}</span>\n </span>\n <span className=\"hidden min-w-0 truncate text-kit-sm text-kit-fg-3 @[34rem]/tray:inline\">{when}</span>\n </>\n );\n const tip = at\n ? `${name} · ${verb} ${fullStamp(at)}${onClick ? ` · ${actionHint}` : \"\"}`\n : onClick\n ? `${name} · ${when} · ${actionHint}`\n : `${name} · ${when}`;\n const body = onClick ? (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={`${name}, ${when}. ${actionHint}`}\n className=\"-mx-1 flex min-w-0 items-center gap-2 rounded-kit-md px-1 py-0.5 transition-colors hover:bg-kit-hover\"\n >\n {inner}\n </button>\n ) : (\n <span className=\"flex min-w-0 items-center gap-2\">\n {inner}\n {/* the words hide in narrow trays; screen readers always get them */}\n <span className=\"sr-only @[34rem]/tray:hidden\">{`${name}, ${when}`}</span>\n </span>\n );\n return <HintTooltip content={tip}>{body}</HintTooltip>;\n}\n\n/** The tray's \"⋯\" (32×32 ghost, Figma \"Button - Modal actions\") opening a menu above the bar. Children are menu items. */\nexport function TrayMore({\n label = \"More options\",\n children,\n menuClassName,\n}: {\n label?: string;\n children: React.ReactNode;\n menuClassName?: string;\n}) {\n return (\n // the kit Menu: §12 dismiss guards, the modal-layer marker (an open tooltip closes) and V2's non-looping arrows\n <Menu>\n <MenuTrigger\n render={\n <IconButton label={label} size=\"md\">\n <IconDots aria-hidden />\n </IconButton>\n }\n />\n <MenuContent side=\"top\" align=\"end\" className={cn(\"w-60 font-kit-sans\", menuClassName)}>\n {children}\n </MenuContent>\n </Menu>\n );\n}\n"],"mappings":"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"}
|
package/ui/button.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VariantProps } from "./variants";
|
|
3
|
+
/**
|
|
4
|
+
* Button: the only button in the kit.
|
|
5
|
+
* Heights: xs 24 · sm 28 · md 32 (default) · lg 36 · xl 40. Radius 6.
|
|
6
|
+
* Variants: primary (ink) · accent (violet, reserved for the ONE create action per screen)
|
|
7
|
+
* secondary (bordered) · ghost · soft · danger · danger-ghost · link · ai (gradient sparkle)
|
|
8
|
+
* The keyboard focus ring is the global :focus-visible outline, suppressed under pointer modality (DESIGN.md 3.7).
|
|
9
|
+
*/
|
|
10
|
+
export declare const buttonVariants: (props?: {
|
|
11
|
+
variant?: "accent" | "link" | "primary" | "secondary" | "ghost" | "soft" | "danger" | "danger-ghost" | "ai" | null | undefined;
|
|
12
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl" | null | undefined;
|
|
13
|
+
} | undefined) => string;
|
|
14
|
+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
|
|
15
|
+
/** Render the single child element (a link, say) with the button's classes and props. */
|
|
16
|
+
asChild?: boolean;
|
|
17
|
+
loading?: boolean;
|
|
18
|
+
leftIcon?: React.ReactNode;
|
|
19
|
+
rightIcon?: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
export declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
22
|
+
/** Square icon-only button. Always pass `label` (used for aria-label + tooltip). */
|
|
23
|
+
export declare const iconButtonVariants: (props?: {
|
|
24
|
+
size?: "xs" | "sm" | "md" | "lg" | null | undefined;
|
|
25
|
+
variant?: "outline" | "ghost" | "soft" | null | undefined;
|
|
26
|
+
} | undefined) => string;
|
|
27
|
+
/**
|
|
28
|
+
* a11y: true while rendering inside a tooltip (or a surface that manages its own hints), so an IconButton nested
|
|
29
|
+
* there doesn't add a second tooltip. Provided by HintTooltip and overlay.tsx's <Tooltip>.
|
|
30
|
+
*/
|
|
31
|
+
export declare const TooltipScope: React.Context<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* The plain ink hint (DESIGN.md 8.23: top, 6px offset, 8px collision padding, portalled, z 90, 350ms). The child
|
|
34
|
+
* element is the trigger and must take a ref and DOM props. input, display and action-tray use it so they never
|
|
35
|
+
* import overlay.tsx; overlay's <Tooltip> adds the shortcut slot on top of the same layer.
|
|
36
|
+
*/
|
|
37
|
+
export declare function HintTooltip({ content, side, delay, children, }: {
|
|
38
|
+
content: React.ReactNode;
|
|
39
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
40
|
+
delay?: number;
|
|
41
|
+
children: React.ReactElement;
|
|
42
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
export interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof iconButtonVariants> {
|
|
44
|
+
label: string;
|
|
45
|
+
active?: boolean;
|
|
46
|
+
/** Hover/focus hint. Defaults to `label`; pass `false` to opt out, or a node to customise. */
|
|
47
|
+
tooltip?: React.ReactNode | false;
|
|
48
|
+
tooltipSide?: "top" | "bottom" | "left" | "right";
|
|
49
|
+
}
|
|
50
|
+
export declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
51
|
+
/** The AI sparkle in the official brand gradient. Used everywhere AI appears. */
|
|
52
|
+
export declare function Sparkle({ className, size }: {
|
|
53
|
+
className?: string;
|
|
54
|
+
size?: number;
|
|
55
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
56
|
+
/** D15 progressive disclosure: "+ Add a message" / "+ Limit to specific sites": reveals an optional input. */
|
|
57
|
+
export declare function RevealLink({ className, children, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>): import("react/jsx-runtime").JSX.Element;
|
package/ui/button.js
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { SPARKLE_PATH } from "../brand/logo.js";
|
|
3
|
+
import { TooltipLayer, TooltipRoot } from "./tooltip-root.js";
|
|
4
|
+
import { variants } from "./variants.js";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { IconLoader2, IconPlus } from "@tabler/icons-react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { Tooltip } from "@base-ui/react/tooltip";
|
|
9
|
+
//#region src/kit/ui/button.tsx
|
|
10
|
+
/**
|
|
11
|
+
* Button: the only button in the kit.
|
|
12
|
+
* Heights: xs 24 · sm 28 · md 32 (default) · lg 36 · xl 40. Radius 6.
|
|
13
|
+
* Variants: primary (ink) · accent (violet, reserved for the ONE create action per screen)
|
|
14
|
+
* secondary (bordered) · ghost · soft · danger · danger-ghost · link · ai (gradient sparkle)
|
|
15
|
+
* The keyboard focus ring is the global :focus-visible outline, suppressed under pointer modality (DESIGN.md 3.7).
|
|
16
|
+
*/
|
|
17
|
+
var buttonVariants = variants("relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-medium tracking-[-0.01em] select-none transition-[background-color,border-color,color,box-shadow,opacity] duration-150 ease-out disabled:pointer-events-none disabled:opacity-45 [&_svg]:shrink-0 [&_svg]:opacity-90", {
|
|
18
|
+
variants: {
|
|
19
|
+
variant: {
|
|
20
|
+
primary: "bg-kit-inverse text-kit-fg-inverse shadow-[var(--kit-shadow-button-primary)] hover:bg-kit-inverse-hover active:bg-kit-inverse",
|
|
21
|
+
accent: "bg-kit-accent text-kit-accent-on shadow-kit-xs hover:bg-kit-accent-hover",
|
|
22
|
+
secondary: "border border-kit-line-strong bg-kit-control-bg text-kit-fg shadow-kit-xs hover:bg-kit-subtle active:bg-kit-hover",
|
|
23
|
+
ghost: "text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg active:bg-kit-selected",
|
|
24
|
+
soft: "bg-kit-muted text-kit-fg hover:bg-kit-selected",
|
|
25
|
+
danger: "bg-kit-danger text-kit-danger-on shadow-kit-xs hover:brightness-95",
|
|
26
|
+
"danger-ghost": "text-kit-danger-fg hover:bg-kit-danger-soft",
|
|
27
|
+
link: "text-kit-accent-fg underline-offset-4 hover:underline px-0 h-auto active:scale-100",
|
|
28
|
+
ai: "border border-kit-line bg-kit-control-bg text-kit-fg shadow-kit-xs hover:border-kit-accent-line hover:bg-kit-accent-softer"
|
|
29
|
+
},
|
|
30
|
+
size: {
|
|
31
|
+
xs: "h-6 rounded-kit-md px-2 text-kit-xs [&_svg]:size-3.5",
|
|
32
|
+
sm: "h-7 rounded-kit-md px-2.5 text-kit-sm [&_svg]:size-3.5",
|
|
33
|
+
md: "h-8 rounded-kit-md px-3 text-kit-sm [&_svg]:size-4",
|
|
34
|
+
lg: "h-9 rounded-kit-md px-3.5 text-kit-base [&_svg]:size-4",
|
|
35
|
+
xl: "h-10 rounded-kit-md px-4 text-kit-base [&_svg]:size-[18px]"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
compoundVariants: [{
|
|
39
|
+
variant: "link",
|
|
40
|
+
className: "h-auto px-0"
|
|
41
|
+
}],
|
|
42
|
+
defaultVariants: {
|
|
43
|
+
variant: "secondary",
|
|
44
|
+
size: "md"
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
var SOLID_DISABLED = "[.dark_&]:disabled:bg-[#2a2a2d] [.dark_&]:disabled:text-[#9e9ea1] [.dark_&]:disabled:opacity-100 [.dark_&]:disabled:shadow-none";
|
|
48
|
+
function mergeRefs(...refs) {
|
|
49
|
+
return (node) => {
|
|
50
|
+
for (const ref of refs) if (typeof ref === "function") ref(node);
|
|
51
|
+
else if (ref) ref.current = node;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
var Button = React.forwardRef(({ className, variant, size, asChild, loading, leftIcon, rightIcon, children, disabled, ...props }, ref) => {
|
|
55
|
+
const classes = cn(buttonVariants({
|
|
56
|
+
variant,
|
|
57
|
+
size
|
|
58
|
+
}), (variant === "primary" || variant === "accent") && SOLID_DISABLED, className);
|
|
59
|
+
if (asChild && React.isValidElement(children)) return React.cloneElement(children, {
|
|
60
|
+
...props,
|
|
61
|
+
...children.props,
|
|
62
|
+
className: cn(classes, children.props.className),
|
|
63
|
+
ref: mergeRefs(ref, children.props.ref)
|
|
64
|
+
});
|
|
65
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
66
|
+
ref,
|
|
67
|
+
type: props.type ?? "button",
|
|
68
|
+
disabled: disabled || loading,
|
|
69
|
+
"aria-busy": loading || void 0,
|
|
70
|
+
className: classes,
|
|
71
|
+
...props,
|
|
72
|
+
children: [
|
|
73
|
+
loading ? /* @__PURE__ */ jsx(IconLoader2, {
|
|
74
|
+
className: "animate-spin",
|
|
75
|
+
"aria-hidden": true
|
|
76
|
+
}) : leftIcon,
|
|
77
|
+
variant === "ai" && !leftIcon && !loading ? /* @__PURE__ */ jsx(Sparkle, {}) : null,
|
|
78
|
+
children,
|
|
79
|
+
rightIcon
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
Button.displayName = "Button";
|
|
84
|
+
/** Square icon-only button. Always pass `label` (used for aria-label + tooltip). */
|
|
85
|
+
var iconButtonVariants = variants("relative inline-flex items-center justify-center shrink-0 text-kit-fg-2 transition-colors duration-150 hover:bg-kit-hover hover:text-kit-fg active:scale-[0.96] disabled:opacity-40 disabled:pointer-events-none data-[active=true]:bg-kit-selected data-[active=true]:text-kit-fg data-[popup-open]:bg-kit-selected data-[popup-open]:text-kit-fg", {
|
|
86
|
+
variants: {
|
|
87
|
+
size: {
|
|
88
|
+
xs: "size-6 rounded-kit-md [&_svg]:size-3.5",
|
|
89
|
+
sm: "size-7 rounded-kit-md [&_svg]:size-4",
|
|
90
|
+
md: "size-8 rounded-kit-md [&_svg]:size-4",
|
|
91
|
+
lg: "size-9 rounded-kit-md [&_svg]:size-[18px]"
|
|
92
|
+
},
|
|
93
|
+
variant: {
|
|
94
|
+
ghost: "",
|
|
95
|
+
outline: "border border-kit-line bg-kit-control-bg shadow-kit-xs hover:border-kit-line-strong",
|
|
96
|
+
soft: "bg-kit-muted"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
defaultVariants: {
|
|
100
|
+
size: "md",
|
|
101
|
+
variant: "ghost"
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* a11y: true while rendering inside a tooltip (or a surface that manages its own hints), so an IconButton nested
|
|
106
|
+
* there doesn't add a second tooltip. Provided by HintTooltip and overlay.tsx's <Tooltip>.
|
|
107
|
+
*/
|
|
108
|
+
var TooltipScope = React.createContext(false);
|
|
109
|
+
/**
|
|
110
|
+
* The plain ink hint (DESIGN.md 8.23: top, 6px offset, 8px collision padding, portalled, z 90, 350ms). The child
|
|
111
|
+
* element is the trigger and must take a ref and DOM props. input, display and action-tray use it so they never
|
|
112
|
+
* import overlay.tsx; overlay's <Tooltip> adds the shortcut slot on top of the same layer.
|
|
113
|
+
*/
|
|
114
|
+
function HintTooltip({ content, side = "top", delay = 350, children }) {
|
|
115
|
+
return /* @__PURE__ */ jsx(TooltipScope.Provider, {
|
|
116
|
+
value: true,
|
|
117
|
+
children: /* @__PURE__ */ jsxs(TooltipRoot, { children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
|
|
118
|
+
delay,
|
|
119
|
+
render: children
|
|
120
|
+
}), /* @__PURE__ */ jsx(TooltipLayer, {
|
|
121
|
+
side,
|
|
122
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
123
|
+
className: "line-clamp-[8] min-w-0 whitespace-normal [overflow-wrap:anywhere]",
|
|
124
|
+
children: content
|
|
125
|
+
})
|
|
126
|
+
})] })
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
var IconButton = React.forwardRef(({ className, size, variant, label, active, children, tooltip, tooltipSide = "top", ...props }, ref) => {
|
|
130
|
+
const inTooltip = React.useContext(TooltipScope);
|
|
131
|
+
const btn = /* @__PURE__ */ jsx("button", {
|
|
132
|
+
ref,
|
|
133
|
+
type: "button",
|
|
134
|
+
"aria-label": label,
|
|
135
|
+
"data-active": active ? "true" : void 0,
|
|
136
|
+
className: cn(iconButtonVariants({
|
|
137
|
+
size,
|
|
138
|
+
variant
|
|
139
|
+
}), className),
|
|
140
|
+
...props,
|
|
141
|
+
children
|
|
142
|
+
});
|
|
143
|
+
if (inTooltip || tooltip === false || !label) return btn;
|
|
144
|
+
return /* @__PURE__ */ jsx(HintTooltip, {
|
|
145
|
+
content: tooltip ?? label,
|
|
146
|
+
side: tooltipSide,
|
|
147
|
+
children: btn
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
IconButton.displayName = "IconButton";
|
|
151
|
+
/** The AI sparkle in the official brand gradient. Used everywhere AI appears. */
|
|
152
|
+
function Sparkle({ className, size = 16 }) {
|
|
153
|
+
const id = React.useId().replace(/:/g, "");
|
|
154
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
155
|
+
width: size,
|
|
156
|
+
height: size,
|
|
157
|
+
viewBox: "2 2 16 16",
|
|
158
|
+
className: cn("shrink-0", className),
|
|
159
|
+
"aria-hidden": true,
|
|
160
|
+
children: [/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", {
|
|
161
|
+
id: `sp${id}`,
|
|
162
|
+
x1: "6.89",
|
|
163
|
+
y1: "4.59",
|
|
164
|
+
x2: "18",
|
|
165
|
+
y2: "23.67",
|
|
166
|
+
gradientUnits: "userSpaceOnUse",
|
|
167
|
+
children: [
|
|
168
|
+
/* @__PURE__ */ jsx("stop", {
|
|
169
|
+
offset: "0.0817",
|
|
170
|
+
style: { stopColor: "var(--kit-brand-violet)" }
|
|
171
|
+
}),
|
|
172
|
+
/* @__PURE__ */ jsx("stop", {
|
|
173
|
+
offset: "0.4667",
|
|
174
|
+
style: { stopColor: "var(--kit-brand-coral)" }
|
|
175
|
+
}),
|
|
176
|
+
/* @__PURE__ */ jsx("stop", {
|
|
177
|
+
offset: "1",
|
|
178
|
+
style: { stopColor: "var(--kit-brand-rose)" }
|
|
179
|
+
})
|
|
180
|
+
]
|
|
181
|
+
}) }), /* @__PURE__ */ jsx("path", {
|
|
182
|
+
d: SPARKLE_PATH,
|
|
183
|
+
fill: `url(#sp${id})`
|
|
184
|
+
})]
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/** D15 progressive disclosure: "+ Add a message" / "+ Limit to specific sites": reveals an optional input. */
|
|
188
|
+
function RevealLink({ className, children, ...props }) {
|
|
189
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
190
|
+
type: "button",
|
|
191
|
+
className: cn("inline-flex h-7 items-center gap-1 rounded-kit-md text-kit-sm font-medium text-kit-fg-2 transition-colors hover:text-kit-fg [&_svg]:size-3.5", className),
|
|
192
|
+
...props,
|
|
193
|
+
children: [/* @__PURE__ */ jsx(IconPlus, {
|
|
194
|
+
stroke: 2,
|
|
195
|
+
"aria-hidden": true
|
|
196
|
+
}), children]
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
//#endregion
|
|
200
|
+
export { Button, HintTooltip, IconButton, RevealLink, Sparkle, TooltipScope, buttonVariants, iconButtonVariants };
|
|
201
|
+
|
|
202
|
+
//# sourceMappingURL=button.js.map
|
package/ui/button.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","names":[],"sources":["../../src/kit/ui/button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { IconLoader2, IconPlus } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { SPARKLE_PATH } from \"../brand/logo\";\nimport { TooltipLayer, TooltipRoot } from \"./tooltip-root\";\nimport { variants, type VariantProps } from \"./variants\";\n\n/**\n * Button: the only button in the kit.\n * Heights: xs 24 · sm 28 · md 32 (default) · lg 36 · xl 40. Radius 6.\n * Variants: primary (ink) · accent (violet, reserved for the ONE create action per screen)\n * secondary (bordered) · ghost · soft · danger · danger-ghost · link · ai (gradient sparkle)\n * The keyboard focus ring is the global :focus-visible outline, suppressed under pointer modality (DESIGN.md 3.7).\n */\nexport const buttonVariants = variants(\n \"relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap font-medium tracking-[-0.01em] select-none transition-[background-color,border-color,color,box-shadow,opacity] duration-150 ease-out disabled:pointer-events-none disabled:opacity-45 [&_svg]:shrink-0 [&_svg]:opacity-90\",\n {\n variants: {\n variant: {\n primary:\n \"bg-kit-inverse text-kit-fg-inverse shadow-[var(--kit-shadow-button-primary)] hover:bg-kit-inverse-hover active:bg-kit-inverse\",\n accent: \"bg-kit-accent text-kit-accent-on shadow-kit-xs hover:bg-kit-accent-hover\",\n secondary: \"border border-kit-line-strong bg-kit-control-bg text-kit-fg shadow-kit-xs hover:bg-kit-subtle active:bg-kit-hover\",\n ghost: \"text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg active:bg-kit-selected\",\n soft: \"bg-kit-muted text-kit-fg hover:bg-kit-selected\",\n danger: \"bg-kit-danger text-kit-danger-on shadow-kit-xs hover:brightness-95\",\n \"danger-ghost\": \"text-kit-danger-fg hover:bg-kit-danger-soft\",\n link: \"text-kit-accent-fg underline-offset-4 hover:underline px-0 h-auto active:scale-100\",\n ai: \"border border-kit-line bg-kit-control-bg text-kit-fg shadow-kit-xs hover:border-kit-accent-line hover:bg-kit-accent-softer\",\n },\n size: {\n xs: \"h-6 rounded-kit-md px-2 text-kit-xs [&_svg]:size-3.5\",\n sm: \"h-7 rounded-kit-md px-2.5 text-kit-sm [&_svg]:size-3.5\",\n md: \"h-8 rounded-kit-md px-3 text-kit-sm [&_svg]:size-4\",\n lg: \"h-9 rounded-kit-md px-3.5 text-kit-base [&_svg]:size-4\",\n xl: \"h-10 rounded-kit-md px-4 text-kit-base [&_svg]:size-[18px]\",\n },\n },\n compoundVariants: [{ variant: \"link\", className: \"h-auto px-0\" }],\n defaultVariants: { variant: \"secondary\", size: \"md\" },\n },\n);\n\n/* .btn-solid (V2): in dark a disabled primary/accent takes the solid disabled pair instead of the opacity dim. */\nconst SOLID_DISABLED = \"[.dark_&]:disabled:bg-[#2a2a2d] [.dark_&]:disabled:text-[#9e9ea1] [.dark_&]:disabled:opacity-100 [.dark_&]:disabled:shadow-none\";\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n /** Render the single child element (a link, say) with the button's classes and props. */\n asChild?: boolean;\n loading?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\ntype ChildProps = { className?: string; ref?: React.Ref<unknown> };\n\nfunction mergeRefs<T>(...refs: (React.Ref<T> | undefined)[]) {\n return (node: T | null) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.RefObject<T | null>).current = node;\n }\n };\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild, loading, leftIcon, rightIcon, children, disabled, ...props }, ref) => {\n const classes = cn(buttonVariants({ variant, size }), (variant === \"primary\" || variant === \"accent\") && SOLID_DISABLED, className);\n if (asChild && React.isValidElement<ChildProps>(children)) {\n return React.cloneElement(children, {\n ...props,\n ...children.props,\n className: cn(classes, children.props.className),\n ref: mergeRefs(ref as React.Ref<unknown>, children.props.ref),\n });\n }\n return (\n <button ref={ref} type={props.type ?? \"button\"} disabled={disabled || loading} aria-busy={loading || undefined} className={classes} {...props}>\n {loading ? <IconLoader2 className=\"animate-spin\" aria-hidden /> : leftIcon}\n {variant === \"ai\" && !leftIcon && !loading ? <Sparkle /> : null}\n {children}\n {rightIcon}\n </button>\n );\n },\n);\nButton.displayName = \"Button\";\n\n/** Square icon-only button. Always pass `label` (used for aria-label + tooltip). */\nexport const iconButtonVariants = variants(\n \"relative inline-flex items-center justify-center shrink-0 text-kit-fg-2 transition-colors duration-150 hover:bg-kit-hover hover:text-kit-fg active:scale-[0.96] disabled:opacity-40 disabled:pointer-events-none data-[active=true]:bg-kit-selected data-[active=true]:text-kit-fg data-[popup-open]:bg-kit-selected data-[popup-open]:text-kit-fg\",\n {\n variants: {\n size: {\n xs: \"size-6 rounded-kit-md [&_svg]:size-3.5\",\n sm: \"size-7 rounded-kit-md [&_svg]:size-4\",\n md: \"size-8 rounded-kit-md [&_svg]:size-4\",\n lg: \"size-9 rounded-kit-md [&_svg]:size-[18px]\",\n },\n variant: {\n ghost: \"\",\n outline: \"border border-kit-line bg-kit-control-bg shadow-kit-xs hover:border-kit-line-strong\",\n soft: \"bg-kit-muted\",\n },\n },\n defaultVariants: { size: \"md\", variant: \"ghost\" },\n },\n);\n\n/**\n * a11y: true while rendering inside a tooltip (or a surface that manages its own hints), so an IconButton nested\n * there doesn't add a second tooltip. Provided by HintTooltip and overlay.tsx's <Tooltip>.\n */\nexport const TooltipScope = React.createContext(false);\n\n/**\n * The plain ink hint (DESIGN.md 8.23: top, 6px offset, 8px collision padding, portalled, z 90, 350ms). The child\n * element is the trigger and must take a ref and DOM props. input, display and action-tray use it so they never\n * import overlay.tsx; overlay's <Tooltip> adds the shortcut slot on top of the same layer.\n */\nexport function HintTooltip({\n content,\n side = \"top\",\n delay = 350,\n children,\n}: {\n content: React.ReactNode;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n delay?: number;\n children: React.ReactElement;\n}) {\n return (\n <TooltipScope.Provider value>\n <TooltipRoot>\n <TooltipPrimitive.Trigger delay={delay} render={children} />\n <TooltipLayer side={side}>\n <span className=\"line-clamp-[8] min-w-0 whitespace-normal [overflow-wrap:anywhere]\">{content}</span>\n </TooltipLayer>\n </TooltipRoot>\n </TooltipScope.Provider>\n );\n}\n\nexport interface IconButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof iconButtonVariants> {\n label: string;\n active?: boolean;\n /** Hover/focus hint. Defaults to `label`; pass `false` to opt out, or a node to customise. */\n tooltip?: React.ReactNode | false;\n tooltipSide?: \"top\" | \"bottom\" | \"left\" | \"right\";\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ className, size, variant, label, active, children, tooltip, tooltipSide = \"top\", ...props }, ref) => {\n const inTooltip = React.useContext(TooltipScope);\n const btn = (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n data-active={active ? \"true\" : undefined}\n className={cn(iconButtonVariants({ size, variant }), className)}\n {...props}\n >\n {children}\n </button>\n );\n // Every icon-only button gets a visible hint on hover AND keyboard focus (brief §11), unless a\n // parent tooltip already provides one or the caller opted out.\n if (inTooltip || tooltip === false || !label) return btn;\n return (\n <HintTooltip content={tooltip ?? label} side={tooltipSide}>\n {btn}\n </HintTooltip>\n );\n },\n);\nIconButton.displayName = \"IconButton\";\n\n/** The AI sparkle in the official brand gradient. Used everywhere AI appears. */\nexport function Sparkle({ className, size = 16 }: { className?: string; size?: number }) {\n const id = React.useId().replace(/:/g, \"\");\n return (\n <svg width={size} height={size} viewBox=\"2 2 16 16\" className={cn(\"shrink-0\", className)} aria-hidden>\n <defs>\n <linearGradient id={`sp${id}`} x1=\"6.89\" y1=\"4.59\" x2=\"18\" y2=\"23.67\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0.0817\" style={{ stopColor: \"var(--kit-brand-violet)\" }} />\n <stop offset=\"0.4667\" style={{ stopColor: \"var(--kit-brand-coral)\" }} />\n <stop offset=\"1\" style={{ stopColor: \"var(--kit-brand-rose)\" }} />\n </linearGradient>\n </defs>\n <path d={SPARKLE_PATH} fill={`url(#sp${id})`} />\n </svg>\n );\n}\n\n/** D15 progressive disclosure: \"+ Add a message\" / \"+ Limit to specific sites\": reveals an optional input. */\nexport function RevealLink({ className, children, ...props }: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"inline-flex h-7 items-center gap-1 rounded-kit-md text-kit-sm font-medium text-kit-fg-2 transition-colors hover:text-kit-fg [&_svg]:size-3.5\",\n className,\n )}\n {...props}\n >\n <IconPlus stroke={2} aria-hidden />\n {children}\n </button>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/** Most options a segmented switch may hold. */
|
|
3
|
+
export declare const SEGMENTED_MAX = 3;
|
|
4
|
+
/**
|
|
5
|
+
* Longest label (characters) that stays on one line when the row shares a 340px inspector:
|
|
6
|
+
* two options get ~134px each (about 18 characters at 13px), three get ~84px (about 12).
|
|
7
|
+
*/
|
|
8
|
+
export declare const SEGMENTED_MAX_LABEL: {
|
|
9
|
+
readonly 2: 18;
|
|
10
|
+
readonly 3: 12;
|
|
11
|
+
};
|
|
12
|
+
export declare function fitsSegmented(labels: React.ReactNode[]): boolean;
|
|
13
|
+
export interface ChoiceSwitchItem<T extends string> {
|
|
14
|
+
value: T;
|
|
15
|
+
label: React.ReactNode;
|
|
16
|
+
/** one line under the option in the dropdown; ignored while it renders as a segmented switch */
|
|
17
|
+
description?: string;
|
|
18
|
+
icon?: React.ReactNode;
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function ChoiceSwitch<T extends string>({ value, onChange, items, "aria-label": ariaLabel, size, layout, disabled, className, segmentedClassName, selectClassName, layoutId, placeholder, }: {
|
|
22
|
+
value: T;
|
|
23
|
+
onChange: (v: T) => void;
|
|
24
|
+
items: ChoiceSwitchItem<T>[];
|
|
25
|
+
"aria-label"?: string;
|
|
26
|
+
size?: "sm" | "md";
|
|
27
|
+
/** "auto" applies D46; force a look only when a design reason overrides the rule */
|
|
28
|
+
layout?: "auto" | "segmented" | "dropdown";
|
|
29
|
+
disabled?: boolean;
|
|
30
|
+
/** applied to whichever control renders */
|
|
31
|
+
className?: string;
|
|
32
|
+
segmentedClassName?: string;
|
|
33
|
+
selectClassName?: string;
|
|
34
|
+
layoutId?: string;
|
|
35
|
+
placeholder?: string;
|
|
36
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Segmented } from "./controls.js";
|
|
2
|
+
import { Select, nodeText } from "./select.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/kit/ui/choice-switch.tsx
|
|
6
|
+
/** Most options a segmented switch may hold. */
|
|
7
|
+
var SEGMENTED_MAX = 3;
|
|
8
|
+
/**
|
|
9
|
+
* Longest label (characters) that stays on one line when the row shares a 340px inspector:
|
|
10
|
+
* two options get ~134px each (about 18 characters at 13px), three get ~84px (about 12).
|
|
11
|
+
*/
|
|
12
|
+
var SEGMENTED_MAX_LABEL = {
|
|
13
|
+
2: 18,
|
|
14
|
+
3: 12
|
|
15
|
+
};
|
|
16
|
+
function fitsSegmented(labels) {
|
|
17
|
+
const n = labels.length;
|
|
18
|
+
if (n < 2 || n > 3) return false;
|
|
19
|
+
const max = SEGMENTED_MAX_LABEL[n];
|
|
20
|
+
return labels.every((l) => nodeText(l).trim().length <= max);
|
|
21
|
+
}
|
|
22
|
+
function ChoiceSwitch({ value, onChange, items, "aria-label": ariaLabel, size = "sm", layout = "auto", disabled, className, segmentedClassName, selectClassName, layoutId, placeholder }) {
|
|
23
|
+
if (layout === "segmented" || layout === "auto" && fitsSegmented(items.map((i) => i.label))) return /* @__PURE__ */ jsx(Segmented, {
|
|
24
|
+
size,
|
|
25
|
+
"aria-label": ariaLabel,
|
|
26
|
+
value,
|
|
27
|
+
onChange: (v) => !disabled && onChange(v),
|
|
28
|
+
layoutId,
|
|
29
|
+
className: [className, segmentedClassName].filter(Boolean).join(" ") || void 0,
|
|
30
|
+
items: items.map((i) => ({
|
|
31
|
+
value: i.value,
|
|
32
|
+
label: i.label,
|
|
33
|
+
icon: i.icon,
|
|
34
|
+
disabled: disabled || i.disabled
|
|
35
|
+
}))
|
|
36
|
+
});
|
|
37
|
+
return /* @__PURE__ */ jsx(Select, {
|
|
38
|
+
size,
|
|
39
|
+
"aria-label": ariaLabel,
|
|
40
|
+
value: value || void 0,
|
|
41
|
+
disabled,
|
|
42
|
+
placeholder,
|
|
43
|
+
onValueChange: (v) => onChange(v),
|
|
44
|
+
className: [className, selectClassName].filter(Boolean).join(" ") || void 0,
|
|
45
|
+
options: items.map((i) => ({
|
|
46
|
+
value: i.value,
|
|
47
|
+
label: i.label,
|
|
48
|
+
description: i.description,
|
|
49
|
+
icon: i.icon,
|
|
50
|
+
disabled: i.disabled
|
|
51
|
+
}))
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { ChoiceSwitch, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, fitsSegmented };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=choice-switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choice-switch.js","names":[],"sources":["../../src/kit/ui/choice-switch.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Segmented } from \"./controls\";\nimport { Select, nodeText } from \"./select\";\n\n/* ── Pickers: segmented vs dropdown (D46) ──────────────────────────────────\n A tab-style switch is for 2–3 short options people flip often. Four or more options, or labels that would wrap or\n truncate in a 340px inspector, become a dropdown (the D34 Select, with a one-line description where an option\n isn't self-explanatory). `fitsSegmented` is the single test; `ChoiceSwitch` applies it for dynamic lists\n (variants, schema options, presets) so call sites never have to count. */\n\n/** Most options a segmented switch may hold. */\nexport const SEGMENTED_MAX = 3;\n/**\n * Longest label (characters) that stays on one line when the row shares a 340px inspector:\n * two options get ~134px each (about 18 characters at 13px), three get ~84px (about 12).\n */\nexport const SEGMENTED_MAX_LABEL = { 2: 18, 3: 12 } as const;\n\nexport function fitsSegmented(labels: React.ReactNode[]): boolean {\n const n = labels.length;\n if (n < 2 || n > SEGMENTED_MAX) return false;\n const max = SEGMENTED_MAX_LABEL[n as 2 | 3];\n return labels.every((l) => nodeText(l).trim().length <= max);\n}\n\nexport interface ChoiceSwitchItem<T extends string> {\n value: T;\n label: React.ReactNode;\n /** one line under the option in the dropdown; ignored while it renders as a segmented switch */\n description?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport function ChoiceSwitch<T extends string>({\n value,\n onChange,\n items,\n \"aria-label\": ariaLabel,\n size = \"sm\",\n layout = \"auto\",\n disabled,\n className,\n segmentedClassName,\n selectClassName,\n layoutId,\n placeholder,\n}: {\n value: T;\n onChange: (v: T) => void;\n items: ChoiceSwitchItem<T>[];\n \"aria-label\"?: string;\n size?: \"sm\" | \"md\";\n /** \"auto\" applies D46; force a look only when a design reason overrides the rule */\n layout?: \"auto\" | \"segmented\" | \"dropdown\";\n disabled?: boolean;\n /** applied to whichever control renders */\n className?: string;\n segmentedClassName?: string;\n selectClassName?: string;\n layoutId?: string;\n placeholder?: string;\n}) {\n const segmented = layout === \"segmented\" || (layout === \"auto\" && fitsSegmented(items.map((i) => i.label)));\n if (segmented)\n return (\n <Segmented<T>\n size={size}\n aria-label={ariaLabel}\n value={value}\n onChange={(v) => !disabled && onChange(v)}\n layoutId={layoutId}\n className={[className, segmentedClassName].filter(Boolean).join(\" \") || undefined}\n items={items.map((i) => ({ value: i.value, label: i.label, icon: i.icon, disabled: disabled || i.disabled }))}\n />\n );\n return (\n <Select\n size={size}\n aria-label={ariaLabel}\n value={value || undefined}\n disabled={disabled}\n placeholder={placeholder}\n onValueChange={(v) => onChange(v as T)}\n className={[className, selectClassName].filter(Boolean).join(\" \") || undefined}\n options={items.map((i) => ({ value: i.value, label: i.label, description: i.description, icon: i.icon, disabled: i.disabled }))}\n />\n );\n}\n"],"mappings":";;;;;;AAWA,IAAa,gBAAgB;;;;;AAK7B,IAAa,sBAAsB;CAAE,GAAG;CAAI,GAAG;CAAI;AAEnD,SAAgB,cAAc,QAAoC;CAChE,MAAM,IAAI,OAAO;AACjB,KAAI,IAAI,KAAK,IAAA,EAAmB,QAAO;CACvC,MAAM,MAAM,oBAAoB;AAChC,QAAO,OAAO,OAAO,MAAM,SAAS,EAAE,CAAC,MAAM,CAAC,UAAU,IAAI;;AAY9D,SAAgB,aAA+B,EAC7C,OACA,UACA,OACA,cAAc,WACd,OAAO,MACP,SAAS,QACT,UACA,WACA,oBACA,iBACA,UACA,eAgBC;AAED,KADkB,WAAW,eAAgB,WAAW,UAAU,cAAc,MAAM,KAAK,MAAM,EAAE,MAAM,CAAC,CAExG,QACE,oBAAC,WAAD;EACQ;EACN,cAAY;EACL;EACP,WAAW,MAAM,CAAC,YAAY,SAAS,EAAE;EAC/B;EACV,WAAW,CAAC,WAAW,mBAAmB,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,KAAA;EACxE,OAAO,MAAM,KAAK,OAAO;GAAE,OAAO,EAAE;GAAO,OAAO,EAAE;GAAO,MAAM,EAAE;GAAM,UAAU,YAAY,EAAE;GAAU,EAAE;EAC7G,CAAA;AAEN,QACE,oBAAC,QAAD;EACQ;EACN,cAAY;EACZ,OAAO,SAAS,KAAA;EACN;EACG;EACb,gBAAgB,MAAM,SAAS,EAAO;EACtC,WAAW,CAAC,WAAW,gBAAgB,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,KAAA;EACrE,SAAS,MAAM,KAAK,OAAO;GAAE,OAAO,EAAE;GAAO,OAAO,EAAE;GAAO,aAAa,EAAE;GAAa,MAAM,EAAE;GAAM,UAAU,EAAE;GAAU,EAAE;EAC/H,CAAA"}
|