@hanzo/ui 8.27.90 → 8.28.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/NOTICE +25 -0
- package/README.md +1 -1
- package/dist/backends/gui/alert-dialog.cjs +24 -6
- package/dist/backends/gui/alert-dialog.d.ts +11 -3
- package/dist/backends/gui/alert-dialog.d.ts.map +1 -1
- package/dist/backends/gui/alert-dialog.js +24 -6
- package/dist/backends/gui/alert-dialog.js.map +1 -1
- package/dist/backends/gui/alert.cjs +32 -1
- package/dist/backends/gui/alert.d.ts +36 -3
- package/dist/backends/gui/alert.d.ts.map +1 -1
- package/dist/backends/gui/alert.js +32 -2
- package/dist/backends/gui/alert.js.map +1 -1
- package/dist/backends/gui/avatar-group.cjs +28 -0
- package/dist/backends/gui/avatar-group.d.ts +33 -0
- package/dist/backends/gui/avatar-group.d.ts.map +1 -0
- package/dist/backends/gui/avatar-group.js +26 -0
- package/dist/backends/gui/avatar-group.js.map +1 -0
- package/dist/backends/gui/avatar.cjs +53 -3
- package/dist/backends/gui/avatar.d.ts +46 -4
- package/dist/backends/gui/avatar.d.ts.map +1 -1
- package/dist/backends/gui/avatar.js +52 -3
- package/dist/backends/gui/avatar.js.map +1 -1
- package/dist/backends/gui/badge.cjs +40 -2
- package/dist/backends/gui/badge.d.ts +7 -2
- package/dist/backends/gui/badge.d.ts.map +1 -1
- package/dist/backends/gui/badge.js +40 -2
- package/dist/backends/gui/badge.js.map +1 -1
- package/dist/backends/gui/banner.cjs +40 -1
- package/dist/backends/gui/banner.d.ts +36 -3
- package/dist/backends/gui/banner.d.ts.map +1 -1
- package/dist/backends/gui/banner.js +42 -4
- package/dist/backends/gui/banner.js.map +1 -1
- package/dist/backends/gui/breadcrumb.cjs +28 -10
- package/dist/backends/gui/breadcrumb.d.ts +20 -11
- package/dist/backends/gui/breadcrumb.d.ts.map +1 -1
- package/dist/backends/gui/breadcrumb.js +28 -10
- package/dist/backends/gui/breadcrumb.js.map +1 -1
- package/dist/backends/gui/button-group.cjs +43 -0
- package/dist/backends/gui/button-group.d.ts +48 -0
- package/dist/backends/gui/button-group.d.ts.map +1 -0
- package/dist/backends/gui/button-group.js +40 -0
- package/dist/backends/gui/button-group.js.map +1 -0
- package/dist/backends/gui/button.cjs +177 -4
- package/dist/backends/gui/button.d.ts +69 -4
- package/dist/backends/gui/button.d.ts.map +1 -1
- package/dist/backends/gui/button.js +179 -6
- package/dist/backends/gui/button.js.map +1 -1
- package/dist/backends/gui/card.cjs +50 -21
- package/dist/backends/gui/card.d.ts +16 -7
- package/dist/backends/gui/card.d.ts.map +1 -1
- package/dist/backends/gui/card.js +50 -21
- package/dist/backends/gui/card.js.map +1 -1
- package/dist/backends/gui/checkbox.cjs +86 -14
- package/dist/backends/gui/checkbox.d.ts +30 -2
- package/dist/backends/gui/checkbox.d.ts.map +1 -1
- package/dist/backends/gui/checkbox.js +87 -15
- package/dist/backends/gui/checkbox.js.map +1 -1
- package/dist/backends/gui/chip.cjs +51 -0
- package/dist/backends/gui/chip.d.ts +47 -0
- package/dist/backends/gui/chip.d.ts.map +1 -0
- package/dist/backends/gui/chip.js +49 -0
- package/dist/backends/gui/chip.js.map +1 -0
- package/dist/backends/gui/choice.cjs +18 -3
- package/dist/backends/gui/choice.d.ts +10 -2
- package/dist/backends/gui/choice.d.ts.map +1 -1
- package/dist/backends/gui/choice.js +19 -4
- package/dist/backends/gui/choice.js.map +1 -1
- package/dist/backends/gui/code-editor.cjs +16 -5
- package/dist/backends/gui/code-editor.d.ts +18 -1
- package/dist/backends/gui/code-editor.d.ts.map +1 -1
- package/dist/backends/gui/code-editor.js +16 -5
- package/dist/backends/gui/code-editor.js.map +1 -1
- package/dist/backends/gui/color-sample.cjs +24 -0
- package/dist/backends/gui/color-sample.d.ts +23 -0
- package/dist/backends/gui/color-sample.d.ts.map +1 -0
- package/dist/backends/gui/color-sample.js +22 -0
- package/dist/backends/gui/color-sample.js.map +1 -0
- package/dist/backends/gui/control.cjs +5 -3
- package/dist/backends/gui/control.d.ts +13 -3
- package/dist/backends/gui/control.d.ts.map +1 -1
- package/dist/backends/gui/control.js +5 -3
- package/dist/backends/gui/control.js.map +1 -1
- package/dist/backends/gui/country-select.cjs +69 -0
- package/dist/backends/gui/country-select.d.ts +30 -0
- package/dist/backends/gui/country-select.d.ts.map +1 -0
- package/dist/backends/gui/country-select.js +67 -0
- package/dist/backends/gui/country-select.js.map +1 -0
- package/dist/backends/gui/currency-picker.cjs +48 -0
- package/dist/backends/gui/currency-picker.d.ts +37 -0
- package/dist/backends/gui/currency-picker.d.ts.map +1 -0
- package/dist/backends/gui/currency-picker.js +46 -0
- package/dist/backends/gui/currency-picker.js.map +1 -0
- package/dist/backends/gui/density.cjs +32 -0
- package/dist/backends/gui/density.d.ts +27 -0
- package/dist/backends/gui/density.d.ts.map +1 -0
- package/dist/backends/gui/density.js +27 -0
- package/dist/backends/gui/density.js.map +1 -0
- package/dist/backends/gui/dialog.cjs +65 -7
- package/dist/backends/gui/dialog.d.ts +68 -3
- package/dist/backends/gui/dialog.d.ts.map +1 -1
- package/dist/backends/gui/dialog.js +63 -7
- package/dist/backends/gui/dialog.js.map +1 -1
- package/dist/backends/gui/dropdown-menu.cjs +361 -31
- package/dist/backends/gui/dropdown-menu.d.ts +151 -15
- package/dist/backends/gui/dropdown-menu.d.ts.map +1 -1
- package/dist/backends/gui/dropdown-menu.js +353 -34
- package/dist/backends/gui/dropdown-menu.js.map +1 -1
- package/dist/backends/gui/feedback.cjs +78 -0
- package/dist/backends/gui/feedback.d.ts +46 -0
- package/dist/backends/gui/feedback.d.ts.map +1 -0
- package/dist/backends/gui/feedback.js +74 -0
- package/dist/backends/gui/feedback.js.map +1 -0
- package/dist/backends/gui/field.cjs +71 -14
- package/dist/backends/gui/field.d.ts +43 -3
- package/dist/backends/gui/field.d.ts.map +1 -1
- package/dist/backends/gui/field.js +69 -14
- package/dist/backends/gui/field.js.map +1 -1
- package/dist/backends/gui/flag.cjs +17 -0
- package/dist/backends/gui/flag.d.ts +9 -0
- package/dist/backends/gui/flag.d.ts.map +1 -0
- package/dist/backends/gui/flag.js +14 -0
- package/dist/backends/gui/flag.js.map +1 -0
- package/dist/backends/gui/grip.cjs +35 -3
- package/dist/backends/gui/grip.d.ts +16 -1
- package/dist/backends/gui/grip.d.ts.map +1 -1
- package/dist/backends/gui/grip.js +35 -3
- package/dist/backends/gui/grip.js.map +1 -1
- package/dist/backends/gui/heading.cjs +27 -0
- package/dist/backends/gui/heading.d.ts +8 -0
- package/dist/backends/gui/heading.d.ts.map +1 -0
- package/dist/backends/gui/heading.js +25 -0
- package/dist/backends/gui/heading.js.map +1 -0
- package/dist/backends/gui/hue.cjs +49 -0
- package/dist/backends/gui/hue.d.ts +18 -0
- package/dist/backends/gui/hue.d.ts.map +1 -0
- package/dist/backends/gui/hue.js +43 -0
- package/dist/backends/gui/hue.js.map +1 -0
- package/dist/backends/gui/icon-tile.cjs +36 -0
- package/dist/backends/gui/icon-tile.d.ts +26 -0
- package/dist/backends/gui/icon-tile.d.ts.map +1 -0
- package/dist/backends/gui/icon-tile.js +32 -0
- package/dist/backends/gui/icon-tile.js.map +1 -0
- package/dist/backends/gui/image-input.cjs +78 -0
- package/dist/backends/gui/image-input.d.ts +32 -0
- package/dist/backends/gui/image-input.d.ts.map +1 -0
- package/dist/backends/gui/image-input.js +74 -0
- package/dist/backends/gui/image-input.js.map +1 -0
- package/dist/backends/gui/index.cjs +93 -7
- package/dist/backends/gui/index.d.ts +45 -2
- package/dist/backends/gui/index.d.ts.map +1 -1
- package/dist/backends/gui/index.js +35 -1
- package/dist/backends/gui/index.js.map +1 -1
- package/dist/backends/gui/input-group.cjs +49 -0
- package/dist/backends/gui/input-group.d.ts +46 -0
- package/dist/backends/gui/input-group.d.ts.map +1 -0
- package/dist/backends/gui/input-group.js +46 -0
- package/dist/backends/gui/input-group.js.map +1 -0
- package/dist/backends/gui/input.cjs +32 -4
- package/dist/backends/gui/input.d.ts +5 -1
- package/dist/backends/gui/input.d.ts.map +1 -1
- package/dist/backends/gui/input.js +33 -5
- package/dist/backends/gui/input.js.map +1 -1
- package/dist/backends/gui/item.cjs +34 -2
- package/dist/backends/gui/item.d.ts +21 -5
- package/dist/backends/gui/item.d.ts.map +1 -1
- package/dist/backends/gui/item.js +35 -3
- package/dist/backends/gui/item.js.map +1 -1
- package/dist/backends/gui/json-tree.cjs +103 -15
- package/dist/backends/gui/json-tree.d.ts +39 -3
- package/dist/backends/gui/json-tree.d.ts.map +1 -1
- package/dist/backends/gui/json-tree.js +104 -16
- package/dist/backends/gui/json-tree.js.map +1 -1
- package/dist/backends/gui/kbd.cjs +18 -2
- package/dist/backends/gui/kbd.d.ts +5 -2
- package/dist/backends/gui/kbd.d.ts.map +1 -1
- package/dist/backends/gui/kbd.js +18 -2
- package/dist/backends/gui/kbd.js.map +1 -1
- package/dist/backends/gui/label.cjs +14 -3
- package/dist/backends/gui/label.d.ts +12 -3
- package/dist/backends/gui/label.d.ts.map +1 -1
- package/dist/backends/gui/label.js +14 -3
- package/dist/backends/gui/label.js.map +1 -1
- package/dist/backends/gui/layout.cjs +5 -1
- package/dist/backends/gui/layout.d.ts +1 -1
- package/dist/backends/gui/layout.d.ts.map +1 -1
- package/dist/backends/gui/layout.js +5 -1
- package/dist/backends/gui/layout.js.map +1 -1
- package/dist/backends/gui/number-field.cjs +163 -0
- package/dist/backends/gui/number-field.d.ts +34 -0
- package/dist/backends/gui/number-field.d.ts.map +1 -0
- package/dist/backends/gui/number-field.js +160 -0
- package/dist/backends/gui/number-field.js.map +1 -0
- package/dist/backends/gui/overflowing-list.cjs +79 -0
- package/dist/backends/gui/overflowing-list.d.ts +42 -0
- package/dist/backends/gui/overflowing-list.d.ts.map +1 -0
- package/dist/backends/gui/overflowing-list.js +76 -0
- package/dist/backends/gui/overflowing-list.js.map +1 -0
- package/dist/backends/gui/phone-country-picker.cjs +60 -0
- package/dist/backends/gui/phone-country-picker.d.ts +34 -0
- package/dist/backends/gui/phone-country-picker.d.ts.map +1 -0
- package/dist/backends/gui/phone-country-picker.js +57 -0
- package/dist/backends/gui/phone-country-picker.js.map +1 -0
- package/dist/backends/gui/popover.cjs +20 -4
- package/dist/backends/gui/popover.d.ts +12 -1
- package/dist/backends/gui/popover.d.ts.map +1 -1
- package/dist/backends/gui/popover.js +21 -5
- package/dist/backends/gui/popover.js.map +1 -1
- package/dist/backends/gui/progress-ring.cjs +38 -0
- package/dist/backends/gui/progress-ring.d.ts +37 -0
- package/dist/backends/gui/progress-ring.d.ts.map +1 -0
- package/dist/backends/gui/progress-ring.js +36 -0
- package/dist/backends/gui/progress-ring.js.map +1 -0
- package/dist/backends/gui/progress.cjs +31 -7
- package/dist/backends/gui/progress.d.ts +25 -3
- package/dist/backends/gui/progress.d.ts.map +1 -1
- package/dist/backends/gui/progress.js +32 -8
- package/dist/backends/gui/progress.js.map +1 -1
- package/dist/backends/gui/radio-group.cjs +28 -2
- package/dist/backends/gui/radio-group.d.ts +20 -2
- package/dist/backends/gui/radio-group.d.ts.map +1 -1
- package/dist/backends/gui/radio-group.js +28 -2
- package/dist/backends/gui/radio-group.js.map +1 -1
- package/dist/backends/gui/search-list.cjs +62 -0
- package/dist/backends/gui/search-list.d.ts +65 -0
- package/dist/backends/gui/search-list.d.ts.map +1 -0
- package/dist/backends/gui/search-list.js +58 -0
- package/dist/backends/gui/search-list.js.map +1 -0
- package/dist/backends/gui/select.cjs +50 -16
- package/dist/backends/gui/select.d.ts +12 -3
- package/dist/backends/gui/select.d.ts.map +1 -1
- package/dist/backends/gui/select.js +51 -17
- package/dist/backends/gui/select.js.map +1 -1
- package/dist/backends/gui/shortcut.cjs +122 -0
- package/dist/backends/gui/shortcut.d.ts +58 -0
- package/dist/backends/gui/shortcut.d.ts.map +1 -0
- package/dist/backends/gui/shortcut.js +115 -0
- package/dist/backends/gui/shortcut.js.map +1 -0
- package/dist/backends/gui/skeleton.cjs +41 -10
- package/dist/backends/gui/skeleton.d.ts +46 -8
- package/dist/backends/gui/skeleton.d.ts.map +1 -1
- package/dist/backends/gui/skeleton.js +39 -8
- package/dist/backends/gui/skeleton.js.map +1 -1
- package/dist/backends/gui/snippet.cjs +12 -1
- package/dist/backends/gui/snippet.d.ts +4 -2
- package/dist/backends/gui/snippet.d.ts.map +1 -1
- package/dist/backends/gui/snippet.js +12 -1
- package/dist/backends/gui/snippet.js.map +1 -1
- package/dist/backends/gui/spinner.cjs +8 -1
- package/dist/backends/gui/spinner.d.ts +11 -2
- package/dist/backends/gui/spinner.d.ts.map +1 -1
- package/dist/backends/gui/spinner.js +9 -2
- package/dist/backends/gui/spinner.js.map +1 -1
- package/dist/backends/gui/stack-icon.cjs +17 -0
- package/dist/backends/gui/stack-icon.d.ts +15 -0
- package/dist/backends/gui/stack-icon.d.ts.map +1 -0
- package/dist/backends/gui/stack-icon.js +15 -0
- package/dist/backends/gui/stack-icon.js.map +1 -0
- package/dist/backends/gui/status.cjs +38 -1
- package/dist/backends/gui/status.d.ts +16 -2
- package/dist/backends/gui/status.d.ts.map +1 -1
- package/dist/backends/gui/status.js +38 -2
- package/dist/backends/gui/status.js.map +1 -1
- package/dist/backends/gui/stepper.cjs +73 -3
- package/dist/backends/gui/stepper.d.ts +25 -1
- package/dist/backends/gui/stepper.d.ts.map +1 -1
- package/dist/backends/gui/stepper.js +71 -5
- package/dist/backends/gui/stepper.js.map +1 -1
- package/dist/backends/gui/switch.cjs +35 -20
- package/dist/backends/gui/switch.d.ts +12 -2
- package/dist/backends/gui/switch.d.ts.map +1 -1
- package/dist/backends/gui/switch.js +35 -20
- package/dist/backends/gui/switch.js.map +1 -1
- package/dist/backends/gui/tabs.cjs +63 -17
- package/dist/backends/gui/tabs.d.ts +35 -6
- package/dist/backends/gui/tabs.d.ts.map +1 -1
- package/dist/backends/gui/tabs.js +65 -19
- package/dist/backends/gui/tabs.js.map +1 -1
- package/dist/backends/gui/tag.cjs +48 -0
- package/dist/backends/gui/tag.d.ts +53 -0
- package/dist/backends/gui/tag.d.ts.map +1 -0
- package/dist/backends/gui/tag.js +46 -0
- package/dist/backends/gui/tag.js.map +1 -0
- package/dist/backends/gui/tags.cjs +9 -2
- package/dist/backends/gui/tags.d.ts +6 -5
- package/dist/backends/gui/tags.d.ts.map +1 -1
- package/dist/backends/gui/tags.js +9 -2
- package/dist/backends/gui/tags.js.map +1 -1
- package/dist/backends/gui/textarea.cjs +22 -6
- package/dist/backends/gui/textarea.d.ts +10 -1
- package/dist/backends/gui/textarea.d.ts.map +1 -1
- package/dist/backends/gui/textarea.js +22 -6
- package/dist/backends/gui/textarea.js.map +1 -1
- package/dist/backends/gui/toaster.cjs +167 -3
- package/dist/backends/gui/toaster.d.ts +28 -2
- package/dist/backends/gui/toaster.d.ts.map +1 -1
- package/dist/backends/gui/toaster.js +167 -5
- package/dist/backends/gui/toaster.js.map +1 -1
- package/dist/backends/gui/toggle-group.cjs +13 -0
- package/dist/backends/gui/toggle-group.d.ts +7 -1
- package/dist/backends/gui/toggle-group.d.ts.map +1 -1
- package/dist/backends/gui/toggle-group.js +13 -0
- package/dist/backends/gui/toggle-group.js.map +1 -1
- package/dist/backends/gui/tooltip.cjs +29 -6
- package/dist/backends/gui/tooltip.d.ts +23 -4
- package/dist/backends/gui/tooltip.d.ts.map +1 -1
- package/dist/backends/gui/tooltip.js +31 -8
- package/dist/backends/gui/tooltip.js.map +1 -1
- package/dist/backends/gui/truncated-text.cjs +102 -0
- package/dist/backends/gui/truncated-text.d.ts +55 -0
- package/dist/backends/gui/truncated-text.d.ts.map +1 -0
- package/dist/backends/gui/truncated-text.js +97 -0
- package/dist/backends/gui/truncated-text.js.map +1 -0
- package/dist/gallery/compound.cjs +60 -0
- package/dist/gallery/compound.d.ts +2 -0
- package/dist/gallery/compound.d.ts.map +1 -0
- package/dist/gallery/compound.js +58 -0
- package/dist/gallery/compound.js.map +1 -0
- package/dist/gallery/display.cjs +47 -0
- package/dist/gallery/display.d.ts +3 -0
- package/dist/gallery/display.d.ts.map +1 -0
- package/dist/gallery/display.js +45 -0
- package/dist/gallery/display.js.map +1 -0
- package/dist/gallery/feedback.cjs +38 -0
- package/dist/gallery/feedback.d.ts +2 -0
- package/dist/gallery/feedback.d.ts.map +1 -0
- package/dist/gallery/feedback.js +36 -0
- package/dist/gallery/feedback.js.map +1 -0
- package/dist/gallery/fields.cjs +53 -0
- package/dist/gallery/fields.d.ts +2 -0
- package/dist/gallery/fields.d.ts.map +1 -0
- package/dist/gallery/fields.js +51 -0
- package/dist/gallery/fields.js.map +1 -0
- package/dist/gallery/frames.cjs +47 -0
- package/dist/gallery/frames.d.ts +2 -0
- package/dist/gallery/frames.d.ts.map +1 -0
- package/dist/gallery/frames.js +45 -0
- package/dist/gallery/frames.js.map +1 -0
- package/dist/gallery/menus.cjs +64 -0
- package/dist/gallery/menus.d.ts +15 -0
- package/dist/gallery/menus.d.ts.map +1 -0
- package/dist/gallery/menus.js +58 -0
- package/dist/gallery/menus.js.map +1 -0
- package/dist/gallery/records.cjs +33 -0
- package/dist/gallery/records.d.ts +2 -0
- package/dist/gallery/records.d.ts.map +1 -0
- package/dist/gallery/records.js +31 -0
- package/dist/gallery/records.js.map +1 -0
- package/dist/gallery/section.cjs +17 -0
- package/dist/gallery/section.d.ts +10 -0
- package/dist/gallery/section.d.ts.map +1 -0
- package/dist/gallery/section.js +14 -0
- package/dist/gallery/section.js.map +1 -0
- package/dist/gallery.cjs +8 -14
- package/dist/gallery.d.ts.map +1 -1
- package/dist/gallery.html +1613 -265
- package/dist/gallery.js +3 -9
- package/dist/gallery.js.map +1 -1
- package/dist/gui-config.cjs +37 -7
- package/dist/gui-config.d.ts +11 -3
- package/dist/gui-config.d.ts.map +1 -1
- package/dist/gui-config.js +37 -7
- package/dist/gui-config.js.map +1 -1
- package/dist/index.cjs +61 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +61 -2
- package/dist/index.node.js +7 -1
- package/dist/motion.cjs +25 -1
- package/dist/motion.d.ts +16 -1
- package/dist/motion.d.ts.map +1 -1
- package/dist/motion.js +24 -1
- package/dist/motion.js.map +1 -1
- package/dist/primitives/AvatarGroup.cjs +8 -0
- package/dist/primitives/AvatarGroup.d.ts +2 -0
- package/dist/primitives/AvatarGroup.d.ts.map +1 -0
- package/dist/primitives/AvatarGroup.js +5 -0
- package/dist/primitives/AvatarGroup.js.map +1 -0
- package/dist/primitives/BannerAction.cjs +8 -0
- package/dist/primitives/BannerAction.d.ts +2 -0
- package/dist/primitives/BannerAction.d.ts.map +1 -0
- package/dist/primitives/BannerAction.js +5 -0
- package/dist/primitives/BannerAction.js.map +1 -0
- package/dist/primitives/ButtonGroup.cjs +8 -0
- package/dist/primitives/ButtonGroup.d.ts +2 -0
- package/dist/primitives/ButtonGroup.d.ts.map +1 -0
- package/dist/primitives/ButtonGroup.js +5 -0
- package/dist/primitives/ButtonGroup.js.map +1 -0
- package/dist/primitives/ButtonGroupContext.cjs +8 -0
- package/dist/primitives/ButtonGroupContext.d.ts +2 -0
- package/dist/primitives/ButtonGroupContext.d.ts.map +1 -0
- package/dist/primitives/ButtonGroupContext.js +5 -0
- package/dist/primitives/ButtonGroupContext.js.map +1 -0
- package/dist/primitives/CalloutAction.cjs +8 -0
- package/dist/primitives/CalloutAction.d.ts +2 -0
- package/dist/primitives/CalloutAction.d.ts.map +1 -0
- package/dist/primitives/CalloutAction.js +5 -0
- package/dist/primitives/CalloutAction.js.map +1 -0
- package/dist/primitives/Chip.cjs +8 -0
- package/dist/primitives/Chip.d.ts +2 -0
- package/dist/primitives/Chip.d.ts.map +1 -0
- package/dist/primitives/Chip.js +5 -0
- package/dist/primitives/Chip.js.map +1 -0
- package/dist/primitives/ColorSample.cjs +8 -0
- package/dist/primitives/ColorSample.d.ts +2 -0
- package/dist/primitives/ColorSample.d.ts.map +1 -0
- package/dist/primitives/ColorSample.js +5 -0
- package/dist/primitives/ColorSample.js.map +1 -0
- package/dist/primitives/CountrySelect.cjs +8 -0
- package/dist/primitives/CountrySelect.d.ts +2 -0
- package/dist/primitives/CountrySelect.d.ts.map +1 -0
- package/dist/primitives/CountrySelect.js +5 -0
- package/dist/primitives/CountrySelect.js.map +1 -0
- package/dist/primitives/CurrencyPicker.cjs +8 -0
- package/dist/primitives/CurrencyPicker.d.ts +2 -0
- package/dist/primitives/CurrencyPicker.d.ts.map +1 -0
- package/dist/primitives/CurrencyPicker.js +5 -0
- package/dist/primitives/CurrencyPicker.js.map +1 -0
- package/dist/primitives/Density.cjs +8 -0
- package/dist/primitives/Density.d.ts +2 -0
- package/dist/primitives/Density.d.ts.map +1 -0
- package/dist/primitives/Density.js +5 -0
- package/dist/primitives/Density.js.map +1 -0
- package/dist/primitives/DialogBody.cjs +8 -0
- package/dist/primitives/DialogBody.d.ts +2 -0
- package/dist/primitives/DialogBody.d.ts.map +1 -0
- package/dist/primitives/DialogBody.js +5 -0
- package/dist/primitives/DialogBody.js.map +1 -0
- package/dist/primitives/DropdownMenuBack.cjs +8 -0
- package/dist/primitives/DropdownMenuBack.d.ts +2 -0
- package/dist/primitives/DropdownMenuBack.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuBack.js +5 -0
- package/dist/primitives/DropdownMenuBack.js.map +1 -0
- package/dist/primitives/DropdownMenuClose.cjs +8 -0
- package/dist/primitives/DropdownMenuClose.d.ts +2 -0
- package/dist/primitives/DropdownMenuClose.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuClose.js +5 -0
- package/dist/primitives/DropdownMenuClose.js.map +1 -0
- package/dist/primitives/DropdownMenuEmpty.cjs +8 -0
- package/dist/primitives/DropdownMenuEmpty.d.ts +2 -0
- package/dist/primitives/DropdownMenuEmpty.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuEmpty.js +5 -0
- package/dist/primitives/DropdownMenuEmpty.js.map +1 -0
- package/dist/primitives/DropdownMenuHeader.cjs +8 -0
- package/dist/primitives/DropdownMenuHeader.d.ts +2 -0
- package/dist/primitives/DropdownMenuHeader.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuHeader.js +5 -0
- package/dist/primitives/DropdownMenuHeader.js.map +1 -0
- package/dist/primitives/DropdownMenuLoading.cjs +8 -0
- package/dist/primitives/DropdownMenuLoading.d.ts +2 -0
- package/dist/primitives/DropdownMenuLoading.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuLoading.js +5 -0
- package/dist/primitives/DropdownMenuLoading.js.map +1 -0
- package/dist/primitives/DropdownMenuOptionItem.cjs +8 -0
- package/dist/primitives/DropdownMenuOptionItem.d.ts +2 -0
- package/dist/primitives/DropdownMenuOptionItem.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuOptionItem.js +5 -0
- package/dist/primitives/DropdownMenuOptionItem.js.map +1 -0
- package/dist/primitives/DropdownMenuPage.cjs +8 -0
- package/dist/primitives/DropdownMenuPage.d.ts +2 -0
- package/dist/primitives/DropdownMenuPage.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuPage.js +5 -0
- package/dist/primitives/DropdownMenuPage.js.map +1 -0
- package/dist/primitives/DropdownMenuSearch.cjs +8 -0
- package/dist/primitives/DropdownMenuSearch.d.ts +2 -0
- package/dist/primitives/DropdownMenuSearch.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuSearch.js +5 -0
- package/dist/primitives/DropdownMenuSearch.js.map +1 -0
- package/dist/primitives/DropdownMenuSection.cjs +8 -0
- package/dist/primitives/DropdownMenuSection.d.ts +2 -0
- package/dist/primitives/DropdownMenuSection.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuSection.js +5 -0
- package/dist/primitives/DropdownMenuSection.js.map +1 -0
- package/dist/primitives/DropdownMenuSelectionGroup.cjs +8 -0
- package/dist/primitives/DropdownMenuSelectionGroup.d.ts +2 -0
- package/dist/primitives/DropdownMenuSelectionGroup.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuSelectionGroup.js +5 -0
- package/dist/primitives/DropdownMenuSelectionGroup.js.map +1 -0
- package/dist/primitives/DropdownMenuTitle.cjs +8 -0
- package/dist/primitives/DropdownMenuTitle.d.ts +2 -0
- package/dist/primitives/DropdownMenuTitle.d.ts.map +1 -0
- package/dist/primitives/DropdownMenuTitle.js +5 -0
- package/dist/primitives/DropdownMenuTitle.js.map +1 -0
- package/dist/primitives/Heading.cjs +2 -2
- package/dist/primitives/Heading.d.ts +1 -1
- package/dist/primitives/Heading.d.ts.map +1 -1
- package/dist/primitives/Heading.js +1 -1
- package/dist/primitives/Heading.js.map +1 -1
- package/dist/primitives/IconTile.cjs +8 -0
- package/dist/primitives/IconTile.d.ts +2 -0
- package/dist/primitives/IconTile.d.ts.map +1 -0
- package/dist/primitives/IconTile.js +5 -0
- package/dist/primitives/IconTile.js.map +1 -0
- package/dist/primitives/ImageInput.cjs +8 -0
- package/dist/primitives/ImageInput.d.ts +2 -0
- package/dist/primitives/ImageInput.d.ts.map +1 -0
- package/dist/primitives/ImageInput.js +5 -0
- package/dist/primitives/ImageInput.js.map +1 -0
- package/dist/primitives/InputGroup.cjs +8 -0
- package/dist/primitives/InputGroup.d.ts +2 -0
- package/dist/primitives/InputGroup.d.ts.map +1 -0
- package/dist/primitives/InputGroup.js +5 -0
- package/dist/primitives/InputGroup.js.map +1 -0
- package/dist/primitives/NumberField.cjs +8 -0
- package/dist/primitives/NumberField.d.ts +2 -0
- package/dist/primitives/NumberField.d.ts.map +1 -0
- package/dist/primitives/NumberField.js +5 -0
- package/dist/primitives/NumberField.js.map +1 -0
- package/dist/primitives/OverflowingList.cjs +8 -0
- package/dist/primitives/OverflowingList.d.ts +2 -0
- package/dist/primitives/OverflowingList.d.ts.map +1 -0
- package/dist/primitives/OverflowingList.js +5 -0
- package/dist/primitives/OverflowingList.js.map +1 -0
- package/dist/primitives/PhoneCountryPicker.cjs +8 -0
- package/dist/primitives/PhoneCountryPicker.d.ts +2 -0
- package/dist/primitives/PhoneCountryPicker.d.ts.map +1 -0
- package/dist/primitives/PhoneCountryPicker.js +5 -0
- package/dist/primitives/PhoneCountryPicker.js.map +1 -0
- package/dist/primitives/ProgressRing.cjs +8 -0
- package/dist/primitives/ProgressRing.d.ts +2 -0
- package/dist/primitives/ProgressRing.d.ts.map +1 -0
- package/dist/primitives/ProgressRing.js +5 -0
- package/dist/primitives/ProgressRing.js.map +1 -0
- package/dist/primitives/RadioCircle.cjs +8 -0
- package/dist/primitives/RadioCircle.d.ts +2 -0
- package/dist/primitives/RadioCircle.d.ts.map +1 -0
- package/dist/primitives/RadioCircle.js +5 -0
- package/dist/primitives/RadioCircle.js.map +1 -0
- package/dist/primitives/SKELETON_HEIGHT.cjs +8 -0
- package/dist/primitives/SKELETON_HEIGHT.d.ts +2 -0
- package/dist/primitives/SKELETON_HEIGHT.d.ts.map +1 -0
- package/dist/primitives/SKELETON_HEIGHT.js +5 -0
- package/dist/primitives/SKELETON_HEIGHT.js.map +1 -0
- package/dist/primitives/STATUS_COLOR.cjs +8 -0
- package/dist/primitives/STATUS_COLOR.d.ts +2 -0
- package/dist/primitives/STATUS_COLOR.d.ts.map +1 -0
- package/dist/primitives/STATUS_COLOR.js +5 -0
- package/dist/primitives/STATUS_COLOR.js.map +1 -0
- package/dist/primitives/STATUS_HUE.cjs +8 -0
- package/dist/primitives/STATUS_HUE.d.ts +2 -0
- package/dist/primitives/STATUS_HUE.d.ts.map +1 -0
- package/dist/primitives/STATUS_HUE.js +5 -0
- package/dist/primitives/STATUS_HUE.js.map +1 -0
- package/dist/primitives/STATUS_PAINT.cjs +8 -0
- package/dist/primitives/STATUS_PAINT.d.ts +2 -0
- package/dist/primitives/STATUS_PAINT.d.ts.map +1 -0
- package/dist/primitives/STATUS_PAINT.js +5 -0
- package/dist/primitives/STATUS_PAINT.js.map +1 -0
- package/dist/primitives/Shortcut.cjs +8 -0
- package/dist/primitives/Shortcut.d.ts +2 -0
- package/dist/primitives/Shortcut.d.ts.map +1 -0
- package/dist/primitives/Shortcut.js +5 -0
- package/dist/primitives/Shortcut.js.map +1 -0
- package/dist/primitives/StackIcon.cjs +8 -0
- package/dist/primitives/StackIcon.d.ts +2 -0
- package/dist/primitives/StackIcon.d.ts.map +1 -0
- package/dist/primitives/StackIcon.js +5 -0
- package/dist/primitives/StackIcon.js.map +1 -0
- package/dist/primitives/TOAST_DURATION.cjs +8 -0
- package/dist/primitives/TOAST_DURATION.d.ts +2 -0
- package/dist/primitives/TOAST_DURATION.d.ts.map +1 -0
- package/dist/primitives/TOAST_DURATION.js +5 -0
- package/dist/primitives/TOAST_DURATION.js.map +1 -0
- package/dist/primitives/Tag.cjs +8 -0
- package/dist/primitives/Tag.d.ts +2 -0
- package/dist/primitives/Tag.d.ts.map +1 -0
- package/dist/primitives/Tag.js +5 -0
- package/dist/primitives/Tag.js.map +1 -0
- package/dist/primitives/ToastCard.cjs +8 -0
- package/dist/primitives/ToastCard.d.ts +2 -0
- package/dist/primitives/ToastCard.d.ts.map +1 -0
- package/dist/primitives/ToastCard.js +5 -0
- package/dist/primitives/ToastCard.js.map +1 -0
- package/dist/primitives/ToastFace.cjs +8 -0
- package/dist/primitives/ToastFace.d.ts +2 -0
- package/dist/primitives/ToastFace.d.ts.map +1 -0
- package/dist/primitives/ToastFace.js +5 -0
- package/dist/primitives/ToastFace.js.map +1 -0
- package/dist/primitives/TruncatedText.cjs +8 -0
- package/dist/primitives/TruncatedText.d.ts +2 -0
- package/dist/primitives/TruncatedText.d.ts.map +1 -0
- package/dist/primitives/TruncatedText.js +5 -0
- package/dist/primitives/TruncatedText.js.map +1 -0
- package/dist/primitives/TruncatedTextProvider.cjs +8 -0
- package/dist/primitives/TruncatedTextProvider.d.ts +2 -0
- package/dist/primitives/TruncatedTextProvider.d.ts.map +1 -0
- package/dist/primitives/TruncatedTextProvider.js +5 -0
- package/dist/primitives/TruncatedTextProvider.js.map +1 -0
- package/dist/primitives/VisuallyHidden.cjs +8 -0
- package/dist/primitives/VisuallyHidden.d.ts +2 -0
- package/dist/primitives/VisuallyHidden.d.ts.map +1 -0
- package/dist/primitives/VisuallyHidden.js +5 -0
- package/dist/primitives/VisuallyHidden.js.map +1 -0
- package/dist/primitives/fieldSize.cjs +8 -0
- package/dist/primitives/fieldSize.d.ts +2 -0
- package/dist/primitives/fieldSize.d.ts.map +1 -0
- package/dist/primitives/fieldSize.js +5 -0
- package/dist/primitives/fieldSize.js.map +1 -0
- package/dist/primitives/flag.cjs +8 -0
- package/dist/primitives/flag.d.ts +2 -0
- package/dist/primitives/flag.d.ts.map +1 -0
- package/dist/primitives/flag.js +5 -0
- package/dist/primitives/flag.js.map +1 -0
- package/dist/primitives/formatShortcut.cjs +8 -0
- package/dist/primitives/formatShortcut.d.ts +2 -0
- package/dist/primitives/formatShortcut.d.ts.map +1 -0
- package/dist/primitives/formatShortcut.js +5 -0
- package/dist/primitives/formatShortcut.js.map +1 -0
- package/dist/primitives/initialOf.cjs +8 -0
- package/dist/primitives/initialOf.d.ts +2 -0
- package/dist/primitives/initialOf.d.ts.map +1 -0
- package/dist/primitives/initialOf.js +5 -0
- package/dist/primitives/initialOf.js.map +1 -0
- package/dist/primitives/parseNumber.cjs +8 -0
- package/dist/primitives/parseNumber.d.ts +2 -0
- package/dist/primitives/parseNumber.d.ts.map +1 -0
- package/dist/primitives/parseNumber.js +5 -0
- package/dist/primitives/parseNumber.js.map +1 -0
- package/dist/primitives/speakShortcut.cjs +8 -0
- package/dist/primitives/speakShortcut.d.ts +2 -0
- package/dist/primitives/speakShortcut.d.ts.map +1 -0
- package/dist/primitives/speakShortcut.js +5 -0
- package/dist/primitives/speakShortcut.js.map +1 -0
- package/dist/primitives/tileTones.cjs +8 -0
- package/dist/primitives/tileTones.d.ts +2 -0
- package/dist/primitives/tileTones.d.ts.map +1 -0
- package/dist/primitives/tileTones.js +5 -0
- package/dist/primitives/tileTones.js.map +1 -0
- package/dist/primitives/useDensity.cjs +8 -0
- package/dist/primitives/useDensity.d.ts +2 -0
- package/dist/primitives/useDensity.d.ts.map +1 -0
- package/dist/primitives/useDensity.js +5 -0
- package/dist/primitives/useDensity.js.map +1 -0
- package/dist/primitives/useField.cjs +8 -0
- package/dist/primitives/useField.d.ts +2 -0
- package/dist/primitives/useField.d.ts.map +1 -0
- package/dist/primitives/useField.js +5 -0
- package/dist/primitives/useField.js.map +1 -0
- package/dist/product/ComboBox.cjs +25 -7
- package/dist/product/ComboBox.d.ts +3 -1
- package/dist/product/ComboBox.d.ts.map +1 -1
- package/dist/product/ComboBox.js +25 -7
- package/dist/product/ComboBox.js.map +1 -1
- package/dist/product/CommandMenu.cjs +137 -0
- package/dist/product/CommandMenu.d.ts +77 -0
- package/dist/product/CommandMenu.d.ts.map +1 -0
- package/dist/product/CommandMenu.js +134 -0
- package/dist/product/CommandMenu.js.map +1 -0
- package/dist/product/DetailPane.cjs +154 -12
- package/dist/product/DetailPane.d.ts +80 -2
- package/dist/product/DetailPane.d.ts.map +1 -1
- package/dist/product/DetailPane.js +153 -16
- package/dist/product/DetailPane.js.map +1 -1
- package/dist/product/Fact.cjs +6 -1
- package/dist/product/Fact.d.ts +16 -1
- package/dist/product/Fact.d.ts.map +1 -1
- package/dist/product/Fact.js +6 -1
- package/dist/product/Fact.js.map +1 -1
- package/dist/product/Field.cjs +14 -2
- package/dist/product/Field.d.ts +16 -1
- package/dist/product/Field.d.ts.map +1 -1
- package/dist/product/Field.js +14 -2
- package/dist/product/Field.js.map +1 -1
- package/dist/product/Filters.cjs +61 -9
- package/dist/product/Filters.d.ts +37 -6
- package/dist/product/Filters.d.ts.map +1 -1
- package/dist/product/Filters.js +62 -10
- package/dist/product/Filters.js.map +1 -1
- package/dist/product/MenuRow.cjs +81 -2
- package/dist/product/MenuRow.d.ts +76 -6
- package/dist/product/MenuRow.d.ts.map +1 -1
- package/dist/product/MenuRow.js +81 -4
- package/dist/product/MenuRow.js.map +1 -1
- package/dist/product/PrimaryButton.cjs +5 -1
- package/dist/product/PrimaryButton.d.ts +8 -0
- package/dist/product/PrimaryButton.d.ts.map +1 -1
- package/dist/product/PrimaryButton.js +5 -1
- package/dist/product/PrimaryButton.js.map +1 -1
- package/dist/product/Skeleton.cjs +7 -6
- package/dist/product/Skeleton.d.ts +3 -20
- package/dist/product/Skeleton.d.ts.map +1 -1
- package/dist/product/Skeleton.js +8 -7
- package/dist/product/Skeleton.js.map +1 -1
- package/dist/product/index.cjs +2 -0
- package/dist/product/index.d.ts +1 -0
- package/dist/product/index.d.ts.map +1 -1
- package/dist/product/index.js +2 -0
- package/dist/product/index.js.map +1 -1
- package/dist/settings/Section.cjs +11 -2
- package/dist/settings/Section.d.ts +8 -1
- package/dist/settings/Section.d.ts.map +1 -1
- package/dist/settings/Section.js +11 -2
- package/dist/settings/Section.js.map +1 -1
- package/dist/styles/motion.css +70 -0
- package/dist/styles.css +1479 -136
- package/dist/theme.css +963 -9
- package/package.json +2 -1
package/dist/product/Filters.cjs
CHANGED
|
@@ -6,20 +6,69 @@ exports.SearchInput = SearchInput;
|
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const gui_1 = require("@hanzo/gui");
|
|
8
8
|
const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
|
|
9
|
+
const input_1 = require("../backends/gui/input.cjs");
|
|
10
|
+
const input_group_1 = require("../backends/gui/input-group.cjs");
|
|
11
|
+
const density_1 = require("../backends/gui/density.cjs");
|
|
9
12
|
const instrument_1 = require("./instrument.cjs");
|
|
10
|
-
/**
|
|
11
|
-
|
|
13
|
+
/** The two heights of the track and the inset that holds its thumb off the edge. */
|
|
14
|
+
const TRACK = { md: { h: 32, p: 3, item: 24 }, sm: { h: 24, p: 1, item: 20 } };
|
|
15
|
+
/**
|
|
16
|
+
* A compact segmented pill control — the ONE way filters/ranges/toggles render.
|
|
17
|
+
*
|
|
18
|
+
* `variant="track"` is one choice from a few as a pill track (twenty-ui's
|
|
19
|
+
* SegmentedControl, MIT, NOTICE): the options on one panel-ground capsule, the
|
|
20
|
+
* chosen one lifted onto the raised rung in full ink, the rest quiet. Radio
|
|
21
|
+
* semantics, from gui's single ToggleGroup: one tab stop, the arrows move the
|
|
22
|
+
* choice. `trackSize` md (32) or sm (24); `itemWidth` equal or content. The
|
|
23
|
+
* default `row` is the row of separate bordered buttons it has always been.
|
|
24
|
+
*/
|
|
25
|
+
function Segmented({ options, value, onChange, size = '$2', name, variant = 'row', trackSize = 'md', itemWidth = 'equal', disabled, 'aria-label': ariaLabel, }) {
|
|
12
26
|
const track = (0, instrument_1.useEmit)();
|
|
27
|
+
const pick = (v) => {
|
|
28
|
+
track({ component: 'Segmented', action: 'filter', id: name, value: v });
|
|
29
|
+
onChange(v);
|
|
30
|
+
};
|
|
31
|
+
if (variant === 'track') {
|
|
32
|
+
const box = TRACK[trackSize];
|
|
33
|
+
// A radio group: the arrows move the CHOICE, not only the focus (gui's
|
|
34
|
+
// roving focus moves the focus; this moves the value with it).
|
|
35
|
+
const live = options.filter((o) => !o.disabled);
|
|
36
|
+
const onKeyDown = (e) => {
|
|
37
|
+
const by = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? -1 : 0;
|
|
38
|
+
if (!by || disabled || live.length === 0)
|
|
39
|
+
return;
|
|
40
|
+
const at = live.findIndex((o) => o.value === value);
|
|
41
|
+
pick(live[(at + by + live.length) % live.length].value);
|
|
42
|
+
};
|
|
43
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.ToggleGroup, { "data-slot": "segmented", ...{
|
|
44
|
+
type: 'single',
|
|
45
|
+
value,
|
|
46
|
+
onValueChange: (next) => next && pick(next),
|
|
47
|
+
disableDeactivation: true,
|
|
48
|
+
}, role: "radiogroup", "aria-label": ariaLabel, orientation: "horizontal", disabled: disabled,
|
|
49
|
+
// No `unstyled` on the root: gui's ToggleGroup root does not consume it
|
|
50
|
+
// and it reached the DOM as an attribute. Every style it would reset is
|
|
51
|
+
// stated below.
|
|
52
|
+
display: "inline-flex", self: "flex-start", flexDirection: "row", items: "center", gap: "$0.5", height: box.h, p: box.p, rounded: "$10", bg: "$panel", borderWidth: 1, borderColor: "$borderColor", opacity: disabled ? 0.5 : 1, ...{ onKeyDown }, children: options.map((o) => {
|
|
53
|
+
const on = o.value === value;
|
|
54
|
+
const iconOnly = !!o.icon && !o.label;
|
|
55
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.ToggleGroup.Item, { "data-slot": "segmented-item", value: o.value, role: "radio", "aria-checked": on, "aria-label": o['aria-label'], disabled: disabled || o.disabled, "data-state": on ? 'checked' : 'unchecked', unstyled: true, flexDirection: "row", items: "center", justify: "center", gap: "$1", height: box.item, minW: box.item, px: iconOnly ? 0 : '$2', ...(itemWidth === 'equal' ? { flex: 1, flexBasis: 0 } : null), rounded: "$10", borderWidth: 0, bg: on ? '$raised' : 'transparent', cursor: o.disabled ? 'not-allowed' : 'pointer', hoverStyle: { bg: on ? '$raised' : '$hover' }, children: [o.icon ?? null, o.label ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", fontWeight: "500", color: on ? '$ink' : '$aside', numberOfLines: 1, children: o.label })) : null] }, o.value));
|
|
56
|
+
}) }));
|
|
57
|
+
}
|
|
13
58
|
return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { gap: "$1", flexWrap: "wrap", items: "center", children: options.map((o) => {
|
|
14
59
|
const active = o.value === value;
|
|
15
|
-
return ((0, jsx_runtime_1.jsx)(gui_1.Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => {
|
|
16
|
-
track({ component: 'Segmented', action: 'filter', id: name, value: o.value });
|
|
17
|
-
onChange(o.value);
|
|
18
|
-
}, children: (0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
|
|
60
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => pick(o.value), children: (0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
|
|
19
61
|
}) }));
|
|
20
62
|
}
|
|
21
|
-
/**
|
|
22
|
-
|
|
63
|
+
/**
|
|
64
|
+
* A search input with a leading magnifier, on the one field box: an
|
|
65
|
+
* `InputGroup`, so the glyph sits in the row (lifting while the field has focus)
|
|
66
|
+
* and `actions` sit beside the field rather than inside it — twenty-ui's
|
|
67
|
+
* SearchInput (MIT, NOTICE). Regular density keeps the sunken ground it always
|
|
68
|
+
* had; compact takes the group's own.
|
|
69
|
+
*/
|
|
70
|
+
function SearchInput({ value, onChange, placeholder, name, size, actions, autoFocus, }) {
|
|
71
|
+
const compact = (0, density_1.useDensity)() === 'compact';
|
|
23
72
|
const track = (0, instrument_1.useEmit)();
|
|
24
73
|
// The QUERY IS NEVER SENT — only how long it was. The shape of the behaviour
|
|
25
74
|
// (did people search? how specifically?) without the content.
|
|
@@ -27,5 +76,8 @@ function SearchInput({ value, onChange, placeholder, name, }) {
|
|
|
27
76
|
track({ component: 'SearchInput', action: 'search', id: name, value: (0, instrument_1.textSize)(v) });
|
|
28
77
|
onChange(v);
|
|
29
78
|
};
|
|
30
|
-
|
|
79
|
+
const field = ((0, jsx_runtime_1.jsx)(input_group_1.InputGroup, { size: size, flex: 1, minW: 180, gap: "$2", ...(compact ? null : { bg: '$sunken' }), start: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Search, { size: 16, color: "$ink" }), children: (0, jsx_runtime_1.jsx)(input_1.Input, { value: value, onChangeText: onChangeTracked, placeholder: placeholder, autoFocus: autoFocus }) }));
|
|
80
|
+
if (!actions)
|
|
81
|
+
return field;
|
|
82
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { flex: 1, minW: 180, width: "100%", items: "center", gap: "$2", children: [field, (0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, items: "center", gap: "$2", children: actions })] }));
|
|
31
83
|
}
|
|
@@ -7,28 +7,59 @@
|
|
|
7
7
|
* — the same separation-of-concerns move `ui/Metric.tsx` made out of `gpus/`.
|
|
8
8
|
* `inference/parts.tsx` re-exports them, so there is exactly one definition.
|
|
9
9
|
*/
|
|
10
|
-
import type { ComponentProps } from 'react';
|
|
10
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
11
11
|
import { Button } from '@hanzo/gui';
|
|
12
|
-
|
|
12
|
+
import type { FieldSize } from '../backends/gui/control.js';
|
|
13
|
+
/** One pill in a segmented control. `icon` leads the label; an icon-only option needs `aria-label`. */
|
|
13
14
|
export type Option<T extends string> = {
|
|
14
15
|
label: string;
|
|
15
16
|
value: T;
|
|
17
|
+
icon?: ReactNode;
|
|
18
|
+
/** Names an icon-only option for assistive technology. */
|
|
19
|
+
'aria-label'?: string;
|
|
20
|
+
disabled?: boolean;
|
|
16
21
|
};
|
|
17
|
-
/**
|
|
18
|
-
|
|
22
|
+
/**
|
|
23
|
+
* A compact segmented pill control — the ONE way filters/ranges/toggles render.
|
|
24
|
+
*
|
|
25
|
+
* `variant="track"` is one choice from a few as a pill track (twenty-ui's
|
|
26
|
+
* SegmentedControl, MIT, NOTICE): the options on one panel-ground capsule, the
|
|
27
|
+
* chosen one lifted onto the raised rung in full ink, the rest quiet. Radio
|
|
28
|
+
* semantics, from gui's single ToggleGroup: one tab stop, the arrows move the
|
|
29
|
+
* choice. `trackSize` md (32) or sm (24); `itemWidth` equal or content. The
|
|
30
|
+
* default `row` is the row of separate bordered buttons it has always been.
|
|
31
|
+
*/
|
|
32
|
+
export declare function Segmented<T extends string>({ options, value, onChange, size, name, variant, trackSize, itemWidth, disabled, 'aria-label': ariaLabel, }: {
|
|
19
33
|
options: Option<T>[];
|
|
20
34
|
value: T;
|
|
21
35
|
onChange: (v: T) => void;
|
|
22
36
|
size?: ComponentProps<typeof Button>['size'];
|
|
23
37
|
/** Names the filter in analytics (`status`, `range`); defaults to `Segmented`. */
|
|
24
38
|
name?: string;
|
|
39
|
+
variant?: 'row' | 'track';
|
|
40
|
+
trackSize?: 'md' | 'sm';
|
|
41
|
+
itemWidth?: 'equal' | 'content';
|
|
42
|
+
disabled?: boolean;
|
|
43
|
+
/** Names the choice for assistive technology. */
|
|
44
|
+
'aria-label'?: string;
|
|
25
45
|
}): import("react").JSX.Element;
|
|
26
|
-
/**
|
|
27
|
-
|
|
46
|
+
/**
|
|
47
|
+
* A search input with a leading magnifier, on the one field box: an
|
|
48
|
+
* `InputGroup`, so the glyph sits in the row (lifting while the field has focus)
|
|
49
|
+
* and `actions` sit beside the field rather than inside it — twenty-ui's
|
|
50
|
+
* SearchInput (MIT, NOTICE). Regular density keeps the sunken ground it always
|
|
51
|
+
* had; compact takes the group's own.
|
|
52
|
+
*/
|
|
53
|
+
export declare function SearchInput({ value, onChange, placeholder, name, size, actions, autoFocus, }: {
|
|
28
54
|
value: string;
|
|
29
55
|
onChange: (v: string) => void;
|
|
30
56
|
placeholder?: string;
|
|
31
57
|
/** Names the search box in analytics; defaults to `SearchInput`. */
|
|
32
58
|
name?: string;
|
|
59
|
+
/** The field box (control.ts `BOX`). Unset, the nearest `<Density>` decides. */
|
|
60
|
+
size?: FieldSize;
|
|
61
|
+
/** Controls after the field, 8px from it: a filter toggle, a "new" button. */
|
|
62
|
+
actions?: ReactNode;
|
|
63
|
+
autoFocus?: boolean;
|
|
33
64
|
}): import("react").JSX.Element;
|
|
34
65
|
//# sourceMappingURL=Filters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.d.ts","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"Filters.d.ts","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,EAAE,MAAM,EAA+C,MAAM,YAAY,CAAA;AAMhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,uGAAuG;AACvG,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,IAAI;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,CAAA;IACR,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAKD;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,IAAW,EACX,IAAI,EACJ,OAAe,EACf,SAAgB,EAChB,SAAmB,EACnB,QAAQ,EACR,YAAY,EAAE,SAAS,GACxB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACpB,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;IACxB,IAAI,CAAC,EAAE,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;IAC5C,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,GAAG,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,+BA6GA;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,GACV,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,+BA8BA"}
|
package/dist/product/Filters.js
CHANGED
|
@@ -1,21 +1,70 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Button,
|
|
3
|
+
import { Button, Text, ToggleGroup as GuiToggleGroup, XStack } from '@hanzo/gui';
|
|
4
4
|
import { Search } from '@hanzogui/lucide-icons-2';
|
|
5
|
+
import { Input } from '../backends/gui/input.js';
|
|
6
|
+
import { InputGroup } from '../backends/gui/input-group.js';
|
|
7
|
+
import { useDensity } from '../backends/gui/density.js';
|
|
5
8
|
import { textSize, useEmit } from './instrument.js';
|
|
6
|
-
/**
|
|
7
|
-
|
|
9
|
+
/** The two heights of the track and the inset that holds its thumb off the edge. */
|
|
10
|
+
const TRACK = { md: { h: 32, p: 3, item: 24 }, sm: { h: 24, p: 1, item: 20 } };
|
|
11
|
+
/**
|
|
12
|
+
* A compact segmented pill control — the ONE way filters/ranges/toggles render.
|
|
13
|
+
*
|
|
14
|
+
* `variant="track"` is one choice from a few as a pill track (twenty-ui's
|
|
15
|
+
* SegmentedControl, MIT, NOTICE): the options on one panel-ground capsule, the
|
|
16
|
+
* chosen one lifted onto the raised rung in full ink, the rest quiet. Radio
|
|
17
|
+
* semantics, from gui's single ToggleGroup: one tab stop, the arrows move the
|
|
18
|
+
* choice. `trackSize` md (32) or sm (24); `itemWidth` equal or content. The
|
|
19
|
+
* default `row` is the row of separate bordered buttons it has always been.
|
|
20
|
+
*/
|
|
21
|
+
export function Segmented({ options, value, onChange, size = '$2', name, variant = 'row', trackSize = 'md', itemWidth = 'equal', disabled, 'aria-label': ariaLabel, }) {
|
|
8
22
|
const track = useEmit();
|
|
23
|
+
const pick = (v) => {
|
|
24
|
+
track({ component: 'Segmented', action: 'filter', id: name, value: v });
|
|
25
|
+
onChange(v);
|
|
26
|
+
};
|
|
27
|
+
if (variant === 'track') {
|
|
28
|
+
const box = TRACK[trackSize];
|
|
29
|
+
// A radio group: the arrows move the CHOICE, not only the focus (gui's
|
|
30
|
+
// roving focus moves the focus; this moves the value with it).
|
|
31
|
+
const live = options.filter((o) => !o.disabled);
|
|
32
|
+
const onKeyDown = (e) => {
|
|
33
|
+
const by = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? -1 : 0;
|
|
34
|
+
if (!by || disabled || live.length === 0)
|
|
35
|
+
return;
|
|
36
|
+
const at = live.findIndex((o) => o.value === value);
|
|
37
|
+
pick(live[(at + by + live.length) % live.length].value);
|
|
38
|
+
};
|
|
39
|
+
return (_jsx(GuiToggleGroup, { "data-slot": "segmented", ...{
|
|
40
|
+
type: 'single',
|
|
41
|
+
value,
|
|
42
|
+
onValueChange: (next) => next && pick(next),
|
|
43
|
+
disableDeactivation: true,
|
|
44
|
+
}, role: "radiogroup", "aria-label": ariaLabel, orientation: "horizontal", disabled: disabled,
|
|
45
|
+
// No `unstyled` on the root: gui's ToggleGroup root does not consume it
|
|
46
|
+
// and it reached the DOM as an attribute. Every style it would reset is
|
|
47
|
+
// stated below.
|
|
48
|
+
display: "inline-flex", self: "flex-start", flexDirection: "row", items: "center", gap: "$0.5", height: box.h, p: box.p, rounded: "$10", bg: "$panel", borderWidth: 1, borderColor: "$borderColor", opacity: disabled ? 0.5 : 1, ...{ onKeyDown }, children: options.map((o) => {
|
|
49
|
+
const on = o.value === value;
|
|
50
|
+
const iconOnly = !!o.icon && !o.label;
|
|
51
|
+
return (_jsxs(GuiToggleGroup.Item, { "data-slot": "segmented-item", value: o.value, role: "radio", "aria-checked": on, "aria-label": o['aria-label'], disabled: disabled || o.disabled, "data-state": on ? 'checked' : 'unchecked', unstyled: true, flexDirection: "row", items: "center", justify: "center", gap: "$1", height: box.item, minW: box.item, px: iconOnly ? 0 : '$2', ...(itemWidth === 'equal' ? { flex: 1, flexBasis: 0 } : null), rounded: "$10", borderWidth: 0, bg: on ? '$raised' : 'transparent', cursor: o.disabled ? 'not-allowed' : 'pointer', hoverStyle: { bg: on ? '$raised' : '$hover' }, children: [o.icon ?? null, o.label ? (_jsx(Text, { fontSize: "$2", fontWeight: "500", color: on ? '$ink' : '$aside', numberOfLines: 1, children: o.label })) : null] }, o.value));
|
|
52
|
+
}) }));
|
|
53
|
+
}
|
|
9
54
|
return (_jsx(XStack, { gap: "$1", flexWrap: "wrap", items: "center", children: options.map((o) => {
|
|
10
55
|
const active = o.value === value;
|
|
11
|
-
return (_jsx(Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => {
|
|
12
|
-
track({ component: 'Segmented', action: 'filter', id: name, value: o.value });
|
|
13
|
-
onChange(o.value);
|
|
14
|
-
}, children: _jsx(Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
|
|
56
|
+
return (_jsx(Button, { size: size, bg: active ? '$raised' : 'transparent', borderWidth: 1, borderColor: active ? '$bound' : '$borderColor', "aria-pressed": active, onPress: () => pick(o.value), children: _jsx(Text, { fontSize: "$2", fontWeight: active ? '700' : '500', color: active ? '$ink' : '$quiet', children: o.label }) }, o.value));
|
|
15
57
|
}) }));
|
|
16
58
|
}
|
|
17
|
-
/**
|
|
18
|
-
|
|
59
|
+
/**
|
|
60
|
+
* A search input with a leading magnifier, on the one field box: an
|
|
61
|
+
* `InputGroup`, so the glyph sits in the row (lifting while the field has focus)
|
|
62
|
+
* and `actions` sit beside the field rather than inside it — twenty-ui's
|
|
63
|
+
* SearchInput (MIT, NOTICE). Regular density keeps the sunken ground it always
|
|
64
|
+
* had; compact takes the group's own.
|
|
65
|
+
*/
|
|
66
|
+
export function SearchInput({ value, onChange, placeholder, name, size, actions, autoFocus, }) {
|
|
67
|
+
const compact = useDensity() === 'compact';
|
|
19
68
|
const track = useEmit();
|
|
20
69
|
// The QUERY IS NEVER SENT — only how long it was. The shape of the behaviour
|
|
21
70
|
// (did people search? how specifically?) without the content.
|
|
@@ -23,6 +72,9 @@ export function SearchInput({ value, onChange, placeholder, name, }) {
|
|
|
23
72
|
track({ component: 'SearchInput', action: 'search', id: name, value: textSize(v) });
|
|
24
73
|
onChange(v);
|
|
25
74
|
};
|
|
26
|
-
|
|
75
|
+
const field = (_jsx(InputGroup, { size: size, flex: 1, minW: 180, gap: "$2", ...(compact ? null : { bg: '$sunken' }), start: _jsx(Search, { size: 16, color: "$ink" }), children: _jsx(Input, { value: value, onChangeText: onChangeTracked, placeholder: placeholder, autoFocus: autoFocus }) }));
|
|
76
|
+
if (!actions)
|
|
77
|
+
return field;
|
|
78
|
+
return (_jsxs(XStack, { flex: 1, minW: 180, width: "100%", items: "center", gap: "$2", children: [field, _jsx(XStack, { shrink: 0, items: "center", gap: "$2", children: actions })] }));
|
|
27
79
|
}
|
|
28
80
|
//# sourceMappingURL=Filters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.js","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAYZ,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"Filters.js","sourceRoot":"","sources":["../../src/product/Filters.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAYZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAYhD,oFAAoF;AACpF,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAW,CAAA;AAEvF;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAmB,EAC1C,OAAO,EACP,KAAK,EACL,QAAQ,EACR,IAAI,GAAG,IAAI,EACX,IAAI,EACJ,OAAO,GAAG,KAAK,EACf,SAAS,GAAG,IAAI,EAChB,SAAS,GAAG,OAAO,EACnB,QAAQ,EACR,YAAY,EAAE,SAAS,GAcxB;IACC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;IACvB,MAAM,IAAI,GAAG,CAAC,CAAI,EAAE,EAAE;QACpB,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;QACvE,QAAQ,CAAC,CAAC,CAAC,CAAA;IACb,CAAC,CAAA;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;QAC5B,uEAAuE;QACvE,+DAA+D;QAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,SAAS,GAAG,CAAC,CAAgD,EAAE,EAAE;YACrE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACtH,IAAI,CAAC,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAChD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YACnD,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAA;QACzD,CAAC,CAAA;QACD,OAAO,CACL,KAAC,cAAc,iBACH,WAAW,KAChB;gBACH,IAAI,EAAE,QAAQ;gBACd,KAAK;gBACL,aAAa,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAS,CAAC;gBACxD,mBAAmB,EAAE,IAAI;aACgB,EAC3C,IAAI,EAAC,YAAY,gBACL,SAAS,EACrB,WAAW,EAAC,YAAY,EACxB,QAAQ,EAAE,QAAQ;YAClB,wEAAwE;YACxE,wEAAwE;YACxE,gBAAgB;YAChB,OAAO,EAAC,aAAa,EACrB,IAAI,EAAC,YAAY,EACjB,aAAa,EAAC,KAAK,EACnB,KAAK,EAAC,QAAQ,EACd,GAAG,EAAC,MAAM,EACV,MAAM,EAAE,GAAG,CAAC,CAAC,EACb,CAAC,EAAE,GAAG,CAAC,CAAC,EACR,OAAO,EAAC,KAAK,EACb,EAAE,EAAC,QAAQ,EACX,WAAW,EAAE,CAAC,EACd,WAAW,EAAC,cAAc,EAC1B,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KACtB,EAAE,SAAS,EAAa,YAE5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACjB,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAA;gBAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;gBACrC,OAAO,CACL,MAAC,cAAc,CAAC,IAAI,iBAER,gBAAgB,EAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,IAAI,EAAC,OAAO,kBACE,EAAE,gBACJ,CAAC,CAAC,YAAY,CAAC,EAC3B,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,QAAQ,gBACpB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EACxC,QAAQ,QACR,aAAa,EAAC,KAAK,EACnB,KAAK,EAAC,QAAQ,EACd,OAAO,EAAC,QAAQ,EAChB,GAAG,EAAC,IAAI,EACR,MAAM,EAAE,GAAG,CAAC,IAAI,EAChB,IAAI,EAAE,GAAG,CAAC,IAAI,EACd,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KACnB,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAC9D,OAAO,EAAC,KAAK,EACb,WAAW,EAAE,CAAC,EACd,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAClC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAC9C,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,aAE5C,CAAC,CAAC,IAAI,IAAI,IAAI,EACd,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACT,KAAC,IAAI,IAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,EAAC,KAAK,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,YACjF,CAAC,CAAC,KAAK,GACH,CACR,CAAC,CAAC,CAAC,IAAI,KA5BH,CAAC,CAAC,KAAK,CA6BQ,CACvB,CAAA;YACH,CAAC,CAAC,GACa,CAClB,CAAA;IACH,CAAC;IACD,OAAO,CACL,KAAC,MAAM,IAAC,GAAG,EAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,YAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACjB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAA;YAChC,OAAO,CACL,KAAC,MAAM,IAEL,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EACtC,WAAW,EAAE,CAAC,EACd,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,kBACjC,MAAM,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAE5B,KAAC,IAAI,IAAC,QAAQ,EAAC,IAAI,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,YACtF,CAAC,CAAC,KAAK,GACH,IAVF,CAAC,CAAC,KAAK,CAWL,CACV,CAAA;QACH,CAAC,CAAC,GACK,CACV,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,SAAS,GAYV;IACC,MAAM,OAAO,GAAG,UAAU,EAAE,KAAK,SAAS,CAAA;IAC1C,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;IACvB,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE;QACpC,KAAK,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACnF,QAAQ,CAAC,CAAC,CAAC,CAAA;IACb,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,CACZ,KAAC,UAAU,IACT,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,GAAG,EACT,GAAG,EAAC,IAAI,KACJ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EACxC,KAAK,EAAE,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,MAAM,GAAG,YAExC,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,GAAI,GAC3F,CACd,CAAA;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,OAAO,CACL,MAAC,MAAM,IAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAC7D,KAAK,EACN,KAAC,MAAM,IAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,YACvC,OAAO,GACD,IACF,CACV,CAAA;AACH,CAAC"}
|
package/dist/product/MenuRow.cjs
CHANGED
|
@@ -1,16 +1,95 @@
|
|
|
1
1
|
'use client';"use strict";
|
|
2
2
|
'use client';
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.MENU_ROW = void 0;
|
|
5
|
+
exports.MenuRowContent = MenuRowContent;
|
|
4
6
|
exports.MenuRow = MenuRow;
|
|
5
7
|
exports.MenuLabel = MenuLabel;
|
|
6
8
|
exports.MenuRule = MenuRule;
|
|
7
9
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
10
|
+
/**
|
|
11
|
+
* MenuRow — ONE row for the identity sheets: `OrgSwitcher`, `UserMenu`, and
|
|
12
|
+
* whatever a surface adds to either through `footer`.
|
|
13
|
+
*
|
|
14
|
+
* The anatomy is always the same — a leading dot or icon, a label, an optional
|
|
15
|
+
* second line, and a check on the chosen one — and it was written four times:
|
|
16
|
+
* once inside the org switcher, once inside the account menu, and twice more in
|
|
17
|
+
* the console, which had to draw its own to put project rows in the same sheet.
|
|
18
|
+
* Four copies is four sets of numbers, and they disagreed: the same sheet held
|
|
19
|
+
* rows a step apart in their gutter and two different hover tints.
|
|
20
|
+
*
|
|
21
|
+
* A row also has to SAY what it is. A row that can be current is one of a set
|
|
22
|
+
* exactly one of which holds (`menuitemradio`, inside the caller's `group`); a
|
|
23
|
+
* row without the notion is an action (`menuitem`). The presence of `active`
|
|
24
|
+
* decides it, so no call site states it twice and none of them can forget.
|
|
25
|
+
*
|
|
26
|
+
* Every sheet these rows sit in is a `menu`, and a menu owns menu items, groups
|
|
27
|
+
* and separators — nothing else. The choice used to be a `radiogroup` of `radio`
|
|
28
|
+
* rows, the pair gui's `role` union carries whole, and axe fails a `radiogroup`
|
|
29
|
+
* inside a `menu` outright (`aria-required-children`: "children which are not
|
|
30
|
+
* allowed"). `group` + `menuitemradio` + `aria-checked` is the pair ARIA names
|
|
31
|
+
* for a single choice inside a menu. gui's union is React Native's role set and
|
|
32
|
+
* lacks `menuitemradio`, so the one cast below says it; the attribute reaches
|
|
33
|
+
* the DOM as written.
|
|
34
|
+
*
|
|
35
|
+
* THE ANATOMY IS SHARED. `MenuRowContent` is what sits inside any menu row — the
|
|
36
|
+
* leading slot (a dot, an icon, an icon in its tinted well, an avatar, a drag
|
|
37
|
+
* grip), the label with its contextual text, the second line, the shortcut keys,
|
|
38
|
+
* and the trailing check or submenu chevron — and `DropdownMenuItem`'s
|
|
39
|
+
* declarative rows render it inside gui's own `Menu.Item`, so a menu item and a
|
|
40
|
+
* sheet row are one anatomy with each keeping its own role.
|
|
41
|
+
*
|
|
42
|
+
* `size="row"` is the record geometry (twenty-ui's MenuItem, MIT, NOTICE): 32px,
|
|
43
|
+
* 4px inset, 8px gap, a 4px corner concentric in an 8px panel, the hover tint one
|
|
44
|
+
* rung up, the label in the secondary ink. The default stays the sheet row these
|
|
45
|
+
* screens were drawn with.
|
|
46
|
+
*/
|
|
47
|
+
const react_1 = require("react");
|
|
8
48
|
const gui_1 = require("@hanzo/gui");
|
|
9
49
|
const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
|
|
10
50
|
const press_1 = require("../backends/gui/press.cjs");
|
|
11
|
-
|
|
51
|
+
const shortcut_1 = require("../backends/gui/shortcut.cjs");
|
|
52
|
+
const gesture_1 = require("../backends/gui/gesture.cjs");
|
|
53
|
+
/** The record row's geometry, shared with DropdownMenu so a menu and a list are one row. */
|
|
54
|
+
exports.MENU_ROW = { h: 32, px: 4, gap: 8, icon: 16, chevron: 14, well: 4 };
|
|
55
|
+
/** The label's ink. The sheet row keeps the red it was drawn with; the record row reads the error state. */
|
|
56
|
+
const labelColor = (tone, quiet) => tone === 'danger' ? (quiet ? '$bad' : '$red10') : tone === 'placeholder' ? '$hint' : quiet ? '$aside' : '$ink';
|
|
57
|
+
/** A key, a chord or a sequence, as the kit's Shortcut keycaps (spoken once). A node is the caller's own rendering. */
|
|
58
|
+
const keys = (shortcut) => {
|
|
59
|
+
if (shortcut == null || shortcut === false)
|
|
60
|
+
return null;
|
|
61
|
+
if (typeof shortcut === 'string')
|
|
62
|
+
return (0, jsx_runtime_1.jsx)(shortcut_1.Shortcut, { keys: [shortcut] });
|
|
63
|
+
if (Array.isArray(shortcut))
|
|
64
|
+
return (0, jsx_runtime_1.jsx)(shortcut_1.Shortcut, { keys: shortcut });
|
|
65
|
+
return shortcut;
|
|
66
|
+
};
|
|
67
|
+
function MenuRowContent({ label, sub, contextual, contextualPosition = 'left', dot, icon, iconContainer = false, grip = 'never', shortcut, check = false, submenu = false, tone = 'default', quiet = false, hovered = false, subColor = '$hint', }) {
|
|
68
|
+
const lead = dot ? (0, jsx_runtime_1.jsx)(gui_1.YStack, { width: 8, height: 8, rounded: "$10", bg: dot }) : icon;
|
|
69
|
+
const swap = grip === 'onHover' && hovered;
|
|
70
|
+
const leading = grip === 'always' || swap ? ((0, jsx_runtime_1.jsx)(lucide_icons_2_1.GripVertical, { size: exports.MENU_ROW.icon, color: "$hush" })) : lead && iconContainer ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { p: exports.MENU_ROW.well, rounded: "$xs", bg: "$hover", items: "center", justify: "center", shrink: 0, children: lead })) : (lead);
|
|
71
|
+
const dim = contextual != null && contextual !== '' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$hint", numberOfLines: 1, pl: 4, shrink: 1, children: contextual })) : null;
|
|
72
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [grip !== 'never' ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, items: "center", justify: "center", minW: exports.MENU_ROW.icon, children: leading })) : (leading ?? null), (0, jsx_runtime_1.jsxs)(gui_1.YStack, { flex: 1, minW: 0, children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", minW: 0, children: [typeof label === 'string' || typeof label === 'number' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: labelColor(tone, quiet), numberOfLines: 1, shrink: 1, children: label })) : (label), contextualPosition === 'left' ? dim : null] }), sub ? (typeof sub === 'string' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$1", color: subColor, numberOfLines: 1, children: sub })) : (sub)) : null] }), contextualPosition === 'right' ? dim : null, shortcut != null ? (0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, children: keys(shortcut) }) : null, check ? (0, jsx_runtime_1.jsx)(lucide_icons_2_1.Check, { size: exports.MENU_ROW.icon, strokeWidth: 2 }) : null, submenu ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { shrink: 0, animation: "quick", rotate: submenu === 'open' ? '90deg' : '0deg', ...{ 'data-open': submenu === 'open' ? '' : undefined }, children: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.ChevronRight, { size: exports.MENU_ROW.chevron, color: "$hush" }) })) : null] }));
|
|
73
|
+
}
|
|
74
|
+
function MenuRow({ label, sub, dot, icon, active, danger, placeholder, focused = false, disabled = false, actions, actionsVisibility = 'hover', variant = 'default', selected = false, size = 'default', onPress, ...content }) {
|
|
12
75
|
const selectable = active !== undefined;
|
|
13
|
-
|
|
76
|
+
const row = size === 'row';
|
|
77
|
+
const [hovered, setHovered] = (0, react_1.useState)(false);
|
|
78
|
+
const [within, setWithin] = (0, react_1.useState)(false);
|
|
79
|
+
const shown = actionsVisibility === 'always' || hovered || within;
|
|
80
|
+
const lit = variant === 'suggestion' && selected ? '$raised' : focused ? '$hover' : active ? '$edge' : 'transparent';
|
|
81
|
+
const run = disabled ? undefined : onPress;
|
|
82
|
+
const hover = { onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false) };
|
|
83
|
+
const body = ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, press_1.press)(run), ...{ role: selectable ? (gui_1.isWeb ? 'menuitemradio' : 'radio') : 'menuitem' }, "aria-checked": selectable ? !!active : undefined, "aria-disabled": disabled || undefined, ...(variant === 'suggestion' ? { 'aria-selected': selected } : null), cursor: disabled ? 'default' : 'pointer', items: "center", ...(row
|
|
84
|
+
? { gap: exports.MENU_ROW.gap, px: exports.MENU_ROW.px, minH: exports.MENU_ROW.h, rounded: '$xs', ...(0, gesture_1.touch)(exports.MENU_ROW.h, 44, 'y') }
|
|
85
|
+
: { gap: '$2.5', px: '$2', py: '$2', rounded: '$3' }), bg: lit, opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : { bg: variant === 'suggestion' && selected ? '$raised' : row ? '$hover' : '$raised' }, focusVisibleStyle: press_1.RING, ...(actions ? { flex: 1, minW: 0 } : hover), onFocus: () => setWithin(true), onBlur: () => setWithin(false), children: (0, jsx_runtime_1.jsx)(MenuRowContent, { ...content, label: label, sub: sub, dot: dot, icon: icon, check: !!active, tone: danger ? 'danger' : placeholder ? 'placeholder' : 'default', quiet: row, hovered: hovered, subColor: row ? '$hint' : '$soft' }) }));
|
|
86
|
+
if (!actions)
|
|
87
|
+
return body;
|
|
88
|
+
// The actions sit BESIDE the row, not inside it: a control inside a
|
|
89
|
+
// `menuitem` is a nested interactive. One hover covers both.
|
|
90
|
+
return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { ...{ 'data-slot': 'menu-row-with-actions' }, items: "center", gap: exports.MENU_ROW.gap, ...hover, children: [body, (0, jsx_runtime_1.jsx)(gui_1.XStack, { ...{ 'data-slot': 'menu-row-actions' }, role: "group", shrink: 0, items: "center", gap: "$1", opacity: shown ? 1 : 0,
|
|
91
|
+
// A finger cannot hover: on a coarse pointer the actions are always there.
|
|
92
|
+
$touchable: { opacity: 1 }, animation: "75ms", children: actions })] }));
|
|
14
93
|
}
|
|
15
94
|
/**
|
|
16
95
|
* A quiet heading over a group of rows — "Organization", "Project", "Theme".
|
|
@@ -22,25 +22,95 @@
|
|
|
22
22
|
* for a single choice inside a menu. gui's union is React Native's role set and
|
|
23
23
|
* lacks `menuitemradio`, so the one cast below says it; the attribute reaches
|
|
24
24
|
* the DOM as written.
|
|
25
|
+
*
|
|
26
|
+
* THE ANATOMY IS SHARED. `MenuRowContent` is what sits inside any menu row — the
|
|
27
|
+
* leading slot (a dot, an icon, an icon in its tinted well, an avatar, a drag
|
|
28
|
+
* grip), the label with its contextual text, the second line, the shortcut keys,
|
|
29
|
+
* and the trailing check or submenu chevron — and `DropdownMenuItem`'s
|
|
30
|
+
* declarative rows render it inside gui's own `Menu.Item`, so a menu item and a
|
|
31
|
+
* sheet row are one anatomy with each keeping its own role.
|
|
32
|
+
*
|
|
33
|
+
* `size="row"` is the record geometry (twenty-ui's MenuItem, MIT, NOTICE): 32px,
|
|
34
|
+
* 4px inset, 8px gap, a 4px corner concentric in an 8px panel, the hover tint one
|
|
35
|
+
* rung up, the label in the secondary ink. The default stays the sheet row these
|
|
36
|
+
* screens were drawn with.
|
|
25
37
|
*/
|
|
26
|
-
import type
|
|
38
|
+
import { type ReactNode } from 'react';
|
|
39
|
+
import { type ShortcutKeys } from '../backends/gui/shortcut.js';
|
|
27
40
|
/** The tier hue a row may carry. Monochrome by default — only the genuine states
|
|
28
41
|
* take a colour (a live network green, a caution amber). */
|
|
29
42
|
export type DotColor = '$green10' | '$yellow10' | '$soft' | '$faint' | '$dim';
|
|
30
|
-
|
|
31
|
-
|
|
43
|
+
/** The record row's geometry, shared with DropdownMenu so a menu and a list are one row. */
|
|
44
|
+
export declare const MENU_ROW: {
|
|
45
|
+
readonly h: 32;
|
|
46
|
+
readonly px: 4;
|
|
47
|
+
readonly gap: 8;
|
|
48
|
+
readonly icon: 16;
|
|
49
|
+
readonly chevron: 14;
|
|
50
|
+
readonly well: 4;
|
|
51
|
+
};
|
|
52
|
+
export type MenuRowShortcut = ReactNode | string | ShortcutKeys;
|
|
53
|
+
export type MenuRowContentProps = {
|
|
54
|
+
label: ReactNode;
|
|
32
55
|
/** A second, muted line under the label. */
|
|
33
|
-
sub?:
|
|
56
|
+
sub?: ReactNode;
|
|
57
|
+
/** Dimmed text beside the label — a count, a type, an id. */
|
|
58
|
+
contextual?: ReactNode;
|
|
59
|
+
/** `left` sits right after the label; `right` is pushed to the trailing end. */
|
|
60
|
+
contextualPosition?: 'left' | 'right';
|
|
34
61
|
/** A tier dot in place of an icon. */
|
|
35
62
|
dot?: DotColor;
|
|
63
|
+
/** The leading slot: an icon, an Avatar, a logo. */
|
|
36
64
|
icon?: ReactNode;
|
|
65
|
+
/** Seat the icon in its tinted well (4px padding, 4px corner). */
|
|
66
|
+
iconContainer?: boolean;
|
|
67
|
+
/** A drag grip: `always` in place of the icon, `onHover` swapping with it. */
|
|
68
|
+
grip?: 'never' | 'always' | 'onHover';
|
|
69
|
+
/** Keys: a ReactNode, one key, or a list read as one chord. */
|
|
70
|
+
shortcut?: MenuRowShortcut;
|
|
71
|
+
/** The trailing check of the chosen row. */
|
|
72
|
+
check?: boolean;
|
|
73
|
+
/** A submenu chevron; `open` turns it a quarter. */
|
|
74
|
+
submenu?: boolean | 'open';
|
|
75
|
+
/** `danger` for a destructive row, `placeholder` for a row that offers rather than does. */
|
|
76
|
+
tone?: 'default' | 'danger' | 'placeholder';
|
|
77
|
+
/** The record row reads in the secondary ink; the sheet row in full ink. */
|
|
78
|
+
quiet?: boolean;
|
|
79
|
+
/** Whether the row is under the pointer, for the hover-only grip. */
|
|
80
|
+
hovered?: boolean;
|
|
81
|
+
/** The second line's rung: the sheet's softer one or a menu's quiet one. */
|
|
82
|
+
subColor?: '$soft' | '$hint';
|
|
83
|
+
};
|
|
84
|
+
export declare function MenuRowContent({ label, sub, contextual, contextualPosition, dot, icon, iconContainer, grip, shortcut, check, submenu, tone, quiet, hovered, subColor, }: MenuRowContentProps): import("react").JSX.Element;
|
|
85
|
+
export type MenuRowProps = Omit<MenuRowContentProps, 'check' | 'tone' | 'quiet' | 'hovered' | 'subColor' | 'label' | 'sub'> & {
|
|
86
|
+
label: string;
|
|
87
|
+
/** A second, muted line under the label. */
|
|
88
|
+
sub?: string;
|
|
37
89
|
/** Whether this row is the chosen one — see the note above on what it decides. */
|
|
38
90
|
active?: boolean;
|
|
39
91
|
/** The destructive register — sign out, delete, revoke. */
|
|
40
92
|
danger?: boolean;
|
|
41
|
-
|
|
93
|
+
/** A row that offers rather than does: "Add a field", "No value". */
|
|
94
|
+
placeholder?: boolean;
|
|
95
|
+
/** Keyboard-highlighted from outside (a list whose cursor is not focus). */
|
|
96
|
+
focused?: boolean;
|
|
97
|
+
disabled?: boolean;
|
|
98
|
+
/** Trailing actions: shown on hover or focus on a pointer, always on touch. */
|
|
99
|
+
actions?: ReactNode;
|
|
100
|
+
actionsVisibility?: 'hover' | 'always';
|
|
101
|
+
/**
|
|
102
|
+
* `suggestion` is a typeahead row (an @-mention, a variable): its selection
|
|
103
|
+
* follows a caret, not the pointer, so the selected row is a rung stronger
|
|
104
|
+
* than hover.
|
|
105
|
+
*/
|
|
106
|
+
variant?: 'default' | 'suggestion';
|
|
107
|
+
/** With `variant="suggestion"`, the row the caret is on. */
|
|
108
|
+
selected?: boolean;
|
|
109
|
+
/** `row` is the record geometry; the default is the identity sheet's. */
|
|
110
|
+
size?: 'default' | 'row';
|
|
111
|
+
onPress?: () => void;
|
|
42
112
|
};
|
|
43
|
-
export declare function MenuRow({ label, sub, dot, icon, active, danger, onPress }: MenuRowProps): import("react").JSX.Element;
|
|
113
|
+
export declare function MenuRow({ label, sub, dot, icon, active, danger, placeholder, focused, disabled, actions, actionsVisibility, variant, selected, size, onPress, ...content }: MenuRowProps): import("react").JSX.Element;
|
|
44
114
|
/**
|
|
45
115
|
* A quiet heading over a group of rows — "Organization", "Project", "Theme".
|
|
46
116
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuRow.d.ts","sourceRoot":"","sources":["../../src/product/MenuRow.tsx"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"MenuRow.d.ts","sourceRoot":"","sources":["../../src/product/MenuRow.tsx"],"names":[],"mappings":"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"}
|
package/dist/product/MenuRow.js
CHANGED
|
@@ -1,11 +1,88 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* MenuRow — ONE row for the identity sheets: `OrgSwitcher`, `UserMenu`, and
|
|
5
|
+
* whatever a surface adds to either through `footer`.
|
|
6
|
+
*
|
|
7
|
+
* The anatomy is always the same — a leading dot or icon, a label, an optional
|
|
8
|
+
* second line, and a check on the chosen one — and it was written four times:
|
|
9
|
+
* once inside the org switcher, once inside the account menu, and twice more in
|
|
10
|
+
* the console, which had to draw its own to put project rows in the same sheet.
|
|
11
|
+
* Four copies is four sets of numbers, and they disagreed: the same sheet held
|
|
12
|
+
* rows a step apart in their gutter and two different hover tints.
|
|
13
|
+
*
|
|
14
|
+
* A row also has to SAY what it is. A row that can be current is one of a set
|
|
15
|
+
* exactly one of which holds (`menuitemradio`, inside the caller's `group`); a
|
|
16
|
+
* row without the notion is an action (`menuitem`). The presence of `active`
|
|
17
|
+
* decides it, so no call site states it twice and none of them can forget.
|
|
18
|
+
*
|
|
19
|
+
* Every sheet these rows sit in is a `menu`, and a menu owns menu items, groups
|
|
20
|
+
* and separators — nothing else. The choice used to be a `radiogroup` of `radio`
|
|
21
|
+
* rows, the pair gui's `role` union carries whole, and axe fails a `radiogroup`
|
|
22
|
+
* inside a `menu` outright (`aria-required-children`: "children which are not
|
|
23
|
+
* allowed"). `group` + `menuitemradio` + `aria-checked` is the pair ARIA names
|
|
24
|
+
* for a single choice inside a menu. gui's union is React Native's role set and
|
|
25
|
+
* lacks `menuitemradio`, so the one cast below says it; the attribute reaches
|
|
26
|
+
* the DOM as written.
|
|
27
|
+
*
|
|
28
|
+
* THE ANATOMY IS SHARED. `MenuRowContent` is what sits inside any menu row — the
|
|
29
|
+
* leading slot (a dot, an icon, an icon in its tinted well, an avatar, a drag
|
|
30
|
+
* grip), the label with its contextual text, the second line, the shortcut keys,
|
|
31
|
+
* and the trailing check or submenu chevron — and `DropdownMenuItem`'s
|
|
32
|
+
* declarative rows render it inside gui's own `Menu.Item`, so a menu item and a
|
|
33
|
+
* sheet row are one anatomy with each keeping its own role.
|
|
34
|
+
*
|
|
35
|
+
* `size="row"` is the record geometry (twenty-ui's MenuItem, MIT, NOTICE): 32px,
|
|
36
|
+
* 4px inset, 8px gap, a 4px corner concentric in an 8px panel, the hover tint one
|
|
37
|
+
* rung up, the label in the secondary ink. The default stays the sheet row these
|
|
38
|
+
* screens were drawn with.
|
|
39
|
+
*/
|
|
40
|
+
import { useState } from 'react';
|
|
3
41
|
import { Text, XStack, YStack, isWeb } from '@hanzo/gui';
|
|
4
|
-
import { Check } from '@hanzogui/lucide-icons-2';
|
|
42
|
+
import { Check, ChevronRight, GripVertical } from '@hanzogui/lucide-icons-2';
|
|
5
43
|
import { press, RING } from '../backends/gui/press.js';
|
|
6
|
-
|
|
44
|
+
import { Shortcut } from '../backends/gui/shortcut.js';
|
|
45
|
+
import { touch } from '../backends/gui/gesture.js';
|
|
46
|
+
/** The record row's geometry, shared with DropdownMenu so a menu and a list are one row. */
|
|
47
|
+
export const MENU_ROW = { h: 32, px: 4, gap: 8, icon: 16, chevron: 14, well: 4 };
|
|
48
|
+
/** The label's ink. The sheet row keeps the red it was drawn with; the record row reads the error state. */
|
|
49
|
+
const labelColor = (tone, quiet) => tone === 'danger' ? (quiet ? '$bad' : '$red10') : tone === 'placeholder' ? '$hint' : quiet ? '$aside' : '$ink';
|
|
50
|
+
/** A key, a chord or a sequence, as the kit's Shortcut keycaps (spoken once). A node is the caller's own rendering. */
|
|
51
|
+
const keys = (shortcut) => {
|
|
52
|
+
if (shortcut == null || shortcut === false)
|
|
53
|
+
return null;
|
|
54
|
+
if (typeof shortcut === 'string')
|
|
55
|
+
return _jsx(Shortcut, { keys: [shortcut] });
|
|
56
|
+
if (Array.isArray(shortcut))
|
|
57
|
+
return _jsx(Shortcut, { keys: shortcut });
|
|
58
|
+
return shortcut;
|
|
59
|
+
};
|
|
60
|
+
export function MenuRowContent({ label, sub, contextual, contextualPosition = 'left', dot, icon, iconContainer = false, grip = 'never', shortcut, check = false, submenu = false, tone = 'default', quiet = false, hovered = false, subColor = '$hint', }) {
|
|
61
|
+
const lead = dot ? _jsx(YStack, { width: 8, height: 8, rounded: "$10", bg: dot }) : icon;
|
|
62
|
+
const swap = grip === 'onHover' && hovered;
|
|
63
|
+
const leading = grip === 'always' || swap ? (_jsx(GripVertical, { size: MENU_ROW.icon, color: "$hush" })) : lead && iconContainer ? (_jsx(XStack, { p: MENU_ROW.well, rounded: "$xs", bg: "$hover", items: "center", justify: "center", shrink: 0, children: lead })) : (lead);
|
|
64
|
+
const dim = contextual != null && contextual !== '' ? (_jsx(Text, { fontSize: "$2", color: "$hint", numberOfLines: 1, pl: 4, shrink: 1, children: contextual })) : null;
|
|
65
|
+
return (_jsxs(_Fragment, { children: [grip !== 'never' ? (_jsx(XStack, { shrink: 0, items: "center", justify: "center", minW: MENU_ROW.icon, children: leading })) : (leading ?? null), _jsxs(YStack, { flex: 1, minW: 0, children: [_jsxs(XStack, { items: "center", minW: 0, children: [typeof label === 'string' || typeof label === 'number' ? (_jsx(Text, { fontSize: "$2", color: labelColor(tone, quiet), numberOfLines: 1, shrink: 1, children: label })) : (label), contextualPosition === 'left' ? dim : null] }), sub ? (typeof sub === 'string' ? (_jsx(Text, { fontSize: "$1", color: subColor, numberOfLines: 1, children: sub })) : (sub)) : null] }), contextualPosition === 'right' ? dim : null, shortcut != null ? _jsx(XStack, { shrink: 0, children: keys(shortcut) }) : null, check ? _jsx(Check, { size: MENU_ROW.icon, strokeWidth: 2 }) : null, submenu ? (_jsx(XStack, { shrink: 0, animation: "quick", rotate: submenu === 'open' ? '90deg' : '0deg', ...{ 'data-open': submenu === 'open' ? '' : undefined }, children: _jsx(ChevronRight, { size: MENU_ROW.chevron, color: "$hush" }) })) : null] }));
|
|
66
|
+
}
|
|
67
|
+
export function MenuRow({ label, sub, dot, icon, active, danger, placeholder, focused = false, disabled = false, actions, actionsVisibility = 'hover', variant = 'default', selected = false, size = 'default', onPress, ...content }) {
|
|
7
68
|
const selectable = active !== undefined;
|
|
8
|
-
|
|
69
|
+
const row = size === 'row';
|
|
70
|
+
const [hovered, setHovered] = useState(false);
|
|
71
|
+
const [within, setWithin] = useState(false);
|
|
72
|
+
const shown = actionsVisibility === 'always' || hovered || within;
|
|
73
|
+
const lit = variant === 'suggestion' && selected ? '$raised' : focused ? '$hover' : active ? '$edge' : 'transparent';
|
|
74
|
+
const run = disabled ? undefined : onPress;
|
|
75
|
+
const hover = { onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false) };
|
|
76
|
+
const body = (_jsx(XStack, { ...press(run), ...{ role: selectable ? (isWeb ? 'menuitemradio' : 'radio') : 'menuitem' }, "aria-checked": selectable ? !!active : undefined, "aria-disabled": disabled || undefined, ...(variant === 'suggestion' ? { 'aria-selected': selected } : null), cursor: disabled ? 'default' : 'pointer', items: "center", ...(row
|
|
77
|
+
? { gap: MENU_ROW.gap, px: MENU_ROW.px, minH: MENU_ROW.h, rounded: '$xs', ...touch(MENU_ROW.h, 44, 'y') }
|
|
78
|
+
: { gap: '$2.5', px: '$2', py: '$2', rounded: '$3' }), bg: lit, opacity: disabled ? 0.5 : 1, hoverStyle: disabled ? undefined : { bg: variant === 'suggestion' && selected ? '$raised' : row ? '$hover' : '$raised' }, focusVisibleStyle: RING, ...(actions ? { flex: 1, minW: 0 } : hover), onFocus: () => setWithin(true), onBlur: () => setWithin(false), children: _jsx(MenuRowContent, { ...content, label: label, sub: sub, dot: dot, icon: icon, check: !!active, tone: danger ? 'danger' : placeholder ? 'placeholder' : 'default', quiet: row, hovered: hovered, subColor: row ? '$hint' : '$soft' }) }));
|
|
79
|
+
if (!actions)
|
|
80
|
+
return body;
|
|
81
|
+
// The actions sit BESIDE the row, not inside it: a control inside a
|
|
82
|
+
// `menuitem` is a nested interactive. One hover covers both.
|
|
83
|
+
return (_jsxs(XStack, { ...{ 'data-slot': 'menu-row-with-actions' }, items: "center", gap: MENU_ROW.gap, ...hover, children: [body, _jsx(XStack, { ...{ 'data-slot': 'menu-row-actions' }, role: "group", shrink: 0, items: "center", gap: "$1", opacity: shown ? 1 : 0,
|
|
84
|
+
// A finger cannot hover: on a coarse pointer the actions are always there.
|
|
85
|
+
$touchable: { opacity: 1 }, animation: "75ms", children: actions })] }));
|
|
9
86
|
}
|
|
10
87
|
/**
|
|
11
88
|
* A quiet heading over a group of rows — "Organization", "Project", "Theme".
|