@bettercms-ai/kit 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_virtual/_rolldown/runtime.js +13 -0
- package/adapters/icons.d.ts +15 -0
- package/adapters/icons.js +27 -0
- package/adapters/icons.js.map +1 -0
- package/adapters/lossy.d.ts +267 -0
- package/adapters/lossy.js +233 -0
- package/adapters/lossy.js.map +1 -0
- package/adapters/prod-types.d.ts +468 -0
- package/adapters/prod-types.js +646 -0
- package/adapters/prod-types.js.map +1 -0
- package/adapters/schema.d.ts +115 -0
- package/adapters/schema.js +2203 -0
- package/adapters/schema.js.map +1 -0
- package/adapters/values.d.ts +200 -0
- package/adapters/values.js +553 -0
- package/adapters/values.js.map +1 -0
- package/brand/logo.d.ts +17 -0
- package/brand/logo.js +9 -0
- package/brand/logo.js.map +1 -0
- package/context.d.ts +269 -0
- package/context.js +214 -0
- package/context.js.map +1 -0
- package/controls/button.d.ts +58 -0
- package/controls/button.js +507 -0
- package/controls/button.js.map +1 -0
- package/controls/c1.d.ts +11 -0
- package/controls/c1.js +24 -0
- package/controls/c1.js.map +1 -0
- package/controls/c2.d.ts +10 -0
- package/controls/c2.js +19 -0
- package/controls/c2.js.map +1 -0
- package/controls/choice.d.ts +39 -0
- package/controls/choice.js +410 -0
- package/controls/choice.js.map +1 -0
- package/controls/code-register.d.ts +1 -0
- package/controls/code-register.js +8 -0
- package/controls/code-register.js.map +1 -0
- package/controls/code.d.ts +42 -0
- package/controls/code.js +396 -0
- package/controls/code.js.map +1 -0
- package/controls/color.d.ts +5 -0
- package/controls/color.js +130 -0
- package/controls/color.js.map +1 -0
- package/controls/component-services.d.ts +114 -0
- package/controls/date-register.d.ts +1 -0
- package/controls/date-register.js +9 -0
- package/controls/date-register.js.map +1 -0
- package/controls/date-zone.d.ts +104 -0
- package/controls/date-zone.js +272 -0
- package/controls/date-zone.js.map +1 -0
- package/controls/date.d.ts +7 -0
- package/controls/date.js +458 -0
- package/controls/date.js.map +1 -0
- package/controls/form-picker-register.d.ts +1 -0
- package/controls/form-picker-register.js +19 -0
- package/controls/form-picker-register.js.map +1 -0
- package/controls/form-picker.d.ts +43 -0
- package/controls/form-picker.js +83 -0
- package/controls/form-picker.js.map +1 -0
- package/controls/icon-register.d.ts +1 -0
- package/controls/icon-register.js +8 -0
- package/controls/icon-register.js.map +1 -0
- package/controls/icon.d.ts +38 -0
- package/controls/icon.js +355 -0
- package/controls/icon.js.map +1 -0
- package/controls/index.d.ts +5 -0
- package/controls/index.js +37 -0
- package/controls/index.js.map +1 -0
- package/controls/json-register.d.ts +1 -0
- package/controls/json-register.js +8 -0
- package/controls/json-register.js.map +1 -0
- package/controls/json.d.ts +2 -0
- package/controls/json.js +72 -0
- package/controls/json.js.map +1 -0
- package/controls/link.d.ts +260 -0
- package/controls/link.js +1186 -0
- package/controls/link.js.map +1 -0
- package/controls/location-register.d.ts +1 -0
- package/controls/location-register.js +8 -0
- package/controls/location-register.js.map +1 -0
- package/controls/location.d.ts +16 -0
- package/controls/location.js +197 -0
- package/controls/location.js.map +1 -0
- package/controls/media-register.d.ts +1 -0
- package/controls/media-register.js +12 -0
- package/controls/media-register.js.map +1 -0
- package/controls/media-services.d.ts +40 -0
- package/controls/media.d.ts +73 -0
- package/controls/media.js +1076 -0
- package/controls/media.js.map +1 -0
- package/controls/number.d.ts +22 -0
- package/controls/number.js +195 -0
- package/controls/number.js.map +1 -0
- package/controls/reference-register.d.ts +1 -0
- package/controls/reference-register.js +10 -0
- package/controls/reference-register.js.map +1 -0
- package/controls/reference-services.d.ts +54 -0
- package/controls/reference.d.ts +23 -0
- package/controls/reference.js +761 -0
- package/controls/reference.js.map +1 -0
- package/controls/rich-text/blocks.d.ts +28 -0
- package/controls/rich-text/blocks.js +1532 -0
- package/controls/rich-text/blocks.js.map +1 -0
- package/controls/rich-text/catalog.d.ts +98 -0
- package/controls/rich-text/catalog.js +613 -0
- package/controls/rich-text/catalog.js.map +1 -0
- package/controls/rich-text/codec.d.ts +56 -0
- package/controls/rich-text/codec.js +32 -0
- package/controls/rich-text/codec.js.map +1 -0
- package/controls/rich-text/component-card.d.ts +14 -0
- package/controls/rich-text/component-card.js +706 -0
- package/controls/rich-text/component-card.js.map +1 -0
- package/controls/rich-text/control.d.ts +21 -0
- package/controls/rich-text/control.js +254 -0
- package/controls/rich-text/control.js.map +1 -0
- package/controls/rich-text/dom.d.ts +190 -0
- package/controls/rich-text/dom.js +690 -0
- package/controls/rich-text/dom.js.map +1 -0
- package/controls/rich-text/editor.d.ts +50 -0
- package/controls/rich-text/editor.js +1530 -0
- package/controls/rich-text/editor.js.map +1 -0
- package/controls/rich-text/floating.d.ts +23 -0
- package/controls/rich-text/floating.js +137 -0
- package/controls/rich-text/floating.js.map +1 -0
- package/controls/rich-text/index.d.ts +1 -0
- package/controls/rich-text/index.js +12 -0
- package/controls/rich-text/index.js.map +1 -0
- package/controls/rich-text/link-form.d.ts +13 -0
- package/controls/rich-text/link-form.js +111 -0
- package/controls/rich-text/link-form.js.map +1 -0
- package/controls/rich-text/markdown.d.ts +6 -0
- package/controls/rich-text/markdown.js +179 -0
- package/controls/rich-text/markdown.js.map +1 -0
- package/controls/rich-text/ops.d.ts +35 -0
- package/controls/rich-text/ops.js +314 -0
- package/controls/rich-text/ops.js.map +1 -0
- package/controls/rich-text/toolbar.d.ts +85 -0
- package/controls/rich-text/toolbar.js +338 -0
- package/controls/rich-text/toolbar.js.map +1 -0
- package/controls/scale.d.ts +56 -0
- package/controls/scale.js +563 -0
- package/controls/scale.js.map +1 -0
- package/controls/slot-register.d.ts +1 -0
- package/controls/slot-register.js +16 -0
- package/controls/slot-register.js.map +1 -0
- package/controls/slot-services.d.ts +97 -0
- package/controls/slot-services.js +38 -0
- package/controls/slot-services.js.map +1 -0
- package/controls/slot.d.ts +33 -0
- package/controls/slot.js +348 -0
- package/controls/slot.js.map +1 -0
- package/controls/table/index.d.ts +1 -0
- package/controls/table/index.js +12 -0
- package/controls/table/index.js.map +1 -0
- package/controls/table/prod.d.ts +21 -0
- package/controls/table/prod.js +79 -0
- package/controls/table/prod.js.map +1 -0
- package/controls/table/refs.d.ts +50 -0
- package/controls/table/refs.js +68 -0
- package/controls/table/refs.js.map +1 -0
- package/controls/table/stored.d.ts +15 -0
- package/controls/table/stored.js +44 -0
- package/controls/table/stored.js.map +1 -0
- package/controls/table/table-editor.d.ts +103 -0
- package/controls/table/table-editor.js +2722 -0
- package/controls/table/table-editor.js.map +1 -0
- package/controls/table/table-link.d.ts +24 -0
- package/controls/table/table-link.js +180 -0
- package/controls/table/table-link.js.map +1 -0
- package/controls/table/table.d.ts +9 -0
- package/controls/table/table.js +103 -0
- package/controls/table/table.js.map +1 -0
- package/controls/text.d.ts +17 -0
- package/controls/text.js +287 -0
- package/controls/text.js.map +1 -0
- package/engine/array.d.ts +101 -0
- package/engine/array.js +893 -0
- package/engine/array.js.map +1 -0
- package/engine/bits.d.ts +24 -0
- package/engine/bits.js +60 -0
- package/engine/bits.js.map +1 -0
- package/engine/breadcrumb.d.ts +45 -0
- package/engine/breadcrumb.js +87 -0
- package/engine/breadcrumb.js.map +1 -0
- package/engine/expand.d.ts +68 -0
- package/engine/expand.js +170 -0
- package/engine/expand.js.map +1 -0
- package/engine/field-list.d.ts +20 -0
- package/engine/field-list.js +19 -0
- package/engine/field-list.js.map +1 -0
- package/engine/field-shell.d.ts +49 -0
- package/engine/field-shell.js +860 -0
- package/engine/field-shell.js.map +1 -0
- package/engine/frame.d.ts +120 -0
- package/engine/frame.js +599 -0
- package/engine/frame.js.map +1 -0
- package/engine/group-summary.d.ts +4 -0
- package/engine/group-summary.js +66 -0
- package/engine/group-summary.js.map +1 -0
- package/engine/grouping.d.ts +224 -0
- package/engine/grouping.js +824 -0
- package/engine/grouping.js.map +1 -0
- package/engine/item-list.d.ts +89 -0
- package/engine/item-list.js +703 -0
- package/engine/item-list.js.map +1 -0
- package/engine/kit-field.d.ts +72 -0
- package/engine/kit-field.js +523 -0
- package/engine/kit-field.js.map +1 -0
- package/engine/schema-form.d.ts +91 -0
- package/engine/schema-form.js +320 -0
- package/engine/schema-form.js.map +1 -0
- package/engine/slot.d.ts +13 -0
- package/engine/slot.js +226 -0
- package/engine/slot.js.map +1 -0
- package/index.d.ts +46 -0
- package/index.js +55 -0
- package/index.js.map +1 -0
- package/kit.css +56 -0
- package/lib/cn.d.ts +4 -0
- package/lib/cn.js +53 -0
- package/lib/cn.js.map +1 -0
- package/lib/columns.d.ts +14 -0
- package/lib/columns.js +27 -0
- package/lib/columns.js.map +1 -0
- package/lib/frames.d.ts +36 -0
- package/lib/frames.js +214 -0
- package/lib/frames.js.map +1 -0
- package/lib/icons.d.ts +16 -0
- package/lib/icons.js +172 -0
- package/lib/icons.js.map +1 -0
- package/lib/path.d.ts +29 -0
- package/lib/path.js +64 -0
- package/lib/path.js.map +1 -0
- package/lib/schema.d.ts +49 -0
- package/lib/schema.js +287 -0
- package/lib/schema.js.map +1 -0
- package/lib/utils.d.ts +7 -0
- package/lib/utils.js +37 -0
- package/lib/utils.js.map +1 -0
- package/lib/validate.d.ts +20 -0
- package/lib/validate.js +150 -0
- package/lib/validate.js.map +1 -0
- package/package.json +31 -59
- package/schema/adapters.d.ts +28 -0
- package/schema/adapters.js +493 -0
- package/schema/adapters.js.map +1 -0
- package/schema/help.d.ts +25 -0
- package/schema/help.js +54 -0
- package/schema/help.js.map +1 -0
- package/schema/scale.d.ts +69 -0
- package/schema/scale.js +250 -0
- package/schema/scale.js.map +1 -0
- package/schema/sources.d.ts +103 -0
- package/schema/sources.js +65 -0
- package/schema/sources.js.map +1 -0
- package/schema/table.d.ts +319 -0
- package/schema/table.js +1198 -0
- package/schema/table.js.map +1 -0
- package/schema/types.d.ts +269 -0
- package/schema/types.js +14 -0
- package/schema/types.js.map +1 -0
- package/types.d.ts +17 -0
- package/ui/action-tray.d.ts +54 -0
- package/ui/action-tray.js +153 -0
- package/ui/action-tray.js.map +1 -0
- package/ui/button.d.ts +57 -0
- package/ui/button.js +202 -0
- package/ui/button.js.map +1 -0
- package/ui/choice-switch.d.ts +36 -0
- package/ui/choice-switch.js +57 -0
- package/ui/choice-switch.js.map +1 -0
- package/ui/controls.d.ts +83 -0
- package/ui/controls.js +319 -0
- package/ui/controls.js.map +1 -0
- package/ui/display.d.ts +156 -0
- package/ui/display.js +444 -0
- package/ui/display.js.map +1 -0
- package/ui/expanded-editor-modal.d.ts +26 -0
- package/ui/expanded-editor-modal.js +140 -0
- package/ui/expanded-editor-modal.js.map +1 -0
- package/ui/field-context.d.ts +12 -0
- package/ui/field-context.js +23 -0
- package/ui/field-context.js.map +1 -0
- package/ui/floating-panel.d.ts +152 -0
- package/ui/floating-panel.js +912 -0
- package/ui/floating-panel.js.map +1 -0
- package/ui/index.d.ts +12 -0
- package/ui/index.js +13 -0
- package/ui/input.d.ts +78 -0
- package/ui/input.js +250 -0
- package/ui/input.js.map +1 -0
- package/ui/mode-bar.d.ts +31 -0
- package/ui/mode-bar.js +65 -0
- package/ui/mode-bar.js.map +1 -0
- package/ui/overlay.d.ts +123 -0
- package/ui/overlay.js +378 -0
- package/ui/overlay.js.map +1 -0
- package/ui/path-crumbs.d.ts +90 -0
- package/ui/path-crumbs.js +532 -0
- package/ui/path-crumbs.js.map +1 -0
- package/ui/presence.d.ts +16 -0
- package/ui/presence.js +65 -0
- package/ui/presence.js.map +1 -0
- package/ui/select.d.ts +66 -0
- package/ui/select.js +405 -0
- package/ui/select.js.map +1 -0
- package/ui/shortcut-hint.d.ts +14 -0
- package/ui/shortcut-hint.js +35 -0
- package/ui/shortcut-hint.js.map +1 -0
- package/ui/surfaces.d.ts +23 -0
- package/ui/surfaces.js +26 -0
- package/ui/surfaces.js.map +1 -0
- package/ui/tooltip-root.d.ts +12 -0
- package/ui/tooltip-root.js +76 -0
- package/ui/tooltip-root.js.map +1 -0
- package/ui/variants.d.ts +15 -0
- package/ui/variants.js +14 -0
- package/ui/variants.js.map +1 -0
- package/LICENSE +0 -21
- package/README.md +0 -27
- package/dist/_chunks-cjs/_visual-editing.js +0 -5898
- package/dist/_chunks-cjs/refractor.js +0 -22
- package/dist/_chunks-es/_visual-editing.mjs +0 -5904
- package/dist/_chunks-es/refractor.mjs +0 -25
- package/dist/_color.d.mts +0 -119
- package/dist/_color.d.ts +0 -119
- package/dist/_color.js +0 -1412
- package/dist/_color.mjs +0 -1411
- package/dist/_visual-editing.d.mts +0 -1126
- package/dist/_visual-editing.d.ts +0 -1126
- package/dist/_visual-editing.js +0 -30
- package/dist/_visual-editing.mjs +0 -30
- package/dist/index.d.mts +0 -3140
- package/dist/index.d.ts +0 -3140
- package/dist/index.js +0 -2036
- package/dist/index.mjs +0 -2044
- package/dist/theme.d.mts +0 -1506
- package/dist/theme.d.ts +0 -1506
- package/dist/theme.js +0 -4126
- package/dist/theme.mjs +0 -4126
- package/exports/_visual-editing.ts +0 -31
- package/exports/index.ts +0 -1
- package/exports/theme.ts +0 -1
- package/src/color/index.d.mts +0 -119
- package/src/color/index.mjs +0 -1411
- package/src/core/__workshop__/constants.ts +0 -293
- package/src/core/_compat.ts +0 -264
- package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
- package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
- package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
- package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
- package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
- package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
- package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
- package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
- package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
- package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
- package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
- package/src/core/components/autocomplete/autocomplete.tsx +0 -767
- package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
- package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
- package/src/core/components/autocomplete/constants.ts +0 -28
- package/src/core/components/autocomplete/index.ts +0 -2
- package/src/core/components/autocomplete/types.ts +0 -108
- package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
- package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
- package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
- package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
- package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
- package/src/core/components/breadcrumbs/index.ts +0 -1
- package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
- package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
- package/src/core/components/dialog/__workshop__/index.ts +0 -19
- package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
- package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
- package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
- package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
- package/src/core/components/dialog/__workshop__/position.tsx +0 -30
- package/src/core/components/dialog/__workshop__/props.tsx +0 -75
- package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
- package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
- package/src/core/components/dialog/dialog.tsx +0 -430
- package/src/core/components/dialog/dialogContext.ts +0 -20
- package/src/core/components/dialog/dialogProvider.tsx +0 -35
- package/src/core/components/dialog/index.ts +0 -4
- package/src/core/components/dialog/styles.ts +0 -77
- package/src/core/components/dialog/useDialog.ts +0 -11
- package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
- package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
- package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
- package/src/core/components/hotkeys/hotkeys.tsx +0 -66
- package/src/core/components/hotkeys/index.ts +0 -1
- package/src/core/components/index.ts +0 -9
- package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
- package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
- package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
- package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
- package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
- package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
- package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
- package/src/core/components/menu/__workshop__/groups.tsx +0 -156
- package/src/core/components/menu/__workshop__/index.ts +0 -89
- package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
- package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -58
- package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
- package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
- package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
- package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
- package/src/core/components/menu/__workshop__/tones.tsx +0 -25
- package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
- package/src/core/components/menu/helpers.ts +0 -82
- package/src/core/components/menu/index.ts +0 -5
- package/src/core/components/menu/menu.spacing.test.tsx +0 -63
- package/src/core/components/menu/menu.test.tsx +0 -125
- package/src/core/components/menu/menu.tsx +0 -178
- package/src/core/components/menu/menuButton.tsx +0 -268
- package/src/core/components/menu/menuContext.ts +0 -18
- package/src/core/components/menu/menuDivider.ts +0 -23
- package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
- package/src/core/components/menu/menuGroup.tsx +0 -233
- package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
- package/src/core/components/menu/menuItem.tsx +0 -197
- package/src/core/components/menu/useMenu.ts +0 -21
- package/src/core/components/menu/useMenuController.ts +0 -231
- package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
- package/src/core/components/skeleton/__workshop__/index.ts +0 -11
- package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
- package/src/core/components/skeleton/index.ts +0 -2
- package/src/core/components/skeleton/skeleton.tsx +0 -57
- package/src/core/components/skeleton/styles.ts +0 -50
- package/src/core/components/skeleton/textSkeleton.tsx +0 -122
- package/src/core/components/tab/__workshop__/example.tsx +0 -79
- package/src/core/components/tab/__workshop__/index.ts +0 -14
- package/src/core/components/tab/index.ts +0 -3
- package/src/core/components/tab/tab.tsx +0 -101
- package/src/core/components/tab/tabList.test.tsx +0 -48
- package/src/core/components/tab/tabList.tsx +0 -70
- package/src/core/components/tab/tabPanel.tsx +0 -39
- package/src/core/components/toast/__workshop__/hook.tsx +0 -71
- package/src/core/components/toast/__workshop__/index.ts +0 -19
- package/src/core/components/toast/__workshop__/toast.tsx +0 -26
- package/src/core/components/toast/index.ts +0 -4
- package/src/core/components/toast/styles.ts +0 -77
- package/src/core/components/toast/toast.test.tsx +0 -101
- package/src/core/components/toast/toast.tsx +0 -198
- package/src/core/components/toast/toastContext.ts +0 -7
- package/src/core/components/toast/toastLayer.tsx +0 -51
- package/src/core/components/toast/toastProvider.tsx +0 -113
- package/src/core/components/toast/toastState.ts +0 -6
- package/src/core/components/toast/types.ts +0 -26
- package/src/core/components/toast/useToast.ts +0 -25
- package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
- package/src/core/components/tree/__workshop__/basic.tsx +0 -105
- package/src/core/components/tree/__workshop__/index.ts +0 -21
- package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
- package/src/core/components/tree/helpers.ts +0 -105
- package/src/core/components/tree/index.ts +0 -4
- package/src/core/components/tree/style.ts +0 -105
- package/src/core/components/tree/tree.test.tsx +0 -55
- package/src/core/components/tree/tree.tsx +0 -240
- package/src/core/components/tree/treeContext.ts +0 -10
- package/src/core/components/tree/treeGroup.tsx +0 -28
- package/src/core/components/tree/treeItem.test.tsx +0 -65
- package/src/core/components/tree/treeItem.tsx +0 -224
- package/src/core/components/tree/types.ts +0 -25
- package/src/core/components/tree/useTree.ts +0 -17
- package/src/core/constants.ts +0 -79
- package/src/core/helpers/animation.ts +0 -27
- package/src/core/helpers/element.ts +0 -55
- package/src/core/helpers/focus.ts +0 -100
- package/src/core/helpers/index.ts +0 -4
- package/src/core/helpers/scroll.ts +0 -15
- package/src/core/hooks/index.ts +0 -12
- package/src/core/hooks/useArrayProp.ts +0 -17
- package/src/core/hooks/useClickOutside.test.tsx +0 -482
- package/src/core/hooks/useClickOutside.ts +0 -118
- package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
- package/src/core/hooks/useClickOutsideEvent.ts +0 -73
- package/src/core/hooks/useCustomValidity.ts +0 -13
- package/src/core/hooks/useDelayed.test.ts +0 -88
- package/src/core/hooks/useDelayedState.ts +0 -36
- package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
- package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
- package/src/core/hooks/useElementRect/index.ts +0 -1
- package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
- package/src/core/hooks/useElementSize.ts +0 -19
- package/src/core/hooks/useForwardedRef.ts +0 -19
- package/src/core/hooks/useGlobalKeyDown.ts +0 -24
- package/src/core/hooks/useIsomorphicEffect.ts +0 -7
- package/src/core/hooks/useMatchMedia.ts +0 -28
- package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
- package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
- package/src/core/hooks/useMediaIndex/index.ts +0 -1
- package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
- package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
- package/src/core/hooks/useMounted.ts +0 -15
- package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
- package/src/core/hooks/usePrefersDark.test.tsx +0 -19
- package/src/core/hooks/usePrefersDark.ts +0 -16
- package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
- package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
- package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
- package/src/core/index.ts +0 -10
- package/src/core/lib/createGlobalScopedContext.ts +0 -36
- package/src/core/lib/globalScope.ts +0 -19
- package/src/core/lib/isRecord.ts +0 -3
- package/src/core/middleware/origin.ts +0 -47
- package/src/core/observers/elementSizeObserver.ts +0 -116
- package/src/core/observers/index.ts +0 -2
- package/src/core/observers/resizeObserver.ts +0 -9
- package/src/core/primitives/_selectable/index.ts +0 -1
- package/src/core/primitives/_selectable/selectable.tsx +0 -15
- package/src/core/primitives/_selectable/style.ts +0 -115
- package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
- package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
- package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
- package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
- package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
- package/src/core/primitives/avatar/avatar.tsx +0 -200
- package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
- package/src/core/primitives/avatar/avatarStack.tsx +0 -100
- package/src/core/primitives/avatar/index.ts +0 -4
- package/src/core/primitives/avatar/styles.ts +0 -167
- package/src/core/primitives/avatar/types.ts +0 -17
- package/src/core/primitives/badge/__workshop__/index.ts +0 -19
- package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
- package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
- package/src/core/primitives/badge/badge.test.tsx +0 -16
- package/src/core/primitives/badge/badge.tsx +0 -70
- package/src/core/primitives/badge/index.ts +0 -1
- package/src/core/primitives/badge/styles.ts +0 -20
- package/src/core/primitives/badge/types.ts +0 -8
- package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
- package/src/core/primitives/box/__workshop__/index.ts +0 -24
- package/src/core/primitives/box/__workshop__/props.tsx +0 -20
- package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
- package/src/core/primitives/box/box.test.tsx +0 -142
- package/src/core/primitives/box/box.tsx +0 -154
- package/src/core/primitives/box/index.ts +0 -1
- package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
- package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
- package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
- package/src/core/primitives/button/__workshop__/index.ts +0 -59
- package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +0 -36
- package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
- package/src/core/primitives/button/__workshop__/props.tsx +0 -55
- package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
- package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
- package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
- package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
- package/src/core/primitives/button/button.test.tsx +0 -82
- package/src/core/primitives/button/button.tsx +0 -210
- package/src/core/primitives/button/index.ts +0 -1
- package/src/core/primitives/button/styles.ts +0 -117
- package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
- package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
- package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
- package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
- package/src/core/primitives/card/__workshop__/index.ts +0 -18
- package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
- package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
- package/src/core/primitives/card/__workshop__/props.tsx +0 -53
- package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
- package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
- package/src/core/primitives/card/card.tsx +0 -128
- package/src/core/primitives/card/index.ts +0 -2
- package/src/core/primitives/card/styles.ts +0 -147
- package/src/core/primitives/card/types.ts +0 -11
- package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
- package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
- package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
- package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
- package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
- package/src/core/primitives/checkbox/checkbox.tsx +0 -73
- package/src/core/primitives/checkbox/index.ts +0 -1
- package/src/core/primitives/checkbox/styles.ts +0 -128
- package/src/core/primitives/code/__workshop__/index.ts +0 -19
- package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/code/__workshop__/props.tsx +0 -21
- package/src/core/primitives/code/code.tsx +0 -55
- package/src/core/primitives/code/index.ts +0 -1
- package/src/core/primitives/code/refractor.tsx +0 -20
- package/src/core/primitives/code/styles.ts +0 -77
- package/src/core/primitives/container/__workshop__/example.tsx +0 -20
- package/src/core/primitives/container/__workshop__/index.ts +0 -8
- package/src/core/primitives/container/container.tsx +0 -54
- package/src/core/primitives/container/index.ts +0 -2
- package/src/core/primitives/container/styles.ts +0 -23
- package/src/core/primitives/container/types.ts +0 -6
- package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
- package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
- package/src/core/primitives/flex/__workshop__/index.ts +0 -11
- package/src/core/primitives/flex/flex.tsx +0 -64
- package/src/core/primitives/flex/index.ts +0 -1
- package/src/core/primitives/grid/__workshop__/index.ts +0 -10
- package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
- package/src/core/primitives/grid/grid.test.tsx +0 -80
- package/src/core/primitives/grid/grid.tsx +0 -74
- package/src/core/primitives/grid/index.ts +0 -1
- package/src/core/primitives/heading/__workshop__/index.ts +0 -19
- package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
- package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
- package/src/core/primitives/heading/heading.tsx +0 -88
- package/src/core/primitives/heading/index.ts +0 -1
- package/src/core/primitives/heading/styles.ts +0 -64
- package/src/core/primitives/heading/types.ts +0 -7
- package/src/core/primitives/index.ts +0 -27
- package/src/core/primitives/inline/__workshop__/index.ts +0 -8
- package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
- package/src/core/primitives/inline/index.ts +0 -1
- package/src/core/primitives/inline/inline.test.tsx +0 -51
- package/src/core/primitives/inline/inline.tsx +0 -63
- package/src/core/primitives/inline/styles.ts +0 -32
- package/src/core/primitives/inline/types.ts +0 -6
- package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
- package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
- package/src/core/primitives/kbd/index.ts +0 -1
- package/src/core/primitives/kbd/kbd.tsx +0 -69
- package/src/core/primitives/label/__workshop__/index.ts +0 -19
- package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
- package/src/core/primitives/label/index.ts +0 -1
- package/src/core/primitives/label/label.tsx +0 -87
- package/src/core/primitives/label/styles.ts +0 -45
- package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
- package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
- package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
- package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
- package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
- package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
- package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
- package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
- package/src/core/primitives/popover/__workshop__/index.ts +0 -49
- package/src/core/primitives/popover/constants.ts +0 -22
- package/src/core/primitives/popover/floating-ui/size.ts +0 -99
- package/src/core/primitives/popover/helpers.ts +0 -31
- package/src/core/primitives/popover/index.ts +0 -2
- package/src/core/primitives/popover/popover.tsx +0 -511
- package/src/core/primitives/popover/popoverCard.tsx +0 -166
- package/src/core/primitives/popover/types.ts +0 -7
- package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
- package/src/core/primitives/radio/__workshop__/index.ts +0 -11
- package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
- package/src/core/primitives/radio/index.ts +0 -1
- package/src/core/primitives/radio/radio.tsx +0 -51
- package/src/core/primitives/radio/styles.ts +0 -117
- package/src/core/primitives/select/__workshop__/index.ts +0 -11
- package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
- package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
- package/src/core/primitives/select/index.ts +0 -1
- package/src/core/primitives/select/select.test.tsx +0 -52
- package/src/core/primitives/select/select.tsx +0 -94
- package/src/core/primitives/select/styles.ts +0 -166
- package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
- package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
- package/src/core/primitives/spinner/index.ts +0 -1
- package/src/core/primitives/spinner/spinner.tsx +0 -46
- package/src/core/primitives/stack/__workshop__/index.ts +0 -14
- package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
- package/src/core/primitives/stack/index.ts +0 -1
- package/src/core/primitives/stack/stack.test.tsx +0 -57
- package/src/core/primitives/stack/stack.tsx +0 -57
- package/src/core/primitives/stack/styles.ts +0 -32
- package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
- package/src/core/primitives/switch/__workshop__/index.ts +0 -11
- package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
- package/src/core/primitives/switch/index.ts +0 -1
- package/src/core/primitives/switch/styles.ts +0 -173
- package/src/core/primitives/switch/switch.tsx +0 -68
- package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
- package/src/core/primitives/text/__workshop__/example.tsx +0 -39
- package/src/core/primitives/text/__workshop__/index.ts +0 -24
- package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
- package/src/core/primitives/text/index.ts +0 -1
- package/src/core/primitives/text/styles.ts +0 -74
- package/src/core/primitives/text/text.tsx +0 -89
- package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
- package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
- package/src/core/primitives/textArea/index.ts +0 -1
- package/src/core/primitives/textArea/textArea.tsx +0 -120
- package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
- package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
- package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
- package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
- package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
- package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
- package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
- package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
- package/src/core/primitives/textInput/index.ts +0 -1
- package/src/core/primitives/textInput/textInput.test.tsx +0 -48
- package/src/core/primitives/textInput/textInput.tsx +0 -395
- package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
- package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
- package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
- package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
- package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
- package/src/core/primitives/tooltip/constants.ts +0 -23
- package/src/core/primitives/tooltip/index.ts +0 -2
- package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
- package/src/core/primitives/tooltip/tooltip.tsx +0 -495
- package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
- package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
- package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
- package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
- package/src/core/primitives/types.ts +0 -179
- package/src/core/styles/border/borderStyle.ts +0 -56
- package/src/core/styles/border/index.ts +0 -2
- package/src/core/styles/border/types.ts +0 -10
- package/src/core/styles/box/boxStyle.ts +0 -69
- package/src/core/styles/box/index.ts +0 -2
- package/src/core/styles/box/types.ts +0 -11
- package/src/core/styles/card/_cardColorStyle.ts +0 -108
- package/src/core/styles/card/index.ts +0 -1
- package/src/core/styles/flex/flexItemStyle.ts +0 -27
- package/src/core/styles/flex/flexStyle.ts +0 -70
- package/src/core/styles/flex/index.ts +0 -3
- package/src/core/styles/flex/types.ts +0 -25
- package/src/core/styles/focusRing/index.ts +0 -25
- package/src/core/styles/font/codeFontStyle.ts +0 -13
- package/src/core/styles/font/headingFontStyle.ts +0 -13
- package/src/core/styles/font/index.ts +0 -6
- package/src/core/styles/font/labelFontStyle.ts +0 -13
- package/src/core/styles/font/responsiveFont.ts +0 -103
- package/src/core/styles/font/textAlignStyle.ts +0 -19
- package/src/core/styles/font/textFontStyle.ts +0 -13
- package/src/core/styles/font/types.ts +0 -35
- package/src/core/styles/grid/gridItemStyle.ts +0 -82
- package/src/core/styles/grid/gridStyle.ts +0 -108
- package/src/core/styles/grid/index.ts +0 -3
- package/src/core/styles/grid/types.ts +0 -37
- package/src/core/styles/helpers.ts +0 -72
- package/src/core/styles/index.ts +0 -5
- package/src/core/styles/input/index.ts +0 -2
- package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
- package/src/core/styles/input/textInputStyle.ts +0 -263
- package/src/core/styles/internal.ts +0 -12
- package/src/core/styles/margin/index.ts +0 -2
- package/src/core/styles/margin/marginStyle.ts +0 -21
- package/src/core/styles/margin/marginsStyle.test.ts +0 -33
- package/src/core/styles/margin/types.ts +0 -9
- package/src/core/styles/padding/index.ts +0 -2
- package/src/core/styles/padding/paddingStyle.test.ts +0 -33
- package/src/core/styles/padding/paddingStyle.ts +0 -21
- package/src/core/styles/padding/types.ts +0 -12
- package/src/core/styles/radius/index.ts +0 -2
- package/src/core/styles/radius/radiusStyle.ts +0 -23
- package/src/core/styles/radius/types.ts +0 -8
- package/src/core/styles/shadow/index.ts +0 -2
- package/src/core/styles/shadow/shadowStyle.ts +0 -29
- package/src/core/styles/shadow/types.ts +0 -6
- package/src/core/styles/types.ts +0 -8
- package/src/core/theme/__workshop__/build/Root.tsx +0 -367
- package/src/core/theme/__workshop__/build/helpers.ts +0 -46
- package/src/core/theme/__workshop__/build/story.tsx +0 -465
- package/src/core/theme/__workshop__/canvas.tsx +0 -352
- package/src/core/theme/__workshop__/color.tsx +0 -62
- package/src/core/theme/__workshop__/debug/story.tsx +0 -408
- package/src/core/theme/__workshop__/index.ts +0 -39
- package/src/core/theme/__workshop__/layer.tsx +0 -78
- package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
- package/src/core/theme/index.ts +0 -5
- package/src/core/theme/theme.test.tsx +0 -73
- package/src/core/theme/themeColorProvider.tsx +0 -29
- package/src/core/theme/themeContext.ts +0 -10
- package/src/core/theme/themeProvider.tsx +0 -62
- package/src/core/theme/types.ts +0 -12
- package/src/core/theme/useRootTheme.ts +0 -17
- package/src/core/theme/useTheme.ts +0 -16
- package/src/core/types/avatar.ts +0 -14
- package/src/core/types/badge.ts +0 -12
- package/src/core/types/box.ts +0 -19
- package/src/core/types/button.ts +0 -21
- package/src/core/types/card.ts +0 -6
- package/src/core/types/component.ts +0 -32
- package/src/core/types/dialog.ts +0 -4
- package/src/core/types/flex.ts +0 -30
- package/src/core/types/grid.ts +0 -14
- package/src/core/types/gridItem.ts +0 -29
- package/src/core/types/index.ts +0 -15
- package/src/core/types/placement.ts +0 -18
- package/src/core/types/popover.ts +0 -4
- package/src/core/types/radius.ts +0 -4
- package/src/core/types/selectable.ts +0 -6
- package/src/core/types/text.ts +0 -4
- package/src/core/utils/arrow/arrow.tsx +0 -123
- package/src/core/utils/arrow/cmds.ts +0 -91
- package/src/core/utils/arrow/index.ts +0 -1
- package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
- package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
- package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
- package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
- package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
- package/src/core/utils/boundaryElement/index.ts +0 -3
- package/src/core/utils/boundaryElement/types.ts +0 -7
- package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
- package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
- package/src/core/utils/conditionalWrapper/index.ts +0 -1
- package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
- package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
- package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
- package/src/core/utils/elementQuery/helpers.ts +0 -27
- package/src/core/utils/elementQuery/index.ts +0 -1
- package/src/core/utils/errorBoundary.tsx +0 -48
- package/src/core/utils/getElementRef.ts +0 -26
- package/src/core/utils/index.ts +0 -9
- package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
- package/src/core/utils/layer/__workshop__/index.ts +0 -24
- package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
- package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
- package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
- package/src/core/utils/layer/getLayerContext.test.ts +0 -30
- package/src/core/utils/layer/getLayerContext.ts +0 -21
- package/src/core/utils/layer/index.ts +0 -4
- package/src/core/utils/layer/layer.test.tsx +0 -108
- package/src/core/utils/layer/layer.tsx +0 -98
- package/src/core/utils/layer/layerContext.ts +0 -7
- package/src/core/utils/layer/layerProvider.tsx +0 -111
- package/src/core/utils/layer/types.ts +0 -9
- package/src/core/utils/layer/useLayer.ts +0 -26
- package/src/core/utils/portal/__workshop__/index.ts +0 -14
- package/src/core/utils/portal/__workshop__/named.tsx +0 -63
- package/src/core/utils/portal/index.ts +0 -4
- package/src/core/utils/portal/portal.test.tsx +0 -103
- package/src/core/utils/portal/portal.ts +0 -32
- package/src/core/utils/portal/portalContext.ts +0 -31
- package/src/core/utils/portal/portalProvider.tsx +0 -47
- package/src/core/utils/portal/types.ts +0 -9
- package/src/core/utils/portal/usePortal.ts +0 -25
- package/src/core/utils/spanWithTextOverflow.tsx +0 -10
- package/src/core/utils/srOnly/index.ts +0 -1
- package/src/core/utils/srOnly/srOnly.tsx +0 -36
- package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
- package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
- package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
- package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
- package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
- package/src/core/utils/virtualList/index.ts +0 -1
- package/src/core/utils/virtualList/virtualList.tsx +0 -200
- package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
- package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
- package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
- package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
- package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
- package/src/theme/build/_deprecated/color/color.test.ts +0 -63
- package/src/theme/build/_deprecated/color/defaults.ts +0 -390
- package/src/theme/build/_deprecated/color/factory.ts +0 -142
- package/src/theme/build/_deprecated/color/index.ts +0 -1
- package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
- package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
- package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
- package/src/theme/build/buildColorTheme.test.ts +0 -183
- package/src/theme/build/buildColorTheme.ts +0 -499
- package/src/theme/build/buildTheme.test.ts +0 -87
- package/src/theme/build/buildTheme.ts +0 -36
- package/src/theme/build/colorToken/colorToken.ts +0 -19
- package/src/theme/build/colorToken/compileColorToken.ts +0 -21
- package/src/theme/build/colorToken/index.ts +0 -2
- package/src/theme/build/colorToken/types.ts +0 -6
- package/src/theme/build/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
- package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
- package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
- package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
- package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
- package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
- package/src/theme/build/lib/color-fns/convert.ts +0 -150
- package/src/theme/build/lib/color-fns/index.ts +0 -6
- package/src/theme/build/lib/color-fns/parse.ts +0 -60
- package/src/theme/build/lib/color-fns/rgba.ts +0 -10
- package/src/theme/build/lib/color-fns/types.ts +0 -28
- package/src/theme/build/lib/isRecord.ts +0 -3
- package/src/theme/build/lib/lazy.ts +0 -30
- package/src/theme/build/lib/utils.ts +0 -19
- package/src/theme/build/merge.ts +0 -26
- package/src/theme/build/mixThemeColor.test.ts +0 -21
- package/src/theme/build/mixThemeColor.ts +0 -53
- package/src/theme/build/renderColorTheme.ts +0 -532
- package/src/theme/build/renderColorValue.ts +0 -85
- package/src/theme/build/resolveColorTokens.ts +0 -268
- package/src/theme/build/theme.test.ts +0 -27
- package/src/theme/config/helpers.ts +0 -55
- package/src/theme/config/index.ts +0 -4
- package/src/theme/config/system.ts +0 -115
- package/src/theme/config/tokens/color/index.ts +0 -1
- package/src/theme/config/tokens/color/types.ts +0 -133
- package/src/theme/config/tokens/index.ts +0 -4
- package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
- package/src/theme/config/tokens/parseTokenKey.ts +0 -67
- package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
- package/src/theme/config/tokens/parseTokenValue.ts +0 -133
- package/src/theme/config/tokens/types.ts +0 -53
- package/src/theme/config/types.ts +0 -46
- package/src/theme/defaults/colorPalette.ts +0 -5
- package/src/theme/defaults/colorTokens.ts +0 -648
- package/src/theme/defaults/config.ts +0 -84
- package/src/theme/defaults/fonts.ts +0 -227
- package/src/theme/getScopedTheme.ts +0 -98
- package/src/theme/index.ts +0 -5
- package/src/theme/system/avatar.ts +0 -14
- package/src/theme/system/color/_constants.ts +0 -45
- package/src/theme/system/color/_helpers.ts +0 -24
- package/src/theme/system/color/_system.ts +0 -40
- package/src/theme/system/color/avatar.ts +0 -15
- package/src/theme/system/color/badge.ts +0 -16
- package/src/theme/system/color/button.ts +0 -17
- package/src/theme/system/color/color.ts +0 -34
- package/src/theme/system/color/index.ts +0 -13
- package/src/theme/system/color/input.ts +0 -25
- package/src/theme/system/color/kbd.ts +0 -8
- package/src/theme/system/color/selectable.ts +0 -12
- package/src/theme/system/color/shadow.ts +0 -7
- package/src/theme/system/color/state.ts +0 -43
- package/src/theme/system/color/syntax.ts +0 -41
- package/src/theme/system/css.ts +0 -14
- package/src/theme/system/focusRing.ts +0 -7
- package/src/theme/system/font.ts +0 -52
- package/src/theme/system/index.ts +0 -11
- package/src/theme/system/input.ts +0 -33
- package/src/theme/system/layer.ts +0 -8
- package/src/theme/system/shadow.ts +0 -19
- package/src/theme/system/styles.ts +0 -13
- package/src/theme/system/theme.ts +0 -138
- package/src/theme/system/v0/avatar.ts +0 -10
- package/src/theme/system/v0/color/_generic.ts +0 -35
- package/src/theme/system/v0/color/_system.ts +0 -17
- package/src/theme/system/v0/color/base.ts +0 -21
- package/src/theme/system/v0/color/button.ts +0 -42
- package/src/theme/system/v0/color/card.ts +0 -19
- package/src/theme/system/v0/color/color.ts +0 -40
- package/src/theme/system/v0/color/index.ts +0 -11
- package/src/theme/system/v0/color/input.ts +0 -34
- package/src/theme/system/v0/color/muted.ts +0 -26
- package/src/theme/system/v0/color/selectable.ts +0 -31
- package/src/theme/system/v0/color/solid.ts +0 -26
- package/src/theme/system/v0/color/spot.ts +0 -13
- package/src/theme/system/v0/index.ts +0 -3
- package/src/theme/system/v0/input.ts +0 -23
- package/src/theme/versioning/getTheme_v2.ts +0 -57
- package/src/theme/versioning/index.ts +0 -5
- package/src/theme/versioning/is_v0.ts +0 -6
- package/src/theme/versioning/is_v2.ts +0 -6
- package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
- package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
- package/src/theme/versioning/v0_v2.ts +0 -94
- package/src/theme/versioning/v2_v0.ts +0 -135
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-picker.js","names":[],"sources":["../../src/kit/controls/form-picker.tsx"],"sourcesContent":["/**\n * FORM PICKER — a reference to the project's forms (`reference: { to: [\"form\"] }`; a component's `form` prop), drawn as\n * V2 draws it: the reference control's card and 300px search popover, its rows the host's forms (V2 read them from\n * `services.forms`, with \"{n} fields · {n} submissions\" under each name).\n *\n * The rows come from the host, never a seed: `forms` (V2's synchronous list) or `useFormOptions`, a React HOOK for a host\n * that loads them (the dock: GET /forms). While they load, the saved form shows its id; a failed load is said in words\n * on the card and in the picker. D58: submission counts are form data, so a viewer without `forms.submissions` sees\n * them dropped from the subtitle (V2 rule).\n *\n * Remove clears the value (`undefined`): a form prop stores `{ formId }` or nothing, never a null envelope.\n * `FormDetails`, when the host has one, draws under a chosen form (where the form renders on the site, editing its fields).\n */\nimport * as React from \"react\";\nimport { KitServicesProvider, useKitEnv, useKitServices, type KitServices } from \"../context\";\nimport type { FieldSchema } from \"../schema/types\";\nimport type { ControlProps } from \"../types\";\nimport { ReferenceControl } from \"./reference\";\nimport type { KitReferenceOption, KitReferenceQuery } from \"./reference-services\";\n\nexport interface KitFormOption {\n id: string;\n title: string;\n /** \"5 fields · 128 submissions\" */\n subtitle?: string;\n /** \"draft\" shows the Draft chip (a draft form refuses submissions) */\n status?: string | null;\n}\n\ndeclare module \"../context\" {\n interface KitServices {\n /** A React HOOK: the project's forms, for a host that loads them. One identity for the life of the form. */\n useFormOptions?: () => { forms: KitFormOption[]; loading?: boolean; error?: string };\n /** Drawn under a chosen form: the host's own detail for it (where it renders, its fields). */\n FormDetails?: React.ComponentType<{ formId: string; readOnly?: boolean; onPick?: (formId: string) => void }>;\n }\n}\n\n/** A reference whose only target is forms (no filter: a filtered one stays on the reference search). */\nexport const isFormOnly = (field: FieldSchema) => {\n const to = field.reference?.to ?? [];\n return to.length === 1 && to[0] === \"form\" && !field.reference?.filter;\n};\n\nconst SUBMISSIONS = / · [\\d,]+ submissions?$/;\n\nfunction useFormRows(services: KitServices): { forms: KitFormOption[] | null; error?: string } {\n const loaded = services.useFormOptions ? services.useFormOptions() : null;\n if (loaded) return { forms: loaded.loading ? null : loaded.forms, error: loaded.error };\n return { forms: services.forms?.() ?? [] };\n}\n\nexport function FormPickerControl(props: ControlProps) {\n const services = useKitServices();\n const subs = useKitEnv().can(\"forms.submissions\");\n const { forms, error } = useFormRows(services);\n // by content: `forms()` may hand back a new list on every render, and the search must keep one identity (the picker\n // searches again whenever it changes)\n const rowsKey = JSON.stringify(forms);\n const options = React.useMemo<KitReferenceOption[] | null>(\n () =>\n forms?.map((f) => ({ id: f.id, kind: \"form\" as const, title: f.title, subtitle: (subs ? f.subtitle : f.subtitle?.replace(SUBMISSIONS, \"\")) || null, status: f.status ?? null })) ?? null,\n [rowsKey, subs], // eslint-disable-line react-hooks/exhaustive-deps\n );\n // the reference control over these rows: search by name, read the saved id back. While the forms load there is no\n // lookup, so the card shows the saved id (never a \"Missing\" that is only \"not loaded yet\").\n const reads = React.useMemo(() => {\n const fail = () => Promise.reject(new Error(error));\n return {\n searchReferences: error\n ? fail\n : async (q: KitReferenceQuery) => {\n const t = q.q.trim().toLowerCase();\n const rows = (options ?? []).filter((o) => o.id !== q.excludeId && (!t || o.title.toLowerCase().includes(t)));\n return { options: rows.slice(0, q.limit), truncated: false };\n },\n lookupReferences: error ? fail : options ? async (ids: string[]) => options.filter((o) => ids.includes(o.id)) : undefined,\n };\n }, [options, error]);\n const value: KitServices = { ...services, ...reads, createReference: undefined };\n const formId = typeof props.value === \"string\" && props.value ? props.value : null;\n const Details = services.FormDetails;\n return (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <KitServicesProvider value={value}>\n <ReferenceControl {...props} onChange={(v) => props.onChange(v == null || v === \"\" ? undefined : v)} />\n </KitServicesProvider>\n {formId && Details ? <Details formId={formId} readOnly={props.readOnly} onPick={(id) => props.onChange(id)} /> : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,IAAa,cAAc,UAAuB;CAChD,MAAM,KAAK,MAAM,WAAW,MAAM,EAAE;AACpC,QAAO,GAAG,WAAW,KAAK,GAAG,OAAO,UAAU,CAAC,MAAM,WAAW;;AAGlE,IAAM,cAAc;AAEpB,SAAS,YAAY,UAA0E;CAC7F,MAAM,SAAS,SAAS,iBAAiB,SAAS,gBAAgB,GAAG;AACrE,KAAI,OAAQ,QAAO;EAAE,OAAO,OAAO,UAAU,OAAO,OAAO;EAAO,OAAO,OAAO;EAAO;AACvF,QAAO,EAAE,OAAO,SAAS,SAAS,IAAI,EAAE,EAAE;;AAG5C,SAAgB,kBAAkB,OAAqB;CACrD,MAAM,WAAW,gBAAgB;CACjC,MAAM,OAAO,WAAW,CAAC,IAAI,oBAAoB;CACjD,MAAM,EAAE,OAAO,UAAU,YAAY,SAAS;CAG9C,MAAM,UAAU,KAAK,UAAU,MAAM;CACrC,MAAM,UAAU,MAAM,cAElB,OAAO,KAAK,OAAO;EAAE,IAAI,EAAE;EAAI,MAAM;EAAiB,OAAO,EAAE;EAAO,WAAW,OAAO,EAAE,WAAW,EAAE,UAAU,QAAQ,aAAa,GAAG,KAAK;EAAM,QAAQ,EAAE,UAAU;EAAM,EAAE,IAAI,MACtL,CAAC,SAAS,KAAK,CAChB;CAGD,MAAM,QAAQ,MAAM,cAAc;EAChC,MAAM,aAAa,QAAQ,OAAO,IAAI,MAAM,MAAM,CAAC;AACnD,SAAO;GACL,kBAAkB,QACd,OACA,OAAO,MAAyB;IAC9B,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,aAAa;AAElC,WAAO;KAAE,UADK,WAAW,EAAE,EAAE,QAAQ,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,CACtF,MAAM,GAAG,EAAE,MAAM;KAAE,WAAW;KAAO;;GAElE,kBAAkB,QAAQ,OAAO,UAAU,OAAO,QAAkB,QAAQ,QAAQ,MAAM,IAAI,SAAS,EAAE,GAAG,CAAC,GAAG,KAAA;GACjH;IACA,CAAC,SAAS,MAAM,CAAC;CACpB,MAAM,QAAqB;EAAE,GAAG;EAAU,GAAG;EAAO,iBAAiB,KAAA;EAAW;CAChF,MAAM,SAAS,OAAO,MAAM,UAAU,YAAY,MAAM,QAAQ,MAAM,QAAQ;CAC9E,MAAM,UAAU,SAAS;AACzB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,qBAAD;GAA4B;aAC1B,oBAAC,kBAAD;IAAkB,GAAI;IAAO,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,MAAM,KAAK,KAAA,IAAY,EAAE;IAAI,CAAA;GACnF,CAAA,EACrB,UAAU,UAAU,oBAAC,SAAD;GAAiB;GAAQ,UAAU,MAAM;GAAU,SAAS,OAAO,MAAM,SAAS,GAAG;GAAI,CAAA,GAAG,KAC7G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CONTROLS } from "../engine/kit-field.js";
|
|
2
|
+
import { IconControl } from "./icon.js";
|
|
3
|
+
//#region src/kit/controls/icon-register.ts
|
|
4
|
+
/** Lane C3: the icon field in the engine's dispatch table (one line per type; merge with other lanes by line). */
|
|
5
|
+
CONTROLS.icon = IconControl;
|
|
6
|
+
//#endregion
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=icon-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-register.js","names":[],"sources":["../../src/kit/controls/icon-register.ts"],"sourcesContent":["/** Lane C3: the icon field in the engine's dispatch table (one line per type; merge with other lanes by line). */\nimport { CONTROLS } from \"../engine/kit-field\";\nimport { IconControl } from \"./icon\";\n\nCONTROLS.icon = IconControl;\n"],"mappings":";;;;AAIA,SAAS,OAAO"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ICON — the icon field (DESIGN 8.14), V2 controls/icon.tsx fitted to what prod stores.
|
|
3
|
+
*
|
|
4
|
+
* Values (backend reference-validation `icon`, the classic PropsPanel IconValueInput):
|
|
5
|
+
* "arrow-right" a name from the BetterCMS icon set (DOCK_ICON_NAMES, 472 names)
|
|
6
|
+
* "https://…/logo.svg" an uploaded icon: an image URL (picked from the media library; a component prop
|
|
7
|
+
* stores the URL string, like the classic panel's codec="url")
|
|
8
|
+
* { url, … } an uploaded icon stored as an image value: shown and kept until replaced
|
|
9
|
+
* null no icon ("No icon"; the backend skips an empty value)
|
|
10
|
+
*
|
|
11
|
+
* The grid offers the BetterCMS set, the one prod accepts. Search also matches a name's Tabler twin through the
|
|
12
|
+
* Tabler ↔ dock adapter (adapters/icons.ts), so "map" finds earth-americas. A stored name outside the set (a stale
|
|
13
|
+
* Tabler or Lucide name) is shown with its reason and kept until the author picks another.
|
|
14
|
+
*
|
|
15
|
+
* Glyphs: the host draws them (KitServices.IconGlyph: the dashboard's DockIcon, the set the site renders). With no
|
|
16
|
+
* host renderer the kit draws the Tabler twin, loaded on first use; a name with no Tabler twin shows its name.
|
|
17
|
+
*/
|
|
18
|
+
import * as React from "react";
|
|
19
|
+
import type { ControlProps } from "../types";
|
|
20
|
+
declare module "../context" {
|
|
21
|
+
interface KitServices {
|
|
22
|
+
/**
|
|
23
|
+
* Draws one icon of the BetterCMS set by name, aria-hidden (the name beside it is the accessible text): the glyphs
|
|
24
|
+
* the site renders. The dashboard passes `DockIcon` (src/components/dock/DockIcon). Absent → the Tabler twin.
|
|
25
|
+
*/
|
|
26
|
+
IconGlyph?: React.ComponentType<{
|
|
27
|
+
name: string;
|
|
28
|
+
className?: string;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** The picker: search, Recent, then the whole set ("No icon" first). Search spans the name and its Tabler twin. */
|
|
33
|
+
export declare function IconPicker({ value, onPick, onChooseMedia }: {
|
|
34
|
+
value?: string;
|
|
35
|
+
onPick: (name: string | null) => void;
|
|
36
|
+
onChooseMedia?: () => void;
|
|
37
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export declare function IconControl({ field, value, onChange, readOnly, id, invalid }: ControlProps): import("react/jsx-runtime").JSX.Element;
|
package/controls/icon.js
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { cn } from "../lib/cn.js";
|
|
2
|
+
import { isObj } from "../lib/path.js";
|
|
3
|
+
import { iconLabel } from "../lib/icons.js";
|
|
4
|
+
import { DOCK_ICON_NAMES, DOCK_ICON_NAME_SET } from "../adapters/prod-types.js";
|
|
5
|
+
import { useKitServices } from "../context.js";
|
|
6
|
+
import { TooltipLayer } from "../ui/tooltip-root.js";
|
|
7
|
+
import { Button } from "../ui/button.js";
|
|
8
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../ui/overlay.js";
|
|
9
|
+
import { tablerIconOf } from "../adapters/icons.js";
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
import { IconAlertTriangle, IconChevronDown, IconPhoto, IconSearch, IconX } from "@tabler/icons-react";
|
|
12
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { Tooltip } from "@base-ui/react/tooltip";
|
|
14
|
+
//#region src/kit/controls/icon.tsx
|
|
15
|
+
/**
|
|
16
|
+
* ICON — the icon field (DESIGN 8.14), V2 controls/icon.tsx fitted to what prod stores.
|
|
17
|
+
*
|
|
18
|
+
* Values (backend reference-validation `icon`, the classic PropsPanel IconValueInput):
|
|
19
|
+
* "arrow-right" a name from the BetterCMS icon set (DOCK_ICON_NAMES, 472 names)
|
|
20
|
+
* "https://…/logo.svg" an uploaded icon: an image URL (picked from the media library; a component prop
|
|
21
|
+
* stores the URL string, like the classic panel's codec="url")
|
|
22
|
+
* { url, … } an uploaded icon stored as an image value: shown and kept until replaced
|
|
23
|
+
* null no icon ("No icon"; the backend skips an empty value)
|
|
24
|
+
*
|
|
25
|
+
* The grid offers the BetterCMS set, the one prod accepts. Search also matches a name's Tabler twin through the
|
|
26
|
+
* Tabler ↔ dock adapter (adapters/icons.ts), so "map" finds earth-americas. A stored name outside the set (a stale
|
|
27
|
+
* Tabler or Lucide name) is shown with its reason and kept until the author picks another.
|
|
28
|
+
*
|
|
29
|
+
* Glyphs: the host draws them (KitServices.IconGlyph: the dashboard's DockIcon, the set the site renders). With no
|
|
30
|
+
* host renderer the kit draws the Tabler twin, loaded on first use; a name with no Tabler twin shows its name.
|
|
31
|
+
*/
|
|
32
|
+
var tablerSet = null;
|
|
33
|
+
var tablerLoad = null;
|
|
34
|
+
var pascal = (kebab) => `Icon${kebab.split("-").map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join("")}`;
|
|
35
|
+
/** The full Tabler set, loaded once and only when no host renderer is provided. */
|
|
36
|
+
function useTablerSet(need) {
|
|
37
|
+
const [, landed] = React.useReducer((n) => n + 1, 0);
|
|
38
|
+
React.useEffect(() => {
|
|
39
|
+
if (!need || tablerSet) return;
|
|
40
|
+
let live = true;
|
|
41
|
+
tablerLoad ??= import("@tabler/icons-react").then((m) => {
|
|
42
|
+
tablerSet = m;
|
|
43
|
+
});
|
|
44
|
+
tablerLoad.then(() => live && landed(), () => {});
|
|
45
|
+
return () => {
|
|
46
|
+
live = false;
|
|
47
|
+
};
|
|
48
|
+
}, [need]);
|
|
49
|
+
return tablerSet;
|
|
50
|
+
}
|
|
51
|
+
function Glyph({ name, className }) {
|
|
52
|
+
const Host = useKitServices().IconGlyph;
|
|
53
|
+
const set = useTablerSet(!Host);
|
|
54
|
+
if (Host) return /* @__PURE__ */ jsx(Host, {
|
|
55
|
+
name,
|
|
56
|
+
className
|
|
57
|
+
});
|
|
58
|
+
const T = set?.[pascal(tablerIconOf(name))];
|
|
59
|
+
if (T) return /* @__PURE__ */ jsx(T, {
|
|
60
|
+
className,
|
|
61
|
+
stroke: 1.5,
|
|
62
|
+
"aria-hidden": true
|
|
63
|
+
});
|
|
64
|
+
return /* @__PURE__ */ jsx("span", {
|
|
65
|
+
"aria-hidden": true,
|
|
66
|
+
className: "max-w-full truncate px-0.5 text-[9px] leading-3 text-kit-fg-3",
|
|
67
|
+
children: name
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
var isUrlish = (s) => /[/.]/.test(s);
|
|
71
|
+
function readIcon(v) {
|
|
72
|
+
if (v == null || v === "") return { kind: "empty" };
|
|
73
|
+
if (typeof v === "string") return DOCK_ICON_NAME_SET.has(v) ? {
|
|
74
|
+
kind: "name",
|
|
75
|
+
name: v
|
|
76
|
+
} : isUrlish(v) ? {
|
|
77
|
+
kind: "upload",
|
|
78
|
+
url: v
|
|
79
|
+
} : {
|
|
80
|
+
kind: "unknown",
|
|
81
|
+
name: v
|
|
82
|
+
};
|
|
83
|
+
if (isObj(v) && typeof v.url === "string" && v.url) return {
|
|
84
|
+
kind: "upload",
|
|
85
|
+
url: v.url
|
|
86
|
+
};
|
|
87
|
+
return { kind: "unreadable" };
|
|
88
|
+
}
|
|
89
|
+
var fileName = (url) => decodeURIComponent(url.split(/[?#]/)[0].split("/").pop() || url);
|
|
90
|
+
/** Names picked this session, newest first (shown as "Recent"). */
|
|
91
|
+
var recents = [];
|
|
92
|
+
var pushRecent = (name) => {
|
|
93
|
+
const i = recents.indexOf(name);
|
|
94
|
+
if (i !== -1) recents.splice(i, 1);
|
|
95
|
+
recents.unshift(name);
|
|
96
|
+
recents.length = Math.min(recents.length, COLS);
|
|
97
|
+
};
|
|
98
|
+
var COLS = 8;
|
|
99
|
+
var norm = (q) => q.toLowerCase().trim().replace(/\s+/g, "-");
|
|
100
|
+
/** Up / down within a grid keep the column; past its edge they land in the same column of the next / previous grid. */
|
|
101
|
+
function verticalTarget(grids, g, j, down) {
|
|
102
|
+
const col = j % COLS;
|
|
103
|
+
const cur = grids[g];
|
|
104
|
+
const within = down ? j + COLS : j - COLS;
|
|
105
|
+
if (within >= 0 && within < cur.length) return cur[within];
|
|
106
|
+
if (down && Math.floor(j / COLS) < Math.floor((cur.length - 1) / COLS)) return cur[cur.length - 1];
|
|
107
|
+
const next = grids[down ? g + 1 : g - 1];
|
|
108
|
+
if (!next) return down ? void 0 : "search";
|
|
109
|
+
if (down) return next[Math.min(col, next.length - 1)];
|
|
110
|
+
const lastRow = Math.floor((next.length - 1) / COLS) * COLS;
|
|
111
|
+
return next[Math.min(lastRow + col, next.length - 1)];
|
|
112
|
+
}
|
|
113
|
+
function IconGrid({ items, selected, onPick, label, tip }) {
|
|
114
|
+
const ref = React.useRef(null);
|
|
115
|
+
const stop = items.some((i) => i.key === selected) ? selected : items[0]?.key;
|
|
116
|
+
const move = (e) => {
|
|
117
|
+
const scope = ref.current?.closest("[data-icon-picker]") ?? ref.current;
|
|
118
|
+
const grids = Array.from(scope?.querySelectorAll("[data-icon-grid]") ?? []).map((g) => Array.from(g.querySelectorAll("[data-grid-item]")));
|
|
119
|
+
const btns = grids.flat();
|
|
120
|
+
const i = btns.indexOf(document.activeElement);
|
|
121
|
+
if (i === -1) return;
|
|
122
|
+
const g = grids.findIndex((list) => list.includes(btns[i]));
|
|
123
|
+
const j = grids[g].indexOf(btns[i]);
|
|
124
|
+
let to;
|
|
125
|
+
if (e.key === "ArrowRight") to = btns[Math.min(i + 1, btns.length - 1)];
|
|
126
|
+
else if (e.key === "ArrowLeft") to = btns[Math.max(i - 1, 0)];
|
|
127
|
+
else if (e.key === "Home") to = btns[0];
|
|
128
|
+
else if (e.key === "End") to = btns[btns.length - 1];
|
|
129
|
+
else if (e.key === "ArrowDown" || e.key === "ArrowUp") to = verticalTarget(grids, g, j, e.key === "ArrowDown") ?? btns[i];
|
|
130
|
+
else return;
|
|
131
|
+
e.preventDefault();
|
|
132
|
+
if (to === "search") scope?.querySelector("input[data-icon-search]")?.focus();
|
|
133
|
+
else to?.focus();
|
|
134
|
+
};
|
|
135
|
+
return /* @__PURE__ */ jsx("div", {
|
|
136
|
+
ref,
|
|
137
|
+
"data-icon-grid": true,
|
|
138
|
+
className: "grid gap-0.5",
|
|
139
|
+
style: { gridTemplateColumns: `repeat(${COLS}, minmax(0, 1fr))` },
|
|
140
|
+
role: "listbox",
|
|
141
|
+
"aria-label": label,
|
|
142
|
+
onKeyDown: move,
|
|
143
|
+
children: items.map((it) => /* @__PURE__ */ jsx(Tooltip.Trigger, {
|
|
144
|
+
handle: tip,
|
|
145
|
+
payload: it.label,
|
|
146
|
+
delay: 500,
|
|
147
|
+
render: /* @__PURE__ */ jsx("button", {
|
|
148
|
+
type: "button",
|
|
149
|
+
role: "option",
|
|
150
|
+
"data-grid-item": true,
|
|
151
|
+
"data-icon": it.key,
|
|
152
|
+
"aria-selected": it.key === selected,
|
|
153
|
+
"aria-label": it.label,
|
|
154
|
+
tabIndex: it.key === stop ? 0 : -1,
|
|
155
|
+
onClick: () => onPick(it.key),
|
|
156
|
+
className: cn("flex aspect-square min-w-0 items-center justify-center overflow-hidden rounded-kit-md text-kit-fg-2 outline-none transition-colors hover:bg-kit-hover hover:text-kit-fg focus-visible:outline-2 focus-visible:outline-kit-focus-ring", it.key === selected && "bg-kit-selected text-kit-fg ring-1 ring-inset ring-kit-line-strong"),
|
|
157
|
+
children: it.node
|
|
158
|
+
})
|
|
159
|
+
}, it.key))
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
var NONE = "__none";
|
|
163
|
+
/** The picker: search, Recent, then the whole set ("No icon" first). Search spans the name and its Tabler twin. */
|
|
164
|
+
function IconPicker({ value, onPick, onChooseMedia }) {
|
|
165
|
+
const [q, setQ] = React.useState("");
|
|
166
|
+
const root = React.useRef(null);
|
|
167
|
+
const tip = React.useMemo(() => Tooltip.createHandle(), []);
|
|
168
|
+
const needle = norm(q);
|
|
169
|
+
const item = (name) => ({
|
|
170
|
+
key: name,
|
|
171
|
+
label: iconLabel(name),
|
|
172
|
+
node: /* @__PURE__ */ jsx(Glyph, {
|
|
173
|
+
name,
|
|
174
|
+
className: "size-[18px]"
|
|
175
|
+
})
|
|
176
|
+
});
|
|
177
|
+
const pick = (key) => onPick(key === NONE ? null : key);
|
|
178
|
+
const hits = needle ? DOCK_ICON_NAMES.filter((n) => n.includes(needle) || tablerIconOf(n).includes(needle)) : [];
|
|
179
|
+
const recent = recents.filter((n) => DOCK_ICON_NAME_SET.has(n));
|
|
180
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
181
|
+
ref: root,
|
|
182
|
+
"data-icon-picker": true,
|
|
183
|
+
className: "flex flex-col gap-2",
|
|
184
|
+
children: [
|
|
185
|
+
/* @__PURE__ */ jsx(Tooltip.Root, {
|
|
186
|
+
handle: tip,
|
|
187
|
+
children: ({ payload }) => payload ? /* @__PURE__ */ jsx(TooltipLayer, { children: payload }) : null
|
|
188
|
+
}),
|
|
189
|
+
/* @__PURE__ */ jsxs("label", {
|
|
190
|
+
className: "flex h-8 items-center gap-2 rounded-kit-md bg-kit-muted px-2.5 text-kit-fg-3 focus-within:bg-kit-field-bg focus-within:ring-1 focus-within:ring-kit-line-strong",
|
|
191
|
+
children: [/* @__PURE__ */ jsx(IconSearch, {
|
|
192
|
+
className: "size-4 shrink-0",
|
|
193
|
+
stroke: 1.5,
|
|
194
|
+
"aria-hidden": true
|
|
195
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
196
|
+
autoFocus: true,
|
|
197
|
+
"data-icon-search": true,
|
|
198
|
+
value: q,
|
|
199
|
+
onChange: (e) => setQ(e.target.value),
|
|
200
|
+
onKeyDown: (e) => {
|
|
201
|
+
if (e.key === "ArrowDown") {
|
|
202
|
+
e.preventDefault();
|
|
203
|
+
root.current?.querySelector("[data-grid-item]")?.focus();
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
placeholder: "Search icons",
|
|
207
|
+
"aria-label": "Search icons",
|
|
208
|
+
className: "h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-3"
|
|
209
|
+
})]
|
|
210
|
+
}),
|
|
211
|
+
/* @__PURE__ */ jsx("div", {
|
|
212
|
+
className: "max-h-56 overflow-y-auto pr-0.5",
|
|
213
|
+
children: needle ? hits.length ? /* @__PURE__ */ jsx(IconGrid, {
|
|
214
|
+
label: "Icons",
|
|
215
|
+
selected: value,
|
|
216
|
+
onPick: pick,
|
|
217
|
+
tip,
|
|
218
|
+
items: hits.map(item)
|
|
219
|
+
}) : /* @__PURE__ */ jsxs("p", {
|
|
220
|
+
className: "py-6 text-center text-kit-sm text-kit-fg-3",
|
|
221
|
+
children: [
|
|
222
|
+
"No icons match “",
|
|
223
|
+
q.trim(),
|
|
224
|
+
"”"
|
|
225
|
+
]
|
|
226
|
+
}) : /* @__PURE__ */ jsxs("div", {
|
|
227
|
+
className: "flex flex-col gap-2",
|
|
228
|
+
children: [recent.length ? /* @__PURE__ */ jsx(Group, {
|
|
229
|
+
title: "Recent",
|
|
230
|
+
children: /* @__PURE__ */ jsx(IconGrid, {
|
|
231
|
+
label: "Recent icons",
|
|
232
|
+
selected: value,
|
|
233
|
+
onPick: pick,
|
|
234
|
+
tip,
|
|
235
|
+
items: recent.map(item)
|
|
236
|
+
})
|
|
237
|
+
}) : null, /* @__PURE__ */ jsx(Group, {
|
|
238
|
+
title: recent.length ? "All icons" : void 0,
|
|
239
|
+
children: /* @__PURE__ */ jsx(IconGrid, {
|
|
240
|
+
label: "Icons",
|
|
241
|
+
selected: value ?? NONE,
|
|
242
|
+
onPick: pick,
|
|
243
|
+
tip,
|
|
244
|
+
items: [{
|
|
245
|
+
key: NONE,
|
|
246
|
+
label: "No icon",
|
|
247
|
+
node: /* @__PURE__ */ jsx(IconX, {
|
|
248
|
+
className: "size-4",
|
|
249
|
+
stroke: 1.5,
|
|
250
|
+
"aria-hidden": true
|
|
251
|
+
})
|
|
252
|
+
}, ...DOCK_ICON_NAMES.map(item)]
|
|
253
|
+
})
|
|
254
|
+
})]
|
|
255
|
+
})
|
|
256
|
+
}),
|
|
257
|
+
onChooseMedia ? /* @__PURE__ */ jsxs("div", {
|
|
258
|
+
className: "flex items-center justify-between gap-2 border-t border-kit-line pt-2",
|
|
259
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
260
|
+
className: "whitespace-nowrap text-kit-xs text-kit-fg-3",
|
|
261
|
+
children: "Images keep their colours."
|
|
262
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
263
|
+
size: "xs",
|
|
264
|
+
variant: "ghost",
|
|
265
|
+
leftIcon: /* @__PURE__ */ jsx(IconPhoto, { stroke: 1.5 }),
|
|
266
|
+
onClick: onChooseMedia,
|
|
267
|
+
children: "Choose from media"
|
|
268
|
+
})]
|
|
269
|
+
}) : null
|
|
270
|
+
]
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
function Group({ title, children }) {
|
|
274
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
275
|
+
className: "flex flex-col gap-1",
|
|
276
|
+
children: [title ? /* @__PURE__ */ jsx("div", {
|
|
277
|
+
className: "px-0.5 text-kit-2xs font-medium text-kit-fg-3",
|
|
278
|
+
children: title
|
|
279
|
+
}) : null, children]
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
function IconControl({ field, value, onChange, readOnly, id, invalid }) {
|
|
283
|
+
const { MediaPicker, mediaSrc } = useKitServices();
|
|
284
|
+
const [open, setOpen] = React.useState(false);
|
|
285
|
+
const [mediaOpen, setMediaOpen] = React.useState(false);
|
|
286
|
+
const read = readIcon(value);
|
|
287
|
+
const commit = (v) => {
|
|
288
|
+
onChange(v);
|
|
289
|
+
if (v && DOCK_ICON_NAME_SET.has(v)) pushRecent(v);
|
|
290
|
+
setOpen(false);
|
|
291
|
+
};
|
|
292
|
+
const tile = read.kind === "name" ? /* @__PURE__ */ jsx(Glyph, {
|
|
293
|
+
name: read.name,
|
|
294
|
+
className: "size-4"
|
|
295
|
+
}) : read.kind === "upload" ? /* @__PURE__ */ jsx("img", {
|
|
296
|
+
src: mediaSrc ? mediaSrc(read.url) : read.url,
|
|
297
|
+
alt: "",
|
|
298
|
+
className: "size-4 object-contain"
|
|
299
|
+
}) : read.kind === "empty" ? /* @__PURE__ */ jsx("span", { className: "size-3 rounded-kit-md border border-dashed border-[var(--kit-emphasis-line)]" }) : /* @__PURE__ */ jsx(IconAlertTriangle, {
|
|
300
|
+
className: "size-3.5 text-kit-warning-fg",
|
|
301
|
+
stroke: 1.5,
|
|
302
|
+
"aria-hidden": true
|
|
303
|
+
});
|
|
304
|
+
const text = read.kind === "name" ? iconLabel(read.name) : read.kind === "upload" ? fileName(read.url) : read.kind === "unknown" ? `“${read.name}” isn't in the icon set` : read.kind === "unreadable" ? "This value isn't an icon this picker can read" : "Choose an icon";
|
|
305
|
+
const warn = read.kind === "unknown" || read.kind === "unreadable";
|
|
306
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Popover, {
|
|
307
|
+
open,
|
|
308
|
+
onOpenChange: setOpen,
|
|
309
|
+
children: [/* @__PURE__ */ jsxs(PopoverTrigger, {
|
|
310
|
+
render: /* @__PURE__ */ jsx("button", {
|
|
311
|
+
id,
|
|
312
|
+
type: "button",
|
|
313
|
+
disabled: readOnly,
|
|
314
|
+
"aria-invalid": invalid || void 0,
|
|
315
|
+
className: cn("flex h-8 w-full min-w-0 items-center gap-2.5 rounded-kit-md border bg-kit-field-bg px-1 pr-2.5 text-left text-kit-sm outline-none transition-colors disabled:opacity-60 focus-visible:border-kit-field-border-focus", invalid ? "border-[var(--kit-field-invalid)]" : "border-kit-line-strong hover:border-kit-field-border-hover data-[popup-open]:border-kit-field-border-focus")
|
|
316
|
+
}),
|
|
317
|
+
children: [
|
|
318
|
+
/* @__PURE__ */ jsx("span", {
|
|
319
|
+
className: "flex size-6 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg",
|
|
320
|
+
children: tile
|
|
321
|
+
}),
|
|
322
|
+
/* @__PURE__ */ jsx("span", {
|
|
323
|
+
className: cn("min-w-0 flex-1 truncate", warn ? "text-kit-warning-fg" : read.kind === "empty" ? "text-kit-fg-3" : "text-kit-fg"),
|
|
324
|
+
children: text
|
|
325
|
+
}),
|
|
326
|
+
/* @__PURE__ */ jsx(IconChevronDown, {
|
|
327
|
+
className: "size-3.5 shrink-0 text-kit-fg-3",
|
|
328
|
+
stroke: 1.5,
|
|
329
|
+
"aria-hidden": true
|
|
330
|
+
})
|
|
331
|
+
]
|
|
332
|
+
}), /* @__PURE__ */ jsx(PopoverContent, {
|
|
333
|
+
className: "w-[312px] p-2",
|
|
334
|
+
align: "start",
|
|
335
|
+
"aria-label": `${field.title}: choose an icon`,
|
|
336
|
+
children: /* @__PURE__ */ jsx(IconPicker, {
|
|
337
|
+
value: read.kind === "name" ? read.name : read.kind === "empty" ? void 0 : "",
|
|
338
|
+
onPick: commit,
|
|
339
|
+
onChooseMedia: MediaPicker ? () => {
|
|
340
|
+
setOpen(false);
|
|
341
|
+
setMediaOpen(true);
|
|
342
|
+
} : void 0
|
|
343
|
+
})
|
|
344
|
+
})]
|
|
345
|
+
}), MediaPicker && mediaOpen ? /* @__PURE__ */ jsx(MediaPicker, {
|
|
346
|
+
open: mediaOpen,
|
|
347
|
+
onOpenChange: setMediaOpen,
|
|
348
|
+
accept: ["svg", "image"],
|
|
349
|
+
onPick: (assets) => assets[0]?.url && commit(assets[0].url)
|
|
350
|
+
}) : null] });
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
export { IconControl };
|
|
354
|
+
|
|
355
|
+
//# sourceMappingURL=icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon.js","names":[],"sources":["../../src/kit/controls/icon.tsx"],"sourcesContent":["/**\n * ICON — the icon field (DESIGN 8.14), V2 controls/icon.tsx fitted to what prod stores.\n *\n * Values (backend reference-validation `icon`, the classic PropsPanel IconValueInput):\n * \"arrow-right\" a name from the BetterCMS icon set (DOCK_ICON_NAMES, 472 names)\n * \"https://…/logo.svg\" an uploaded icon: an image URL (picked from the media library; a component prop\n * stores the URL string, like the classic panel's codec=\"url\")\n * { url, … } an uploaded icon stored as an image value: shown and kept until replaced\n * null no icon (\"No icon\"; the backend skips an empty value)\n *\n * The grid offers the BetterCMS set, the one prod accepts. Search also matches a name's Tabler twin through the\n * Tabler ↔ dock adapter (adapters/icons.ts), so \"map\" finds earth-americas. A stored name outside the set (a stale\n * Tabler or Lucide name) is shown with its reason and kept until the author picks another.\n *\n * Glyphs: the host draws them (KitServices.IconGlyph: the dashboard's DockIcon, the set the site renders). With no\n * host renderer the kit draws the Tabler twin, loaded on first use; a name with no Tabler twin shows its name.\n */\nimport * as React from \"react\";\nimport type { Icon as TablerIcon } from \"@tabler/icons-react\";\nimport { IconAlertTriangle, IconChevronDown, IconPhoto, IconSearch, IconX } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { isObj } from \"../lib/path\";\nimport { iconLabel } from \"../lib/icons\";\nimport { useKitServices } from \"../context\";\nimport { DOCK_ICON_NAMES, DOCK_ICON_NAME_SET } from \"../adapters/prod-types\";\nimport { tablerIconOf } from \"../adapters/icons\";\nimport type { ControlProps } from \"../types\";\nimport { Button } from \"../ui/button\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/overlay\";\nimport { TooltipLayer } from \"../ui/tooltip-root\";\n\n/* ── Glyphs ───────────────────────────────────────────────────────────── */\ndeclare module \"../context\" {\n interface KitServices {\n /**\n * Draws one icon of the BetterCMS set by name, aria-hidden (the name beside it is the accessible text): the glyphs\n * the site renders. The dashboard passes `DockIcon` (src/components/dock/DockIcon). Absent → the Tabler twin.\n */\n IconGlyph?: React.ComponentType<{ name: string; className?: string }>;\n }\n}\n\nlet tablerSet: Record<string, unknown> | null = null;\nlet tablerLoad: Promise<void> | null = null;\nconst pascal = (kebab: string) => `Icon${kebab.split(\"-\").map((s) => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n\n/** The full Tabler set, loaded once and only when no host renderer is provided. */\nfunction useTablerSet(need: boolean): Record<string, unknown> | null {\n const [, landed] = React.useReducer((n: number) => n + 1, 0);\n React.useEffect(() => {\n if (!need || tablerSet) return;\n let live = true;\n tablerLoad ??= import(\"@tabler/icons-react\").then((m) => {\n tablerSet = m as unknown as Record<string, unknown>;\n });\n tablerLoad.then(() => live && landed(), () => {});\n return () => {\n live = false;\n };\n }, [need]);\n return tablerSet;\n}\n\nfunction Glyph({ name, className }: { name: string; className?: string }) {\n const Host = useKitServices().IconGlyph;\n const set = useTablerSet(!Host);\n if (Host) return <Host name={name} className={className} />;\n const T = set?.[pascal(tablerIconOf(name))] as TablerIcon | undefined;\n if (T) return <T className={className} stroke={1.5} aria-hidden />;\n // no Tabler twin (or the set is still loading): the name itself, never a stand-in shape\n return (\n <span aria-hidden className=\"max-w-full truncate px-0.5 text-[9px] leading-3 text-kit-fg-3\">\n {name}\n </span>\n );\n}\n\n/* ── Values ───────────────────────────────────────────────────────────── */\ntype Read =\n | { kind: \"empty\" }\n | { kind: \"name\"; name: string }\n | { kind: \"unknown\"; name: string }\n | { kind: \"upload\"; url: string }\n | { kind: \"unreadable\" };\nconst isUrlish = (s: string) => /[/.]/.test(s);\nfunction readIcon(v: unknown): Read {\n if (v == null || v === \"\") return { kind: \"empty\" };\n if (typeof v === \"string\") return DOCK_ICON_NAME_SET.has(v) ? { kind: \"name\", name: v } : isUrlish(v) ? { kind: \"upload\", url: v } : { kind: \"unknown\", name: v };\n if (isObj(v) && typeof v.url === \"string\" && v.url) return { kind: \"upload\", url: v.url };\n return { kind: \"unreadable\" };\n}\nconst fileName = (url: string) => decodeURIComponent(url.split(/[?#]/)[0].split(\"/\").pop() || url);\n\n/** Names picked this session, newest first (shown as \"Recent\"). */\nconst recents: string[] = [];\nconst pushRecent = (name: string) => {\n const i = recents.indexOf(name);\n if (i !== -1) recents.splice(i, 1);\n recents.unshift(name);\n recents.length = Math.min(recents.length, COLS);\n};\n\n/* ── The grid: one tab stop, arrow keys, Home / End ───────────────────── */\nconst COLS = 8;\nconst norm = (q: string) => q.toLowerCase().trim().replace(/\\s+/g, \"-\");\ninterface GridItem {\n key: string;\n label: string;\n node: React.ReactNode;\n}\n\ntype TipHandle = ReturnType<typeof TooltipPrimitive.createHandle<string>>;\n\n/** Up / down within a grid keep the column; past its edge they land in the same column of the next / previous grid. */\nfunction verticalTarget(grids: HTMLButtonElement[][], g: number, j: number, down: boolean): HTMLButtonElement | \"search\" | undefined {\n const col = j % COLS;\n const cur = grids[g];\n const within = down ? j + COLS : j - COLS;\n if (within >= 0 && within < cur.length) return cur[within];\n if (down && Math.floor(j / COLS) < Math.floor((cur.length - 1) / COLS)) return cur[cur.length - 1]; // a short last row\n const next = grids[down ? g + 1 : g - 1];\n if (!next) return down ? undefined : \"search\";\n if (down) return next[Math.min(col, next.length - 1)];\n const lastRow = Math.floor((next.length - 1) / COLS) * COLS;\n return next[Math.min(lastRow + col, next.length - 1)];\n}\n\nfunction IconGrid({ items, selected, onPick, label, tip }: { items: GridItem[]; selected?: string; onPick: (key: string) => void; label: string; tip: TipHandle }) {\n const ref = React.useRef<HTMLDivElement>(null);\n const stop = items.some((i) => i.key === selected) ? selected : items[0]?.key;\n const move = (e: React.KeyboardEvent) => {\n // one keyboard space across every group in the picker (Recent, the set, search results)\n const scope = ref.current?.closest(\"[data-icon-picker]\") ?? ref.current;\n const grids = Array.from(scope?.querySelectorAll<HTMLElement>(\"[data-icon-grid]\") ?? []).map((g) => Array.from(g.querySelectorAll<HTMLButtonElement>(\"[data-grid-item]\")));\n const btns = grids.flat();\n const i = btns.indexOf(document.activeElement as HTMLButtonElement);\n if (i === -1) return;\n const g = grids.findIndex((list) => list.includes(btns[i]));\n const j = grids[g].indexOf(btns[i]);\n let to: HTMLButtonElement | \"search\" | undefined;\n if (e.key === \"ArrowRight\") to = btns[Math.min(i + 1, btns.length - 1)];\n else if (e.key === \"ArrowLeft\") to = btns[Math.max(i - 1, 0)];\n else if (e.key === \"Home\") to = btns[0];\n else if (e.key === \"End\") to = btns[btns.length - 1];\n else if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") to = verticalTarget(grids, g, j, e.key === \"ArrowDown\") ?? btns[i];\n else return;\n e.preventDefault();\n if (to === \"search\") scope?.querySelector<HTMLInputElement>(\"input[data-icon-search]\")?.focus();\n else to?.focus();\n };\n return (\n <div ref={ref} data-icon-grid className=\"grid gap-0.5\" style={{ gridTemplateColumns: `repeat(${COLS}, minmax(0, 1fr))` }} role=\"listbox\" aria-label={label} onKeyDown={move}>\n {items.map((it) => (\n // one shared tooltip for the whole picker (hundreds of icons): each trigger hands it its label\n <TooltipPrimitive.Trigger\n key={it.key}\n handle={tip}\n payload={it.label}\n delay={500}\n render={\n <button\n type=\"button\"\n role=\"option\"\n data-grid-item\n data-icon={it.key}\n aria-selected={it.key === selected}\n aria-label={it.label}\n tabIndex={it.key === stop ? 0 : -1}\n onClick={() => onPick(it.key)}\n className={cn(\n \"flex aspect-square min-w-0 items-center justify-center overflow-hidden rounded-kit-md text-kit-fg-2 outline-none transition-colors hover:bg-kit-hover hover:text-kit-fg focus-visible:outline-2 focus-visible:outline-kit-focus-ring\",\n it.key === selected && \"bg-kit-selected text-kit-fg ring-1 ring-inset ring-kit-line-strong\",\n )}\n >\n {it.node}\n </button>\n }\n />\n ))}\n </div>\n );\n}\n\nconst NONE = \"__none\";\n\n/** The picker: search, Recent, then the whole set (\"No icon\" first). Search spans the name and its Tabler twin. */\nexport function IconPicker({ value, onPick, onChooseMedia }: { value?: string; onPick: (name: string | null) => void; onChooseMedia?: () => void }) {\n const [q, setQ] = React.useState(\"\");\n const root = React.useRef<HTMLDivElement>(null);\n const tip = React.useMemo(() => TooltipPrimitive.createHandle<string>(), []);\n const needle = norm(q);\n const item = (name: string): GridItem => ({ key: name, label: iconLabel(name), node: <Glyph name={name} className=\"size-[18px]\" /> });\n const pick = (key: string) => onPick(key === NONE ? null : key);\n const hits = needle ? DOCK_ICON_NAMES.filter((n) => n.includes(needle) || tablerIconOf(n).includes(needle)) : [];\n const recent = recents.filter((n) => DOCK_ICON_NAME_SET.has(n));\n return (\n <div ref={root} data-icon-picker className=\"flex flex-col gap-2\">\n <TooltipPrimitive.Root handle={tip}>{({ payload }) => (payload ? <TooltipLayer>{payload}</TooltipLayer> : null)}</TooltipPrimitive.Root>\n <label className=\"flex h-8 items-center gap-2 rounded-kit-md bg-kit-muted px-2.5 text-kit-fg-3 focus-within:bg-kit-field-bg focus-within:ring-1 focus-within:ring-kit-line-strong\">\n <IconSearch className=\"size-4 shrink-0\" stroke={1.5} aria-hidden />\n <input\n autoFocus\n data-icon-search\n value={q}\n onChange={(e) => setQ(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n root.current?.querySelector<HTMLButtonElement>(\"[data-grid-item]\")?.focus();\n }\n }}\n placeholder=\"Search icons\"\n aria-label=\"Search icons\"\n className=\"h-full min-w-0 flex-1 bg-transparent text-kit-sm text-kit-fg outline-none placeholder:text-kit-fg-3\"\n />\n </label>\n <div className=\"max-h-56 overflow-y-auto pr-0.5\">\n {needle ? (\n hits.length ? (\n <IconGrid label=\"Icons\" selected={value} onPick={pick} tip={tip} items={hits.map(item)} />\n ) : (\n <p className=\"py-6 text-center text-kit-sm text-kit-fg-3\">No icons match “{q.trim()}”</p>\n )\n ) : (\n <div className=\"flex flex-col gap-2\">\n {recent.length ? (\n <Group title=\"Recent\">\n <IconGrid label=\"Recent icons\" selected={value} onPick={pick} tip={tip} items={recent.map(item)} />\n </Group>\n ) : null}\n <Group title={recent.length ? \"All icons\" : undefined}>\n <IconGrid\n label=\"Icons\"\n selected={value ?? NONE}\n onPick={pick}\n tip={tip}\n items={[{ key: NONE, label: \"No icon\", node: <IconX className=\"size-4\" stroke={1.5} aria-hidden /> }, ...DOCK_ICON_NAMES.map(item)]}\n />\n </Group>\n </div>\n )}\n </div>\n {onChooseMedia ? (\n <div className=\"flex items-center justify-between gap-2 border-t border-kit-line pt-2\">\n <span className=\"whitespace-nowrap text-kit-xs text-kit-fg-3\">Images keep their colours.</span>\n <Button size=\"xs\" variant=\"ghost\" leftIcon={<IconPhoto stroke={1.5} />} onClick={onChooseMedia}>\n Choose from media\n </Button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction Group({ title, children }: { title?: string; children: React.ReactNode }) {\n return (\n <div className=\"flex flex-col gap-1\">\n {title ? <div className=\"px-0.5 text-kit-2xs font-medium text-kit-fg-3\">{title}</div> : null}\n {children}\n </div>\n );\n}\n\n/* ── The control ──────────────────────────────────────────────────────── */\nexport function IconControl({ field, value, onChange, readOnly, id, invalid }: ControlProps) {\n const { MediaPicker, mediaSrc } = useKitServices();\n const [open, setOpen] = React.useState(false);\n const [mediaOpen, setMediaOpen] = React.useState(false);\n const read = readIcon(value);\n\n const commit = (v: string | null) => {\n onChange(v);\n if (v && DOCK_ICON_NAME_SET.has(v)) pushRecent(v);\n setOpen(false);\n };\n\n const tile =\n read.kind === \"name\" ? (\n <Glyph name={read.name} className=\"size-4\" />\n ) : read.kind === \"upload\" ? (\n <img src={mediaSrc ? mediaSrc(read.url) : read.url} alt=\"\" className=\"size-4 object-contain\" />\n ) : read.kind === \"empty\" ? (\n <span className=\"size-3 rounded-kit-md border border-dashed border-[var(--kit-emphasis-line)]\" />\n ) : (\n <IconAlertTriangle className=\"size-3.5 text-kit-warning-fg\" stroke={1.5} aria-hidden />\n );\n const text =\n read.kind === \"name\"\n ? iconLabel(read.name)\n : read.kind === \"upload\"\n ? fileName(read.url)\n : read.kind === \"unknown\"\n ? `“${read.name}” isn't in the icon set`\n : read.kind === \"unreadable\"\n ? \"This value isn't an icon this picker can read\"\n : \"Choose an icon\";\n const warn = read.kind === \"unknown\" || read.kind === \"unreadable\";\n\n return (\n <>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n id={id}\n type=\"button\"\n disabled={readOnly}\n aria-invalid={invalid || undefined}\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-2.5 rounded-kit-md border bg-kit-field-bg px-1 pr-2.5 text-left text-kit-sm outline-none transition-colors disabled:opacity-60 focus-visible:border-kit-field-border-focus\",\n invalid ? \"border-[var(--kit-field-invalid)]\" : \"border-kit-line-strong hover:border-kit-field-border-hover data-[popup-open]:border-kit-field-border-focus\",\n )}\n />\n }\n >\n <span className=\"flex size-6 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg\">{tile}</span>\n <span className={cn(\"min-w-0 flex-1 truncate\", warn ? \"text-kit-warning-fg\" : read.kind === \"empty\" ? \"text-kit-fg-3\" : \"text-kit-fg\")}>{text}</span>\n <IconChevronDown className=\"size-3.5 shrink-0 text-kit-fg-3\" stroke={1.5} aria-hidden />\n </PopoverTrigger>\n <PopoverContent className=\"w-[312px] p-2\" align=\"start\" aria-label={`${field.title}: choose an icon`}>\n <IconPicker\n value={read.kind === \"name\" ? read.name : read.kind === \"empty\" ? undefined : \"\"}\n onPick={commit}\n onChooseMedia={\n MediaPicker\n ? () => {\n setOpen(false);\n setMediaOpen(true);\n }\n : undefined\n }\n />\n </PopoverContent>\n </Popover>\n {MediaPicker && mediaOpen ? (\n <MediaPicker open={mediaOpen} onOpenChange={setMediaOpen} accept={[\"svg\", \"image\"]} onPick={(assets) => assets[0]?.url && commit(assets[0].url)} />\n ) : null}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./c1";
|
|
2
|
+
export * from "./c2";
|
|
3
|
+
export { LinkControl, LinkField, LinkForm, LinkLine, SectionAnchorsProvider, type LinkTarget, type KitLinkServices, type SectionAnchor } from "./link";
|
|
4
|
+
export { ButtonControl, ButtonScreen } from "./button";
|
|
5
|
+
export declare function registerKitControls(): void;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { LinkControl, LinkField, LinkForm, LinkLine, SectionAnchorsProvider } from "./link.js";
|
|
3
|
+
import { ButtonControl, ButtonScreen } from "./button.js";
|
|
4
|
+
import { CONTROLS } from "../engine/kit-field.js";
|
|
5
|
+
import { C1_ACTIONS, C1_CONTROLS, registerC1Controls } from "./c1.js";
|
|
6
|
+
import { C2_CONTROLS, registerC2Controls } from "./c2.js";
|
|
7
|
+
//#region src/kit/controls/index.ts
|
|
8
|
+
/**
|
|
9
|
+
* The ported kit controls, and the one call that puts them in the engine's CONTROLS / ACTIONS tables (and the scale
|
|
10
|
+
* capsule into the number control). A registered type stops drawing the host's legacy control; a type nobody
|
|
11
|
+
* registers keeps it. The kit barrel calls `registerKitControls()` once, so every host that imports the kit gets them.
|
|
12
|
+
*/
|
|
13
|
+
var controls_exports = /* @__PURE__ */ __exportAll({
|
|
14
|
+
ButtonControl: () => ButtonControl,
|
|
15
|
+
ButtonScreen: () => ButtonScreen,
|
|
16
|
+
C1_ACTIONS: () => C1_ACTIONS,
|
|
17
|
+
C1_CONTROLS: () => C1_CONTROLS,
|
|
18
|
+
C2_CONTROLS: () => C2_CONTROLS,
|
|
19
|
+
LinkControl: () => LinkControl,
|
|
20
|
+
LinkField: () => LinkField,
|
|
21
|
+
LinkForm: () => LinkForm,
|
|
22
|
+
LinkLine: () => LinkLine,
|
|
23
|
+
SectionAnchorsProvider: () => SectionAnchorsProvider,
|
|
24
|
+
registerC1Controls: () => registerC1Controls,
|
|
25
|
+
registerC2Controls: () => registerC2Controls,
|
|
26
|
+
registerKitControls: () => registerKitControls
|
|
27
|
+
});
|
|
28
|
+
function registerKitControls() {
|
|
29
|
+
registerC1Controls();
|
|
30
|
+
registerC2Controls();
|
|
31
|
+
CONTROLS.link = LinkControl;
|
|
32
|
+
CONTROLS.button = ButtonControl;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { controls_exports, registerKitControls };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/kit/controls/index.ts"],"sourcesContent":["/**\n * The ported kit controls, and the one call that puts them in the engine's CONTROLS / ACTIONS tables (and the scale\n * capsule into the number control). A registered type stops drawing the host's legacy control; a type nobody\n * registers keeps it. The kit barrel calls `registerKitControls()` once, so every host that imports the kit gets them.\n */\nimport { ButtonControl } from \"./button\";\nimport { LinkControl } from \"./link\";\nimport { registerC1Controls } from \"./c1\";\nimport { registerC2Controls } from \"./c2\";\nimport { CONTROLS } from \"../engine/kit-field\";\n\nexport * from \"./c1\";\nexport * from \"./c2\";\nexport { LinkControl, LinkField, LinkForm, LinkLine, SectionAnchorsProvider, type LinkTarget, type KitLinkServices, type SectionAnchor } from \"./link\";\nexport { ButtonControl, ButtonScreen } from \"./button\";\n\nexport function registerKitControls() {\n registerC1Controls();\n registerC2Controls();\n CONTROLS.link = LinkControl;\n CONTROLS.button = ButtonControl;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,SAAgB,sBAAsB;AACpC,qBAAoB;AACpB,qBAAoB;AACpB,UAAS,OAAO;AAChB,UAAS,SAAS"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { JsonControl } from "./json.js";
|
|
2
|
+
import { CONTROLS } from "../engine/kit-field.js";
|
|
3
|
+
//#region src/kit/controls/json-register.ts
|
|
4
|
+
/** Lane C3: the json field in the engine's dispatch table (one line per type; merge with other lanes by line). */
|
|
5
|
+
CONTROLS.json = JsonControl;
|
|
6
|
+
//#endregion
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=json-register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-register.js","names":[],"sources":["../../src/kit/controls/json-register.ts"],"sourcesContent":["/** Lane C3: the json field in the engine's dispatch table (one line per type; merge with other lanes by line). */\nimport { CONTROLS } from \"../engine/kit-field\";\nimport { JsonControl } from \"./json\";\n\nCONTROLS.json = JsonControl;\n"],"mappings":";;;;AAIA,SAAS,OAAO"}
|
package/controls/json.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useKitEnv } from "../context.js";
|
|
2
|
+
import { CodeDialogField, CodeSurface, jsonProblem } from "./code.js";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
//#region src/kit/controls/json.tsx
|
|
6
|
+
/**
|
|
7
|
+
* JSON — the json field (DESIGN 8.21), on the code surface (code.tsx).
|
|
8
|
+
*
|
|
9
|
+
* Values: whatever JSON the field holds (an object, a list, a number, or a JSON string a textarea wrote). An edit is
|
|
10
|
+
* written PARSED, the way the classic JsonField writes it, and an emptied box writes null; the backend takes both.
|
|
11
|
+
* Text that does not parse is never written: the panel's Done refuses with "Invalid JSON · {reason}", the inline
|
|
12
|
+
* (document) surface keeps the last valid value and shows the reason under the code.
|
|
13
|
+
*/
|
|
14
|
+
/** The text a stored JSON value is edited as. */
|
|
15
|
+
var jsonText = (v) => v == null || v === "" ? "" : typeof v === "string" ? v : JSON.stringify(v, null, 2);
|
|
16
|
+
var parse = (text) => text.trim() ? JSON.parse(text) : null;
|
|
17
|
+
function JsonControl({ field, value, onChange, readOnly, id, invalid }) {
|
|
18
|
+
const { variant } = useKitEnv();
|
|
19
|
+
const text = jsonText(value);
|
|
20
|
+
if (variant === "document") return /* @__PURE__ */ jsx(InlineJson, {
|
|
21
|
+
id,
|
|
22
|
+
value,
|
|
23
|
+
text,
|
|
24
|
+
onChange,
|
|
25
|
+
readOnly,
|
|
26
|
+
invalid
|
|
27
|
+
});
|
|
28
|
+
return /* @__PURE__ */ jsx(CodeDialogField, {
|
|
29
|
+
kind: "json",
|
|
30
|
+
id,
|
|
31
|
+
title: field.title,
|
|
32
|
+
description: field.description || void 0,
|
|
33
|
+
text,
|
|
34
|
+
readOnly,
|
|
35
|
+
invalid,
|
|
36
|
+
onDone: (draft) => {
|
|
37
|
+
if (draft === text) return null;
|
|
38
|
+
const why = jsonProblem(draft);
|
|
39
|
+
if (why) return `Invalid JSON · ${why}`;
|
|
40
|
+
if (draft !== text) onChange(parse(draft));
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** The document variant: the surface inline over a draft that survives invalid intermediates. */
|
|
46
|
+
function InlineJson({ id, value, text, onChange, readOnly, invalid }) {
|
|
47
|
+
const [draft, setDraft] = React.useState(text);
|
|
48
|
+
const [mine, setMine] = React.useState(void 0);
|
|
49
|
+
const [seen, setSeen] = React.useState(value);
|
|
50
|
+
if (value !== seen) {
|
|
51
|
+
setSeen(value);
|
|
52
|
+
if (value !== mine) setDraft(text);
|
|
53
|
+
}
|
|
54
|
+
return /* @__PURE__ */ jsx(CodeSurface, {
|
|
55
|
+
kind: "json",
|
|
56
|
+
id,
|
|
57
|
+
invalid,
|
|
58
|
+
readOnly,
|
|
59
|
+
value: draft,
|
|
60
|
+
onChange: (next) => {
|
|
61
|
+
setDraft(next);
|
|
62
|
+
if (jsonProblem(next)) return;
|
|
63
|
+
const parsed = parse(next);
|
|
64
|
+
setMine(parsed);
|
|
65
|
+
onChange(parsed);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { JsonControl };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","names":[],"sources":["../../src/kit/controls/json.tsx"],"sourcesContent":["/**\n * JSON — the json field (DESIGN 8.21), on the code surface (code.tsx).\n *\n * Values: whatever JSON the field holds (an object, a list, a number, or a JSON string a textarea wrote). An edit is\n * written PARSED, the way the classic JsonField writes it, and an emptied box writes null; the backend takes both.\n * Text that does not parse is never written: the panel's Done refuses with \"Invalid JSON · {reason}\", the inline\n * (document) surface keeps the last valid value and shows the reason under the code.\n */\nimport * as React from \"react\";\nimport { useKitEnv } from \"../context\";\nimport type { ControlProps } from \"../types\";\nimport { CodeDialogField, CodeSurface, jsonProblem } from \"./code\";\n\n/** The text a stored JSON value is edited as. */\nconst jsonText = (v: unknown): string => (v == null || v === \"\" ? \"\" : typeof v === \"string\" ? v : JSON.stringify(v, null, 2));\nconst parse = (text: string): unknown => (text.trim() ? JSON.parse(text) : null);\n\nexport function JsonControl({ field, value, onChange, readOnly, id, invalid }: ControlProps) {\n const { variant } = useKitEnv();\n const text = jsonText(value);\n if (variant === \"document\") return <InlineJson id={id} value={value} text={text} onChange={onChange} readOnly={readOnly} invalid={invalid} />;\n return (\n <CodeDialogField\n kind=\"json\"\n id={id}\n title={field.title}\n description={field.description || undefined}\n text={text}\n readOnly={readOnly}\n invalid={invalid}\n onDone={(draft) => {\n if (draft === text) return null; // nothing edited: Done closes even over a stored string that isn't JSON\n const why = jsonProblem(draft);\n if (why) return `Invalid JSON · ${why}`;\n if (draft !== text) onChange(parse(draft));\n return null;\n }}\n />\n );\n}\n\n/** The document variant: the surface inline over a draft that survives invalid intermediates. */\nfunction InlineJson({ id, value, text, onChange, readOnly, invalid }: { id: string; value: unknown; text: string; onChange: (v: unknown) => void; readOnly?: boolean; invalid?: boolean }) {\n const [draft, setDraft] = React.useState(text);\n const [mine, setMine] = React.useState<unknown>(undefined);\n const [seen, setSeen] = React.useState(value);\n // a value set from elsewhere (undo, another editor) replaces the draft; our own writes keep the author's text\n if (value !== seen) {\n setSeen(value);\n if (value !== mine) setDraft(text);\n }\n return (\n <CodeSurface\n kind=\"json\"\n id={id}\n invalid={invalid}\n readOnly={readOnly}\n value={draft}\n onChange={(next) => {\n setDraft(next);\n if (jsonProblem(next)) return;\n const parsed = parse(next);\n setMine(parsed);\n onChange(parsed);\n }}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,IAAM,YAAY,MAAwB,KAAK,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,GAAG,MAAM,EAAE;AAC7H,IAAM,SAAS,SAA2B,KAAK,MAAM,GAAG,KAAK,MAAM,KAAK,GAAG;AAE3E,SAAgB,YAAY,EAAE,OAAO,OAAO,UAAU,UAAU,IAAI,WAAyB;CAC3F,MAAM,EAAE,YAAY,WAAW;CAC/B,MAAM,OAAO,SAAS,MAAM;AAC5B,KAAI,YAAY,WAAY,QAAO,oBAAC,YAAD;EAAgB;EAAW;EAAa;EAAgB;EAAoB;EAAmB;EAAW,CAAA;AAC7I,QACE,oBAAC,iBAAD;EACE,MAAK;EACD;EACJ,OAAO,MAAM;EACb,aAAa,MAAM,eAAe,KAAA;EAC5B;EACI;EACD;EACT,SAAS,UAAU;AACjB,OAAI,UAAU,KAAM,QAAO;GAC3B,MAAM,MAAM,YAAY,MAAM;AAC9B,OAAI,IAAK,QAAO,kBAAkB;AAClC,OAAI,UAAU,KAAM,UAAS,MAAM,MAAM,CAAC;AAC1C,UAAO;;EAET,CAAA;;;AAKN,SAAS,WAAW,EAAE,IAAI,OAAO,MAAM,UAAU,UAAU,WAAgI;CACzL,MAAM,CAAC,OAAO,YAAY,MAAM,SAAS,KAAK;CAC9C,MAAM,CAAC,MAAM,WAAW,MAAM,SAAkB,KAAA,EAAU;CAC1D,MAAM,CAAC,MAAM,WAAW,MAAM,SAAS,MAAM;AAE7C,KAAI,UAAU,MAAM;AAClB,UAAQ,MAAM;AACd,MAAI,UAAU,KAAM,UAAS,KAAK;;AAEpC,QACE,oBAAC,aAAD;EACE,MAAK;EACD;EACK;EACC;EACV,OAAO;EACP,WAAW,SAAS;AAClB,YAAS,KAAK;AACd,OAAI,YAAY,KAAK,CAAE;GACvB,MAAM,SAAS,MAAM,KAAK;AAC1B,WAAQ,OAAO;AACf,YAAS,OAAO;;EAElB,CAAA"}
|