@neurocle/synapse-react 0.0.0-bootstrap
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/LICENSE +21 -0
- package/README.md +163 -0
- package/dist/_virtual/_rolldown/runtime.mjs +13 -0
- package/dist/components/accordion/accordion.d.mts +38 -0
- package/dist/components/accordion/accordion.d.mts.map +1 -0
- package/dist/components/accordion/accordion.mjs +29 -0
- package/dist/components/accordion/accordion.mjs.map +1 -0
- package/dist/components/accordion/accordion.recipe.mjs +191 -0
- package/dist/components/accordion/accordion.recipe.mjs.map +1 -0
- package/dist/components/accordion/index.d.mts +2 -0
- package/dist/components/accordion/index.mjs +2 -0
- package/dist/components/alert/alert.anatomy.mjs +8 -0
- package/dist/components/alert/alert.anatomy.mjs.map +1 -0
- package/dist/components/alert/alert.connect.d.mts +4 -0
- package/dist/components/alert/alert.connect.d.mts.map +1 -0
- package/dist/components/alert/alert.connect.mjs +39 -0
- package/dist/components/alert/alert.connect.mjs.map +1 -0
- package/dist/components/alert/alert.d.mts +14 -0
- package/dist/components/alert/alert.d.mts.map +1 -0
- package/dist/components/alert/alert.mjs +37 -0
- package/dist/components/alert/alert.mjs.map +1 -0
- package/dist/components/alert/alert.recipe.mjs +141 -0
- package/dist/components/alert/alert.recipe.mjs.map +1 -0
- package/dist/components/alert/index.d.mts +3 -0
- package/dist/components/alert/index.mjs +2 -0
- package/dist/components/angle-slider/angle-slider.d.mts +35 -0
- package/dist/components/angle-slider/angle-slider.d.mts.map +1 -0
- package/dist/components/angle-slider/angle-slider.mjs +41 -0
- package/dist/components/angle-slider/angle-slider.mjs.map +1 -0
- package/dist/components/angle-slider/angle-slider.recipe.mjs +201 -0
- package/dist/components/angle-slider/angle-slider.recipe.mjs.map +1 -0
- package/dist/components/angle-slider/index.d.mts +2 -0
- package/dist/components/angle-slider/index.mjs +2 -0
- package/dist/components/avatar/avatar.d.mts +18 -0
- package/dist/components/avatar/avatar.d.mts.map +1 -0
- package/dist/components/avatar/avatar.mjs +35 -0
- package/dist/components/avatar/avatar.mjs.map +1 -0
- package/dist/components/avatar/avatar.recipe.mjs +113 -0
- package/dist/components/avatar/avatar.recipe.mjs.map +1 -0
- package/dist/components/avatar/index.d.mts +2 -0
- package/dist/components/avatar/index.mjs +2 -0
- package/dist/components/badge/badge.anatomy.mjs +8 -0
- package/dist/components/badge/badge.anatomy.mjs.map +1 -0
- package/dist/components/badge/badge.connect.d.mts +4 -0
- package/dist/components/badge/badge.connect.d.mts.map +1 -0
- package/dist/components/badge/badge.connect.mjs +32 -0
- package/dist/components/badge/badge.connect.mjs.map +1 -0
- package/dist/components/badge/badge.d.mts +14 -0
- package/dist/components/badge/badge.d.mts.map +1 -0
- package/dist/components/badge/badge.mjs +18 -0
- package/dist/components/badge/badge.mjs.map +1 -0
- package/dist/components/badge/badge.recipe.mjs +84 -0
- package/dist/components/badge/badge.recipe.mjs.map +1 -0
- package/dist/components/badge/index.d.mts +3 -0
- package/dist/components/badge/index.mjs +2 -0
- package/dist/components/breadcrumb/breadcrumb.anatomy.mjs +8 -0
- package/dist/components/breadcrumb/breadcrumb.anatomy.mjs.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.connect.mjs +30 -0
- package/dist/components/breadcrumb/breadcrumb.connect.mjs.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.d.mts +10 -0
- package/dist/components/breadcrumb/breadcrumb.d.mts.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.mjs +31 -0
- package/dist/components/breadcrumb/breadcrumb.mjs.map +1 -0
- package/dist/components/breadcrumb/breadcrumb.recipe.mjs +121 -0
- package/dist/components/breadcrumb/breadcrumb.recipe.mjs.map +1 -0
- package/dist/components/breadcrumb/index.d.mts +2 -0
- package/dist/components/breadcrumb/index.mjs +2 -0
- package/dist/components/button/button.anatomy.mjs +8 -0
- package/dist/components/button/button.anatomy.mjs.map +1 -0
- package/dist/components/button/button.connect.mjs +35 -0
- package/dist/components/button/button.connect.mjs.map +1 -0
- package/dist/components/button/button.d.mts +19 -0
- package/dist/components/button/button.d.mts.map +1 -0
- package/dist/components/button/button.mjs +25 -0
- package/dist/components/button/button.mjs.map +1 -0
- package/dist/components/button/button.recipe.mjs +377 -0
- package/dist/components/button/button.recipe.mjs.map +1 -0
- package/dist/components/button/index.d.mts +2 -0
- package/dist/components/button/index.mjs +2 -0
- package/dist/components/card/card.anatomy.mjs +8 -0
- package/dist/components/card/card.anatomy.mjs.map +1 -0
- package/dist/components/card/card.connect.mjs +24 -0
- package/dist/components/card/card.connect.mjs.map +1 -0
- package/dist/components/card/card.d.mts +9 -0
- package/dist/components/card/card.d.mts.map +1 -0
- package/dist/components/card/card.mjs +23 -0
- package/dist/components/card/card.mjs.map +1 -0
- package/dist/components/card/card.recipe.mjs +58 -0
- package/dist/components/card/card.recipe.mjs.map +1 -0
- package/dist/components/card/index.d.mts +2 -0
- package/dist/components/card/index.mjs +2 -0
- package/dist/components/carousel/carousel.d.mts +67 -0
- package/dist/components/carousel/carousel.d.mts.map +1 -0
- package/dist/components/carousel/carousel.mjs +123 -0
- package/dist/components/carousel/carousel.mjs.map +1 -0
- package/dist/components/carousel/carousel.recipe.mjs +131 -0
- package/dist/components/carousel/carousel.recipe.mjs.map +1 -0
- package/dist/components/carousel/index.d.mts +2 -0
- package/dist/components/carousel/index.mjs +2 -0
- package/dist/components/cascade-select/cascade-select.d.mts +102 -0
- package/dist/components/cascade-select/cascade-select.d.mts.map +1 -0
- package/dist/components/cascade-select/cascade-select.mjs +169 -0
- package/dist/components/cascade-select/cascade-select.mjs.map +1 -0
- package/dist/components/cascade-select/cascade-select.recipe.mjs +309 -0
- package/dist/components/cascade-select/cascade-select.recipe.mjs.map +1 -0
- package/dist/components/cascade-select/index.d.mts +2 -0
- package/dist/components/cascade-select/index.mjs +2 -0
- package/dist/components/checkbox/checkbox.d.mts +37 -0
- package/dist/components/checkbox/checkbox.d.mts.map +1 -0
- package/dist/components/checkbox/checkbox.mjs +55 -0
- package/dist/components/checkbox/checkbox.mjs.map +1 -0
- package/dist/components/checkbox/checkbox.recipe.mjs +170 -0
- package/dist/components/checkbox/checkbox.recipe.mjs.map +1 -0
- package/dist/components/checkbox/index.d.mts +2 -0
- package/dist/components/checkbox/index.mjs +2 -0
- package/dist/components/clipboard/clipboard.d.mts +26 -0
- package/dist/components/clipboard/clipboard.d.mts.map +1 -0
- package/dist/components/clipboard/clipboard.mjs +76 -0
- package/dist/components/clipboard/clipboard.mjs.map +1 -0
- package/dist/components/clipboard/clipboard.recipe.mjs +119 -0
- package/dist/components/clipboard/clipboard.recipe.mjs.map +1 -0
- package/dist/components/clipboard/index.d.mts +2 -0
- package/dist/components/clipboard/index.mjs +2 -0
- package/dist/components/collapsible/collapsible.d.mts +21 -0
- package/dist/components/collapsible/collapsible.d.mts.map +1 -0
- package/dist/components/collapsible/collapsible.mjs +23 -0
- package/dist/components/collapsible/collapsible.mjs.map +1 -0
- package/dist/components/collapsible/collapsible.recipe.mjs +159 -0
- package/dist/components/collapsible/collapsible.recipe.mjs.map +1 -0
- package/dist/components/collapsible/index.d.mts +2 -0
- package/dist/components/collapsible/index.mjs +2 -0
- package/dist/components/collection-window.mjs +299 -0
- package/dist/components/collection-window.mjs.map +1 -0
- package/dist/components/color-picker/color-picker.d.mts +67 -0
- package/dist/components/color-picker/color-picker.d.mts.map +1 -0
- package/dist/components/color-picker/color-picker.mjs +230 -0
- package/dist/components/color-picker/color-picker.mjs.map +1 -0
- package/dist/components/color-picker/color-picker.recipe.mjs +345 -0
- package/dist/components/color-picker/color-picker.recipe.mjs.map +1 -0
- package/dist/components/color-picker/index.d.mts +2 -0
- package/dist/components/color-picker/index.mjs +2 -0
- package/dist/components/combobox/combobox.d.mts +129 -0
- package/dist/components/combobox/combobox.d.mts.map +1 -0
- package/dist/components/combobox/combobox.mjs +92 -0
- package/dist/components/combobox/combobox.mjs.map +1 -0
- package/dist/components/combobox/combobox.recipe.mjs +336 -0
- package/dist/components/combobox/combobox.recipe.mjs.map +1 -0
- package/dist/components/combobox/index.d.mts +2 -0
- package/dist/components/combobox/index.mjs +2 -0
- package/dist/components/date-input/date-input.d.mts +69 -0
- package/dist/components/date-input/date-input.d.mts.map +1 -0
- package/dist/components/date-input/date-input.mjs +106 -0
- package/dist/components/date-input/date-input.mjs.map +1 -0
- package/dist/components/date-input/date-input.recipe.mjs +142 -0
- package/dist/components/date-input/date-input.recipe.mjs.map +1 -0
- package/dist/components/date-input/index.d.mts +2 -0
- package/dist/components/date-input/index.mjs +2 -0
- package/dist/components/date-picker/date-picker.d.mts +114 -0
- package/dist/components/date-picker/date-picker.d.mts.map +1 -0
- package/dist/components/date-picker/date-picker.mjs +269 -0
- package/dist/components/date-picker/date-picker.mjs.map +1 -0
- package/dist/components/date-picker/date-picker.recipe.mjs +495 -0
- package/dist/components/date-picker/date-picker.recipe.mjs.map +1 -0
- package/dist/components/date-picker/index.d.mts +2 -0
- package/dist/components/date-picker/index.mjs +2 -0
- package/dist/components/details.d.mts +9 -0
- package/dist/components/details.d.mts.map +1 -0
- package/dist/components/dialog/dialog.d.mts +45 -0
- package/dist/components/dialog/dialog.d.mts.map +1 -0
- package/dist/components/dialog/dialog.mjs +49 -0
- package/dist/components/dialog/dialog.mjs.map +1 -0
- package/dist/components/dialog/dialog.recipe.mjs +138 -0
- package/dist/components/dialog/dialog.recipe.mjs.map +1 -0
- package/dist/components/dialog/index.d.mts +2 -0
- package/dist/components/dialog/index.mjs +2 -0
- package/dist/components/drawer/drawer.d.mts +62 -0
- package/dist/components/drawer/drawer.d.mts.map +1 -0
- package/dist/components/drawer/drawer.mjs +65 -0
- package/dist/components/drawer/drawer.mjs.map +1 -0
- package/dist/components/drawer/drawer.recipe.mjs +201 -0
- package/dist/components/drawer/drawer.recipe.mjs.map +1 -0
- package/dist/components/drawer/index.d.mts +2 -0
- package/dist/components/drawer/index.mjs +2 -0
- package/dist/components/editable/editable.d.mts +62 -0
- package/dist/components/editable/editable.d.mts.map +1 -0
- package/dist/components/editable/editable.mjs +78 -0
- package/dist/components/editable/editable.mjs.map +1 -0
- package/dist/components/editable/editable.recipe.mjs +152 -0
- package/dist/components/editable/editable.recipe.mjs.map +1 -0
- package/dist/components/editable/index.d.mts +2 -0
- package/dist/components/editable/index.mjs +2 -0
- package/dist/components/empty-state/empty-state.anatomy.mjs +8 -0
- package/dist/components/empty-state/empty-state.anatomy.mjs.map +1 -0
- package/dist/components/empty-state/empty-state.connect.mjs +26 -0
- package/dist/components/empty-state/empty-state.connect.mjs.map +1 -0
- package/dist/components/empty-state/empty-state.d.mts +10 -0
- package/dist/components/empty-state/empty-state.d.mts.map +1 -0
- package/dist/components/empty-state/empty-state.mjs +24 -0
- package/dist/components/empty-state/empty-state.mjs.map +1 -0
- package/dist/components/empty-state/empty-state.recipe.mjs +134 -0
- package/dist/components/empty-state/empty-state.recipe.mjs.map +1 -0
- package/dist/components/empty-state/index.d.mts +2 -0
- package/dist/components/empty-state/index.mjs +2 -0
- package/dist/components/field/field.anatomy.mjs +8 -0
- package/dist/components/field/field.anatomy.mjs.map +1 -0
- package/dist/components/field/field.connect.mjs +117 -0
- package/dist/components/field/field.connect.mjs.map +1 -0
- package/dist/components/field/field.d.mts +19 -0
- package/dist/components/field/field.d.mts.map +1 -0
- package/dist/components/field/field.mjs +77 -0
- package/dist/components/field/field.mjs.map +1 -0
- package/dist/components/field/field.recipe.mjs +60 -0
- package/dist/components/field/field.recipe.mjs.map +1 -0
- package/dist/components/field/index.d.mts +2 -0
- package/dist/components/field/index.mjs +2 -0
- package/dist/components/fieldset/fieldset.anatomy.mjs +8 -0
- package/dist/components/fieldset/fieldset.anatomy.mjs.map +1 -0
- package/dist/components/fieldset/fieldset.connect.mjs +60 -0
- package/dist/components/fieldset/fieldset.connect.mjs.map +1 -0
- package/dist/components/fieldset/fieldset.d.mts +13 -0
- package/dist/components/fieldset/fieldset.d.mts.map +1 -0
- package/dist/components/fieldset/fieldset.mjs +26 -0
- package/dist/components/fieldset/fieldset.mjs.map +1 -0
- package/dist/components/fieldset/fieldset.recipe.mjs +42 -0
- package/dist/components/fieldset/fieldset.recipe.mjs.map +1 -0
- package/dist/components/fieldset/index.d.mts +2 -0
- package/dist/components/fieldset/index.mjs +2 -0
- package/dist/components/file-upload/file-upload.d.mts +105 -0
- package/dist/components/file-upload/file-upload.d.mts.map +1 -0
- package/dist/components/file-upload/file-upload.mjs +127 -0
- package/dist/components/file-upload/file-upload.mjs.map +1 -0
- package/dist/components/file-upload/file-upload.recipe.mjs +236 -0
- package/dist/components/file-upload/file-upload.recipe.mjs.map +1 -0
- package/dist/components/file-upload/index.d.mts +2 -0
- package/dist/components/file-upload/index.mjs +2 -0
- package/dist/components/floating-panel/floating-panel.d.mts +87 -0
- package/dist/components/floating-panel/floating-panel.d.mts.map +1 -0
- package/dist/components/floating-panel/floating-panel.mjs +89 -0
- package/dist/components/floating-panel/floating-panel.mjs.map +1 -0
- package/dist/components/floating-panel/floating-panel.recipe.mjs +156 -0
- package/dist/components/floating-panel/floating-panel.recipe.mjs.map +1 -0
- package/dist/components/floating-panel/index.d.mts +2 -0
- package/dist/components/floating-panel/index.mjs +2 -0
- package/dist/components/hover-card/hover-card.d.mts +48 -0
- package/dist/components/hover-card/hover-card.d.mts.map +1 -0
- package/dist/components/hover-card/hover-card.mjs +31 -0
- package/dist/components/hover-card/hover-card.mjs.map +1 -0
- package/dist/components/hover-card/hover-card.recipe.mjs +133 -0
- package/dist/components/hover-card/hover-card.recipe.mjs.map +1 -0
- package/dist/components/hover-card/index.d.mts +2 -0
- package/dist/components/hover-card/index.mjs +2 -0
- package/dist/components/image-cropper/image-cropper.d.mts +111 -0
- package/dist/components/image-cropper/image-cropper.d.mts.map +1 -0
- package/dist/components/image-cropper/image-cropper.mjs +71 -0
- package/dist/components/image-cropper/image-cropper.mjs.map +1 -0
- package/dist/components/image-cropper/image-cropper.recipe.mjs +126 -0
- package/dist/components/image-cropper/image-cropper.recipe.mjs.map +1 -0
- package/dist/components/image-cropper/index.d.mts +2 -0
- package/dist/components/image-cropper/index.mjs +2 -0
- package/dist/components/input/index.d.mts +2 -0
- package/dist/components/input/index.mjs +2 -0
- package/dist/components/input/input.anatomy.mjs +8 -0
- package/dist/components/input/input.anatomy.mjs.map +1 -0
- package/dist/components/input/input.connect.mjs +82 -0
- package/dist/components/input/input.connect.mjs.map +1 -0
- package/dist/components/input/input.d.mts +31 -0
- package/dist/components/input/input.d.mts.map +1 -0
- package/dist/components/input/input.mjs +37 -0
- package/dist/components/input/input.mjs.map +1 -0
- package/dist/components/input/input.recipe.mjs +111 -0
- package/dist/components/input/input.recipe.mjs.map +1 -0
- package/dist/components/kbd/index.d.mts +2 -0
- package/dist/components/kbd/index.mjs +2 -0
- package/dist/components/kbd/kbd.anatomy.mjs +8 -0
- package/dist/components/kbd/kbd.anatomy.mjs.map +1 -0
- package/dist/components/kbd/kbd.connect.mjs +17 -0
- package/dist/components/kbd/kbd.connect.mjs.map +1 -0
- package/dist/components/kbd/kbd.d.mts +10 -0
- package/dist/components/kbd/kbd.d.mts.map +1 -0
- package/dist/components/kbd/kbd.mjs +18 -0
- package/dist/components/kbd/kbd.mjs.map +1 -0
- package/dist/components/kbd/kbd.recipe.mjs +55 -0
- package/dist/components/kbd/kbd.recipe.mjs.map +1 -0
- package/dist/components/listbox/index.d.mts +2 -0
- package/dist/components/listbox/index.mjs +2 -0
- package/dist/components/listbox/listbox.d.mts +70 -0
- package/dist/components/listbox/listbox.d.mts.map +1 -0
- package/dist/components/listbox/listbox.mjs +79 -0
- package/dist/components/listbox/listbox.mjs.map +1 -0
- package/dist/components/listbox/listbox.recipe.mjs +169 -0
- package/dist/components/listbox/listbox.recipe.mjs.map +1 -0
- package/dist/components/machine-translations.mjs +8 -0
- package/dist/components/machine-translations.mjs.map +1 -0
- package/dist/components/marquee/index.d.mts +2 -0
- package/dist/components/marquee/index.mjs +2 -0
- package/dist/components/marquee/marquee.d.mts +53 -0
- package/dist/components/marquee/marquee.d.mts.map +1 -0
- package/dist/components/marquee/marquee.mjs +30 -0
- package/dist/components/marquee/marquee.mjs.map +1 -0
- package/dist/components/marquee/marquee.recipe.mjs +123 -0
- package/dist/components/marquee/marquee.recipe.mjs.map +1 -0
- package/dist/components/menu/index.d.mts +2 -0
- package/dist/components/menu/index.mjs +2 -0
- package/dist/components/menu/menu.d.mts +66 -0
- package/dist/components/menu/menu.d.mts.map +1 -0
- package/dist/components/menu/menu.mjs +68 -0
- package/dist/components/menu/menu.mjs.map +1 -0
- package/dist/components/menu/menu.recipe.mjs +285 -0
- package/dist/components/menu/menu.recipe.mjs.map +1 -0
- package/dist/components/navigation-menu/index.d.mts +2 -0
- package/dist/components/navigation-menu/index.mjs +2 -0
- package/dist/components/navigation-menu/navigation-menu.d.mts +42 -0
- package/dist/components/navigation-menu/navigation-menu.d.mts.map +1 -0
- package/dist/components/navigation-menu/navigation-menu.mjs +47 -0
- package/dist/components/navigation-menu/navigation-menu.mjs.map +1 -0
- package/dist/components/navigation-menu/navigation-menu.recipe.mjs +271 -0
- package/dist/components/navigation-menu/navigation-menu.recipe.mjs.map +1 -0
- package/dist/components/number-input/index.d.mts +2 -0
- package/dist/components/number-input/index.mjs +2 -0
- package/dist/components/number-input/number-input.d.mts +88 -0
- package/dist/components/number-input/number-input.d.mts.map +1 -0
- package/dist/components/number-input/number-input.mjs +70 -0
- package/dist/components/number-input/number-input.mjs.map +1 -0
- package/dist/components/number-input/number-input.recipe.mjs +231 -0
- package/dist/components/number-input/number-input.recipe.mjs.map +1 -0
- package/dist/components/pagination/index.d.mts +2 -0
- package/dist/components/pagination/index.mjs +2 -0
- package/dist/components/pagination/pagination.d.mts +51 -0
- package/dist/components/pagination/pagination.d.mts.map +1 -0
- package/dist/components/pagination/pagination.mjs +74 -0
- package/dist/components/pagination/pagination.mjs.map +1 -0
- package/dist/components/pagination/pagination.recipe.mjs +144 -0
- package/dist/components/pagination/pagination.recipe.mjs.map +1 -0
- package/dist/components/password-input/index.d.mts +2 -0
- package/dist/components/password-input/index.mjs +2 -0
- package/dist/components/password-input/password-input.d.mts +37 -0
- package/dist/components/password-input/password-input.d.mts.map +1 -0
- package/dist/components/password-input/password-input.mjs +58 -0
- package/dist/components/password-input/password-input.mjs.map +1 -0
- package/dist/components/password-input/password-input.recipe.mjs +180 -0
- package/dist/components/password-input/password-input.recipe.mjs.map +1 -0
- package/dist/components/pin-input/index.d.mts +2 -0
- package/dist/components/pin-input/index.mjs +2 -0
- package/dist/components/pin-input/pin-input.d.mts +68 -0
- package/dist/components/pin-input/pin-input.d.mts.map +1 -0
- package/dist/components/pin-input/pin-input.mjs +51 -0
- package/dist/components/pin-input/pin-input.mjs.map +1 -0
- package/dist/components/pin-input/pin-input.recipe.mjs +81 -0
- package/dist/components/pin-input/pin-input.recipe.mjs.map +1 -0
- package/dist/components/popover/index.d.mts +2 -0
- package/dist/components/popover/index.mjs +2 -0
- package/dist/components/popover/popover.d.mts +42 -0
- package/dist/components/popover/popover.d.mts.map +1 -0
- package/dist/components/popover/popover.mjs +50 -0
- package/dist/components/popover/popover.mjs.map +1 -0
- package/dist/components/popover/popover.recipe.mjs +162 -0
- package/dist/components/popover/popover.recipe.mjs.map +1 -0
- package/dist/components/progress/index.d.mts +2 -0
- package/dist/components/progress/index.mjs +2 -0
- package/dist/components/progress/progress.d.mts +31 -0
- package/dist/components/progress/progress.d.mts.map +1 -0
- package/dist/components/progress/progress.mjs +42 -0
- package/dist/components/progress/progress.mjs.map +1 -0
- package/dist/components/progress/progress.recipe.mjs +189 -0
- package/dist/components/progress/progress.recipe.mjs.map +1 -0
- package/dist/components/qr-code/index.d.mts +2 -0
- package/dist/components/qr-code/index.mjs +2 -0
- package/dist/components/qr-code/qr-code.d.mts +36 -0
- package/dist/components/qr-code/qr-code.d.mts.map +1 -0
- package/dist/components/qr-code/qr-code.mjs +41 -0
- package/dist/components/qr-code/qr-code.mjs.map +1 -0
- package/dist/components/qr-code/qr-code.recipe.mjs +70 -0
- package/dist/components/qr-code/qr-code.recipe.mjs.map +1 -0
- package/dist/components/radio-group/index.d.mts +2 -0
- package/dist/components/radio-group/index.mjs +2 -0
- package/dist/components/radio-group/radio-group.d.mts +33 -0
- package/dist/components/radio-group/radio-group.d.mts.map +1 -0
- package/dist/components/radio-group/radio-group.mjs +47 -0
- package/dist/components/radio-group/radio-group.mjs.map +1 -0
- package/dist/components/radio-group/radio-group.recipe.mjs +189 -0
- package/dist/components/radio-group/radio-group.recipe.mjs.map +1 -0
- package/dist/components/rating-group/index.d.mts +2 -0
- package/dist/components/rating-group/index.mjs +2 -0
- package/dist/components/rating-group/rating-group.d.mts +43 -0
- package/dist/components/rating-group/rating-group.d.mts.map +1 -0
- package/dist/components/rating-group/rating-group.mjs +39 -0
- package/dist/components/rating-group/rating-group.mjs.map +1 -0
- package/dist/components/rating-group/rating-group.recipe.mjs +133 -0
- package/dist/components/rating-group/rating-group.recipe.mjs.map +1 -0
- package/dist/components/scroll-area/index.d.mts +2 -0
- package/dist/components/scroll-area/index.mjs +2 -0
- package/dist/components/scroll-area/scroll-area.d.mts +12 -0
- package/dist/components/scroll-area/scroll-area.d.mts.map +1 -0
- package/dist/components/scroll-area/scroll-area.mjs +31 -0
- package/dist/components/scroll-area/scroll-area.mjs.map +1 -0
- package/dist/components/scroll-area/scroll-area.recipe.mjs +76 -0
- package/dist/components/scroll-area/scroll-area.recipe.mjs.map +1 -0
- package/dist/components/select/index.d.mts +2 -0
- package/dist/components/select/index.mjs +2 -0
- package/dist/components/select/select.d.mts +90 -0
- package/dist/components/select/select.d.mts.map +1 -0
- package/dist/components/select/select.mjs +83 -0
- package/dist/components/select/select.mjs.map +1 -0
- package/dist/components/select/select.recipe.mjs +298 -0
- package/dist/components/select/select.recipe.mjs.map +1 -0
- package/dist/components/separator/index.d.mts +2 -0
- package/dist/components/separator/index.mjs +2 -0
- package/dist/components/separator/separator.anatomy.mjs +8 -0
- package/dist/components/separator/separator.anatomy.mjs.map +1 -0
- package/dist/components/separator/separator.connect.mjs +28 -0
- package/dist/components/separator/separator.connect.mjs.map +1 -0
- package/dist/components/separator/separator.d.mts +11 -0
- package/dist/components/separator/separator.d.mts.map +1 -0
- package/dist/components/separator/separator.mjs +15 -0
- package/dist/components/separator/separator.mjs.map +1 -0
- package/dist/components/separator/separator.recipe.mjs +22 -0
- package/dist/components/separator/separator.recipe.mjs.map +1 -0
- package/dist/components/signature-pad/index.d.mts +2 -0
- package/dist/components/signature-pad/index.mjs +2 -0
- package/dist/components/signature-pad/signature-pad.d.mts +44 -0
- package/dist/components/signature-pad/signature-pad.d.mts.map +1 -0
- package/dist/components/signature-pad/signature-pad.mjs +90 -0
- package/dist/components/signature-pad/signature-pad.mjs.map +1 -0
- package/dist/components/signature-pad/signature-pad.recipe.mjs +111 -0
- package/dist/components/signature-pad/signature-pad.recipe.mjs.map +1 -0
- package/dist/components/skeleton/index.d.mts +2 -0
- package/dist/components/skeleton/index.mjs +2 -0
- package/dist/components/skeleton/skeleton.anatomy.mjs +8 -0
- package/dist/components/skeleton/skeleton.anatomy.mjs.map +1 -0
- package/dist/components/skeleton/skeleton.connect.mjs +26 -0
- package/dist/components/skeleton/skeleton.connect.mjs.map +1 -0
- package/dist/components/skeleton/skeleton.d.mts +9 -0
- package/dist/components/skeleton/skeleton.d.mts.map +1 -0
- package/dist/components/skeleton/skeleton.mjs +16 -0
- package/dist/components/skeleton/skeleton.mjs.map +1 -0
- package/dist/components/skeleton/skeleton.recipe.mjs +46 -0
- package/dist/components/skeleton/skeleton.recipe.mjs.map +1 -0
- package/dist/components/slider/index.d.mts +2 -0
- package/dist/components/slider/index.mjs +2 -0
- package/dist/components/slider/slider.d.mts +72 -0
- package/dist/components/slider/slider.d.mts.map +1 -0
- package/dist/components/slider/slider.mjs +34 -0
- package/dist/components/slider/slider.mjs.map +1 -0
- package/dist/components/slider/slider.recipe.mjs +219 -0
- package/dist/components/slider/slider.recipe.mjs.map +1 -0
- package/dist/components/snackbar/index.d.mts +2 -0
- package/dist/components/snackbar/index.mjs +2 -0
- package/dist/components/snackbar/snackbar.d.mts +57 -0
- package/dist/components/snackbar/snackbar.d.mts.map +1 -0
- package/dist/components/snackbar/snackbar.mjs +226 -0
- package/dist/components/snackbar/snackbar.mjs.map +1 -0
- package/dist/components/snackbar/snackbar.recipe.mjs +217 -0
- package/dist/components/snackbar/snackbar.recipe.mjs.map +1 -0
- package/dist/components/spinner/index.d.mts +2 -0
- package/dist/components/spinner/index.mjs +2 -0
- package/dist/components/spinner/spinner.anatomy.mjs +8 -0
- package/dist/components/spinner/spinner.anatomy.mjs.map +1 -0
- package/dist/components/spinner/spinner.connect.mjs +27 -0
- package/dist/components/spinner/spinner.connect.mjs.map +1 -0
- package/dist/components/spinner/spinner.d.mts +10 -0
- package/dist/components/spinner/spinner.d.mts.map +1 -0
- package/dist/components/spinner/spinner.mjs +25 -0
- package/dist/components/spinner/spinner.mjs.map +1 -0
- package/dist/components/spinner/spinner.recipe.mjs +70 -0
- package/dist/components/spinner/spinner.recipe.mjs.map +1 -0
- package/dist/components/splitter/index.d.mts +2 -0
- package/dist/components/splitter/index.mjs +2 -0
- package/dist/components/splitter/splitter.d.mts +57 -0
- package/dist/components/splitter/splitter.d.mts.map +1 -0
- package/dist/components/splitter/splitter.mjs +40 -0
- package/dist/components/splitter/splitter.mjs.map +1 -0
- package/dist/components/splitter/splitter.recipe.mjs +129 -0
- package/dist/components/splitter/splitter.recipe.mjs.map +1 -0
- package/dist/components/steps/index.d.mts +2 -0
- package/dist/components/steps/index.mjs +2 -0
- package/dist/components/steps/steps.d.mts +42 -0
- package/dist/components/steps/steps.d.mts.map +1 -0
- package/dist/components/steps/steps.mjs +72 -0
- package/dist/components/steps/steps.mjs.map +1 -0
- package/dist/components/steps/steps.recipe.mjs +291 -0
- package/dist/components/steps/steps.recipe.mjs.map +1 -0
- package/dist/components/switch/index.d.mts +2 -0
- package/dist/components/switch/index.mjs +2 -0
- package/dist/components/switch/switch.d.mts +36 -0
- package/dist/components/switch/switch.d.mts.map +1 -0
- package/dist/components/switch/switch.mjs +50 -0
- package/dist/components/switch/switch.mjs.map +1 -0
- package/dist/components/switch/switch.recipe.mjs +171 -0
- package/dist/components/switch/switch.recipe.mjs.map +1 -0
- package/dist/components/table/index.d.mts +2 -0
- package/dist/components/table/index.mjs +2 -0
- package/dist/components/table/table.anatomy.mjs +8 -0
- package/dist/components/table/table.anatomy.mjs.map +1 -0
- package/dist/components/table/table.connect.mjs +50 -0
- package/dist/components/table/table.connect.mjs.map +1 -0
- package/dist/components/table/table.d.mts +10 -0
- package/dist/components/table/table.d.mts.map +1 -0
- package/dist/components/table/table.mjs +90 -0
- package/dist/components/table/table.mjs.map +1 -0
- package/dist/components/table/table.recipe.mjs +186 -0
- package/dist/components/table/table.recipe.mjs.map +1 -0
- package/dist/components/tabs/index.d.mts +2 -0
- package/dist/components/tabs/index.mjs +2 -0
- package/dist/components/tabs/tabs.d.mts +40 -0
- package/dist/components/tabs/tabs.d.mts.map +1 -0
- package/dist/components/tabs/tabs.mjs +23 -0
- package/dist/components/tabs/tabs.mjs.map +1 -0
- package/dist/components/tabs/tabs.recipe.mjs +182 -0
- package/dist/components/tabs/tabs.recipe.mjs.map +1 -0
- package/dist/components/tags-input/index.d.mts +2 -0
- package/dist/components/tags-input/index.mjs +2 -0
- package/dist/components/tags-input/tags-input.d.mts +77 -0
- package/dist/components/tags-input/tags-input.d.mts.map +1 -0
- package/dist/components/tags-input/tags-input.mjs +103 -0
- package/dist/components/tags-input/tags-input.mjs.map +1 -0
- package/dist/components/tags-input/tags-input.recipe.mjs +320 -0
- package/dist/components/tags-input/tags-input.recipe.mjs.map +1 -0
- package/dist/components/textarea/index.d.mts +2 -0
- package/dist/components/textarea/index.mjs +2 -0
- package/dist/components/textarea/textarea.anatomy.mjs +8 -0
- package/dist/components/textarea/textarea.anatomy.mjs.map +1 -0
- package/dist/components/textarea/textarea.connect.mjs +82 -0
- package/dist/components/textarea/textarea.connect.mjs.map +1 -0
- package/dist/components/textarea/textarea.d.mts +32 -0
- package/dist/components/textarea/textarea.d.mts.map +1 -0
- package/dist/components/textarea/textarea.mjs +41 -0
- package/dist/components/textarea/textarea.mjs.map +1 -0
- package/dist/components/textarea/textarea.recipe.mjs +58 -0
- package/dist/components/textarea/textarea.recipe.mjs.map +1 -0
- package/dist/components/timer/index.d.mts +2 -0
- package/dist/components/timer/index.mjs +2 -0
- package/dist/components/timer/timer.d.mts +31 -0
- package/dist/components/timer/timer.d.mts.map +1 -0
- package/dist/components/timer/timer.mjs +98 -0
- package/dist/components/timer/timer.mjs.map +1 -0
- package/dist/components/timer/timer.recipe.mjs +99 -0
- package/dist/components/timer/timer.recipe.mjs.map +1 -0
- package/dist/components/toast/index.d.mts +2 -0
- package/dist/components/toast/index.mjs +2 -0
- package/dist/components/toast/toast.d.mts +55 -0
- package/dist/components/toast/toast.d.mts.map +1 -0
- package/dist/components/toast/toast.mjs +194 -0
- package/dist/components/toast/toast.mjs.map +1 -0
- package/dist/components/toast/toast.recipe.mjs +172 -0
- package/dist/components/toast/toast.recipe.mjs.map +1 -0
- package/dist/components/toc/index.d.mts +2 -0
- package/dist/components/toc/index.mjs +2 -0
- package/dist/components/toc/toc.d.mts +47 -0
- package/dist/components/toc/toc.d.mts.map +1 -0
- package/dist/components/toc/toc.mjs +239 -0
- package/dist/components/toc/toc.mjs.map +1 -0
- package/dist/components/toc/toc.recipe.mjs +147 -0
- package/dist/components/toc/toc.recipe.mjs.map +1 -0
- package/dist/components/toggle/index.d.mts +2 -0
- package/dist/components/toggle/index.mjs +2 -0
- package/dist/components/toggle/toggle.d.mts +21 -0
- package/dist/components/toggle/toggle.d.mts.map +1 -0
- package/dist/components/toggle/toggle.mjs +34 -0
- package/dist/components/toggle/toggle.mjs.map +1 -0
- package/dist/components/toggle/toggle.recipe.mjs +175 -0
- package/dist/components/toggle/toggle.recipe.mjs.map +1 -0
- package/dist/components/toggle-group/index.d.mts +2 -0
- package/dist/components/toggle-group/index.mjs +2 -0
- package/dist/components/toggle-group/toggle-group.d.mts +29 -0
- package/dist/components/toggle-group/toggle-group.d.mts.map +1 -0
- package/dist/components/toggle-group/toggle-group.mjs +18 -0
- package/dist/components/toggle-group/toggle-group.mjs.map +1 -0
- package/dist/components/toggle-group/toggle-group.recipe.mjs +190 -0
- package/dist/components/toggle-group/toggle-group.recipe.mjs.map +1 -0
- package/dist/components/tooltip/index.d.mts +2 -0
- package/dist/components/tooltip/index.mjs +2 -0
- package/dist/components/tooltip/tooltip.d.mts +66 -0
- package/dist/components/tooltip/tooltip.d.mts.map +1 -0
- package/dist/components/tooltip/tooltip.mjs +64 -0
- package/dist/components/tooltip/tooltip.mjs.map +1 -0
- package/dist/components/tooltip/tooltip.recipe.mjs +149 -0
- package/dist/components/tooltip/tooltip.recipe.mjs.map +1 -0
- package/dist/components/tour/index.d.mts +2 -0
- package/dist/components/tour/index.mjs +2 -0
- package/dist/components/tour/tour.d.mts +92 -0
- package/dist/components/tour/tour.d.mts.map +1 -0
- package/dist/components/tour/tour.mjs +89 -0
- package/dist/components/tour/tour.mjs.map +1 -0
- package/dist/components/tour/tour.recipe.mjs +164 -0
- package/dist/components/tour/tour.recipe.mjs.map +1 -0
- package/dist/components/tree-view/index.d.mts +2 -0
- package/dist/components/tree-view/index.mjs +2 -0
- package/dist/components/tree-view/tree-view.d.mts +108 -0
- package/dist/components/tree-view/tree-view.d.mts.map +1 -0
- package/dist/components/tree-view/tree-view.mjs +145 -0
- package/dist/components/tree-view/tree-view.mjs.map +1 -0
- package/dist/components/tree-view/tree-view.recipe.mjs +458 -0
- package/dist/components/tree-view/tree-view.recipe.mjs.map +1 -0
- package/dist/icons/src/calendar.mjs +13 -0
- package/dist/icons/src/calendar.mjs.map +1 -0
- package/dist/icons/src/checkmark.mjs +13 -0
- package/dist/icons/src/checkmark.mjs.map +1 -0
- package/dist/icons/src/chevron-down.mjs +13 -0
- package/dist/icons/src/chevron-down.mjs.map +1 -0
- package/dist/icons/src/chevron-left.mjs +13 -0
- package/dist/icons/src/chevron-left.mjs.map +1 -0
- package/dist/icons/src/chevron-right.mjs +13 -0
- package/dist/icons/src/chevron-right.mjs.map +1 -0
- package/dist/icons/src/chevron-up.mjs +13 -0
- package/dist/icons/src/chevron-up.mjs.map +1 -0
- package/dist/icons/src/chevrons-left.mjs +13 -0
- package/dist/icons/src/chevrons-left.mjs.map +1 -0
- package/dist/icons/src/chevrons-right.mjs +13 -0
- package/dist/icons/src/chevrons-right.mjs.map +1 -0
- package/dist/icons/src/chevrons-up-down.mjs +13 -0
- package/dist/icons/src/chevrons-up-down.mjs.map +1 -0
- package/dist/icons/src/close.mjs +13 -0
- package/dist/icons/src/close.mjs.map +1 -0
- package/dist/icons/src/copy.mjs +13 -0
- package/dist/icons/src/copy.mjs.map +1 -0
- package/dist/icons/src/edit.mjs +13 -0
- package/dist/icons/src/edit.mjs.map +1 -0
- package/dist/icons/src/error.mjs +13 -0
- package/dist/icons/src/error.mjs.map +1 -0
- package/dist/icons/src/eyedropper.mjs +13 -0
- package/dist/icons/src/eyedropper.mjs.map +1 -0
- package/dist/icons/src/file.mjs +13 -0
- package/dist/icons/src/file.mjs.map +1 -0
- package/dist/icons/src/hide.mjs +13 -0
- package/dist/icons/src/hide.mjs.map +1 -0
- package/dist/icons/src/index.mjs +58 -0
- package/dist/icons/src/index.mjs.map +1 -0
- package/dist/icons/src/info.mjs +13 -0
- package/dist/icons/src/info.mjs.map +1 -0
- package/dist/icons/src/maximize.mjs +13 -0
- package/dist/icons/src/maximize.mjs.map +1 -0
- package/dist/icons/src/minus.mjs +13 -0
- package/dist/icons/src/minus.mjs.map +1 -0
- package/dist/icons/src/pause.mjs +13 -0
- package/dist/icons/src/pause.mjs.map +1 -0
- package/dist/icons/src/play.mjs +13 -0
- package/dist/icons/src/play.mjs.map +1 -0
- package/dist/icons/src/reset.mjs +13 -0
- package/dist/icons/src/reset.mjs.map +1 -0
- package/dist/icons/src/restore.mjs +13 -0
- package/dist/icons/src/restore.mjs.map +1 -0
- package/dist/icons/src/show.mjs +13 -0
- package/dist/icons/src/show.mjs.map +1 -0
- package/dist/icons/src/star.mjs +13 -0
- package/dist/icons/src/star.mjs.map +1 -0
- package/dist/icons/src/success.mjs +2 -0
- package/dist/icons/src/trash.mjs +13 -0
- package/dist/icons/src/trash.mjs.map +1 -0
- package/dist/icons/src/user.mjs +13 -0
- package/dist/icons/src/user.mjs.map +1 -0
- package/dist/icons/src/warning.mjs +13 -0
- package/dist/icons/src/warning.mjs.map +1 -0
- package/dist/index.d.mts +139 -0
- package/dist/index.mjs +71 -0
- package/dist/preset.d.mts +2 -0
- package/dist/preset.mjs +2 -0
- package/dist/provider/locale-context.mjs +36 -0
- package/dist/provider/locale-context.mjs.map +1 -0
- package/dist/provider/synapse-provider.d.mts +17 -0
- package/dist/provider/synapse-provider.d.mts.map +1 -0
- package/dist/provider/synapse-provider.mjs +59 -0
- package/dist/provider/synapse-provider.mjs.map +1 -0
- package/dist/provider/translations.d.mts +179 -0
- package/dist/provider/translations.d.mts.map +1 -0
- package/dist/provider/translations.mjs +201 -0
- package/dist/provider/translations.mjs.map +1 -0
- package/dist/provider/use-theme.d.mts +7 -0
- package/dist/provider/use-theme.d.mts.map +1 -0
- package/dist/provider/use-theme.mjs +37 -0
- package/dist/provider/use-theme.mjs.map +1 -0
- package/dist/react/styled-system/css/conditions.mjs +29 -0
- package/dist/react/styled-system/css/conditions.mjs.map +1 -0
- package/dist/react/styled-system/css/css.mjs +39 -0
- package/dist/react/styled-system/css/css.mjs.map +1 -0
- package/dist/react/styled-system/css/cva.mjs +66 -0
- package/dist/react/styled-system/css/cva.mjs.map +1 -0
- package/dist/react/styled-system/css/cx.mjs +13 -0
- package/dist/react/styled-system/css/cx.mjs.map +1 -0
- package/dist/react/styled-system/css/sva.mjs +44 -0
- package/dist/react/styled-system/css/sva.mjs.map +1 -0
- package/dist/react/styled-system/helpers.mjs +231 -0
- package/dist/react/styled-system/helpers.mjs.map +1 -0
- package/dist/shared/button-style.mjs +10 -0
- package/dist/shared/button-style.mjs.map +1 -0
- package/dist/shared/character-count.mjs +29 -0
- package/dist/shared/character-count.mjs.map +1 -0
- package/dist/shared/collection-internal.mjs +24 -0
- package/dist/shared/collection-internal.mjs.map +1 -0
- package/dist/shared/collection.d.mts +120 -0
- package/dist/shared/collection.d.mts.map +1 -0
- package/dist/shared/collection.mjs +395 -0
- package/dist/shared/collection.mjs.map +1 -0
- package/dist/shared/controller.d.mts +4 -0
- package/dist/shared/controller.d.mts.map +1 -0
- package/dist/shared/controller.mjs +53 -0
- package/dist/shared/controller.mjs.map +1 -0
- package/dist/shared/field-context.mjs +47 -0
- package/dist/shared/field-context.mjs.map +1 -0
- package/dist/shared/field-description.mjs +13 -0
- package/dist/shared/field-description.mjs.map +1 -0
- package/dist/shared/icon.mjs +23 -0
- package/dist/shared/icon.mjs.map +1 -0
- package/dist/shared/input-modality.mjs +47 -0
- package/dist/shared/input-modality.mjs.map +1 -0
- package/dist/shared/input-style.mjs +10 -0
- package/dist/shared/input-style.mjs.map +1 -0
- package/dist/shared/layering.d.mts +17 -0
- package/dist/shared/layering.d.mts.map +1 -0
- package/dist/shared/layering.mjs +37 -0
- package/dist/shared/layering.mjs.map +1 -0
- package/dist/shared/notification.d.mts +10 -0
- package/dist/shared/notification.d.mts.map +1 -0
- package/dist/shared/notification.mjs +105 -0
- package/dist/shared/notification.mjs.map +1 -0
- package/dist/shared/reduced-motion.mjs +19 -0
- package/dist/shared/reduced-motion.mjs.map +1 -0
- package/dist/shared/select-indicator.mjs +40 -0
- package/dist/shared/select-indicator.mjs.map +1 -0
- package/dist/shared/size-scale.d.mts +6 -0
- package/dist/shared/size-scale.d.mts.map +1 -0
- package/dist/shared/size-scale.mjs +28 -0
- package/dist/shared/size-scale.mjs.map +1 -0
- package/dist/shared/state-parts.mjs +123 -0
- package/dist/shared/state-parts.mjs.map +1 -0
- package/dist/shared/text-entry.mjs +54 -0
- package/dist/shared/text-entry.mjs.map +1 -0
- package/dist/styles.css +6238 -0
- package/dist/system/as-child.mjs +42 -0
- package/dist/system/as-child.mjs.map +1 -0
- package/dist/system/context.mjs +54 -0
- package/dist/system/context.mjs.map +1 -0
- package/dist/system/controlled.mjs +45 -0
- package/dist/system/controlled.mjs.map +1 -0
- package/dist/system/create-component.mjs +285 -0
- package/dist/system/create-component.mjs.map +1 -0
- package/dist/system/create-part.mjs +123 -0
- package/dist/system/create-part.mjs.map +1 -0
- package/dist/system/dev-warn.mjs +13 -0
- package/dist/system/dev-warn.mjs.map +1 -0
- package/dist/system/getters.mjs +24 -0
- package/dist/system/getters.mjs.map +1 -0
- package/dist/system/merge-props.d.mts +5 -0
- package/dist/system/merge-props.d.mts.map +1 -0
- package/dist/system/merge-props.mjs +95 -0
- package/dist/system/merge-props.mjs.map +1 -0
- package/dist/system/react-node.mjs +17 -0
- package/dist/system/react-node.mjs.map +1 -0
- package/dist/system/refs.mjs +21 -0
- package/dist/system/refs.mjs.map +1 -0
- package/dist/system/styled-component.mjs +15 -0
- package/dist/system/styled-component.mjs.map +1 -0
- package/dist/system/types.d.mts +47 -0
- package/dist/system/types.d.mts.map +1 -0
- package/dist/tokens/dist/preset.d.mts +6 -0
- package/dist/tokens/dist/preset.d.mts.map +1 -0
- package/dist/tokens/dist/preset.mjs +997 -0
- package/dist/tokens/dist/preset.mjs.map +1 -0
- package/package.json +411 -0
- package/skills/components/accordion/SKILL.md +138 -0
- package/skills/components/alert/SKILL.md +126 -0
- package/skills/components/angle-slider/SKILL.md +155 -0
- package/skills/components/avatar/SKILL.md +123 -0
- package/skills/components/badge/SKILL.md +117 -0
- package/skills/components/breadcrumb/SKILL.md +128 -0
- package/skills/components/button/SKILL.md +122 -0
- package/skills/components/card/SKILL.md +126 -0
- package/skills/components/carousel/SKILL.md +176 -0
- package/skills/components/cascade-select/SKILL.md +206 -0
- package/skills/components/checkbox/SKILL.md +149 -0
- package/skills/components/clipboard/SKILL.md +139 -0
- package/skills/components/collapsible/SKILL.md +130 -0
- package/skills/components/color-picker/SKILL.md +216 -0
- package/skills/components/combobox/SKILL.md +218 -0
- package/skills/components/date-input/SKILL.md +157 -0
- package/skills/components/date-picker/SKILL.md +235 -0
- package/skills/components/dialog/SKILL.md +159 -0
- package/skills/components/drawer/SKILL.md +192 -0
- package/skills/components/editable/SKILL.md +162 -0
- package/skills/components/empty-state/SKILL.md +125 -0
- package/skills/components/field/SKILL.md +133 -0
- package/skills/components/fieldset/SKILL.md +123 -0
- package/skills/components/file-upload/SKILL.md +184 -0
- package/skills/components/floating-panel/SKILL.md +206 -0
- package/skills/components/hover-card/SKILL.md +173 -0
- package/skills/components/image-cropper/SKILL.md +158 -0
- package/skills/components/input/SKILL.md +131 -0
- package/skills/components/kbd/SKILL.md +116 -0
- package/skills/components/listbox/SKILL.md +172 -0
- package/skills/components/marquee/SKILL.md +151 -0
- package/skills/components/menu/SKILL.md +202 -0
- package/skills/components/navigation-menu/SKILL.md +172 -0
- package/skills/components/number-input/SKILL.md +177 -0
- package/skills/components/pagination/SKILL.md +159 -0
- package/skills/components/password-input/SKILL.md +156 -0
- package/skills/components/pin-input/SKILL.md +157 -0
- package/skills/components/popover/SKILL.md +166 -0
- package/skills/components/progress/SKILL.md +144 -0
- package/skills/components/qr-code/SKILL.md +132 -0
- package/skills/components/radio-group/SKILL.md +153 -0
- package/skills/components/rating-group/SKILL.md +151 -0
- package/skills/components/scroll-area/SKILL.md +149 -0
- package/skills/components/select/SKILL.md +202 -0
- package/skills/components/separator/SKILL.md +114 -0
- package/skills/components/signature-pad/SKILL.md +161 -0
- package/skills/components/skeleton/SKILL.md +114 -0
- package/skills/components/slider/SKILL.md +178 -0
- package/skills/components/snackbar/SKILL.md +154 -0
- package/skills/components/spinner/SKILL.md +122 -0
- package/skills/components/splitter/SKILL.md +136 -0
- package/skills/components/steps/SKILL.md +150 -0
- package/skills/components/switch/SKILL.md +144 -0
- package/skills/components/table/SKILL.md +144 -0
- package/skills/components/tabs/SKILL.md +138 -0
- package/skills/components/tags-input/SKILL.md +194 -0
- package/skills/components/textarea/SKILL.md +131 -0
- package/skills/components/timer/SKILL.md +142 -0
- package/skills/components/toast/SKILL.md +129 -0
- package/skills/components/toc/SKILL.md +141 -0
- package/skills/components/toggle/SKILL.md +125 -0
- package/skills/components/toggle-group/SKILL.md +129 -0
- package/skills/components/tooltip/SKILL.md +188 -0
- package/skills/components/tour/SKILL.md +158 -0
- package/skills/components/tree-view/SKILL.md +180 -0
- package/skills/synapse/SKILL.md +301 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'menu'
|
|
3
|
+
description: 'Menu — trigger나 오른쪽 클릭으로 여는 명령 목록으로, 하나를 고르면 그 명령이 실행되고 목록이 닫힙니다. 하나의 machine이 두 제스처를 모두 뒷받침하며, 드롭다운과 컨텍스트 메뉴는 제품이 어떤 part를 렌더링하는지만 다릅니다. machine이 제공하는 세 번째 패턴인 중첩 하위 메뉴는 현재 렌더링할 수 없습니다. 아래에 기록된 부재를 참고하세요. 다른 이름: menu, dropdown menu, context menu, right-click menu, actions menu, overflow menu, kebab menu, 메뉴, 드롭다운 메뉴, 컨텍스트 메뉴, 우클릭 메뉴, 더보기 메뉴, 케밥 메뉴.'
|
|
4
|
+
metadata:
|
|
5
|
+
package: '@neurocle/synapse-react'
|
|
6
|
+
packageVersion: '0.3.0'
|
|
7
|
+
registryEntry: 'packages/registry/data/components/menu.json'
|
|
8
|
+
registryStructuralVersion: '0.3.0'
|
|
9
|
+
lifecycle: 'active'
|
|
10
|
+
generator: 'packages/react/src/skills/generate.ts'
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<!--
|
|
14
|
+
생성된 파일 — 손으로 고치지 않습니다.
|
|
15
|
+
|
|
16
|
+
Source: packages/registry/data/components/menu.json (항목 구조 0.3.0)
|
|
17
|
+
Generator: packages/react/src/skills/generate.ts
|
|
18
|
+
Regenerate: npx nx run react:skills:generate
|
|
19
|
+
|
|
20
|
+
아래에서 이 컴포넌트에 대해 말하는 모든 문장은 그 항목의 필드입니다. 여기서 고친 내용은 다음
|
|
21
|
+
재생성 때 지워지고, 손으로 설명한 컴포넌트는 아무것도 실패하지 않은 채 설명과 어긋납니다.
|
|
22
|
+
대신 항목을 고칩니다.
|
|
23
|
+
-->
|
|
24
|
+
|
|
25
|
+
# Menu
|
|
26
|
+
|
|
27
|
+
> trigger나 오른쪽 클릭으로 여는 명령 목록으로, 하나를 고르면 그 명령이 실행되고 목록이 닫힙니다. 하나의 machine이 두 제스처를 모두 뒷받침하며, 드롭다운과 컨텍스트 메뉴는 제품이 어떤 part를 렌더링하는지만 다릅니다. machine이 제공하는 세 번째 패턴인 중첩 하위 메뉴는 현재 렌더링할 수 없습니다. 아래에 기록된 부재를 참고하세요.
|
|
28
|
+
|
|
29
|
+
`@neurocle/synapse-react` 0.3.0에서 생성했습니다. 설치된 버전이 이 버전이 아니면, 이 페이지의 어떤 내용보다 설치된 패키지 안에 함께 배포된 Registry를 우선합니다.
|
|
30
|
+
|
|
31
|
+
- 패키지: `@neurocle/synapse-react`
|
|
32
|
+
- 내보내기: `Menu`
|
|
33
|
+
- 분류: `floating-and-overlay`
|
|
34
|
+
- 수명 주기: `active`
|
|
35
|
+
|
|
36
|
+
## 알려진 예외 — 사용 전에 확인
|
|
37
|
+
|
|
38
|
+
이 컴포넌트는 아래 기준 3개를 **의도적으로 충족하지 않습니다**. 기록된 결정이므로 고치려 들지 말고, 각 항목의 유의점을 지켜서 씁니다.
|
|
39
|
+
|
|
40
|
+
### WCAG 2.2 SC 1.4.11 비텍스트 대비 (AA)
|
|
41
|
+
|
|
42
|
+
- 대상 part: `item`
|
|
43
|
+
- 충족하지 못하는 것: Menu의 강조된 항목은 `secondary.default` 배경만으로 표시되며, overlay 배경 대비 1.16:1(밝은 테마), 1.46:1(어두운 테마)로 3:1에 못 미칩니다. 포인터와 키보드 모두 링을 그리지 않습니다.
|
|
44
|
+
- 의도한 이유: 모든 강조 행에 링을 그리면 시스템의 다른 어떤 hover보다 무겁게 보였습니다. 포커스는 목록에 머물고 강조된 항목은 `aria-activedescendant`로 보조 기술에 전달되며, 선택된 항목은 파란 글자와 체크 표시로 따로 구분됩니다. `contrast-pairs.json`에 `highlight` 용도로 기록되어 있습니다.
|
|
45
|
+
- 사용 시 유의점: 저시력 사용자에게 강조 위치가 잘 보이지 않을 수 있습니다. 접근성 감사 대상 제품이라면 이 예외를 감사 문서에 포함하세요. 항목을 직접 그릴 때는 선택 상태의 글자색과 체크 표시를 지워 강조와 선택을 같은 모양으로 만들지 마세요.
|
|
46
|
+
|
|
47
|
+
### WAI-ARIA APG 메뉴 버튼 패턴 — Tab 키
|
|
48
|
+
|
|
49
|
+
- 충족하지 못하는 것: Tab이 열린 content 안에 갇힙니다. APG는 Tab이 메뉴를 닫고 포커스를 다음 요소로 옮기기를 권장하지만, 이 메뉴는 닫히지도 포커스가 밖으로 나가지도 않습니다.
|
|
50
|
+
- 의도한 이유: 업스트림 machine의 동작이며, machine 밖에서 키 처리를 덧붙이는 것은 금지되어 있으므로 그대로 둡니다.
|
|
51
|
+
- 사용 시 유의점: 키보드 사용자는 Escape로 메뉴를 닫아야 합니다. content 안에 포커스 가능한 요소를 넣지 마세요. 넣으면 그 요소들 사이를 순환하며 양 끝에서 막힙니다.
|
|
52
|
+
|
|
53
|
+
### 알려진 결함 — 중첩 메뉴와 체크 항목
|
|
54
|
+
|
|
55
|
+
- 대상 part: `triggerItem`
|
|
56
|
+
- 충족하지 못하는 것: `Menu.TriggerItem`은 렌더링하는 순간 예외를 던지므로 하위 메뉴를 만들 수 없고, ArrowRight·ArrowLeft 하위 메뉴 키도 아무 일을 하지 않습니다. `menuitemcheckbox`·`menuitemradio` 항목도 렌더링하지 않습니다.
|
|
57
|
+
- 의도한 이유: machine의 `getTriggerItemProps(childApi)`는 하위 메뉴의 api를 위치 인자로 받는데 part 팩토리가 그 형태를 지원하지 않습니다. 체크 항목의 getter는 anatomy 키가 없어 part가 될 수 없습니다. 둘 다 기반 계층의 결함으로 기록되어 있습니다.
|
|
58
|
+
- 사용 시 유의점: `Menu.Root`를 다른 Menu 안에 중첩하지 마세요. 동작하지 않는 두 번째 메뉴가 생깁니다. 하위 메뉴나 체크할 수 있는 메뉴가 필요하면 다른 컨트롤(예: Popover 안의 Checkbox·RadioGroup)로 구성하세요.
|
|
59
|
+
|
|
60
|
+
## Do
|
|
61
|
+
|
|
62
|
+
> trigger가 속한 대상에 대한 짧은 동작 목록에 쓰세요. 이름 바꾸기, 복제, 삭제, 내보내기가 그렇습니다. 동작이 버튼이 아니라 영역에 속한다면 ContextTrigger 방식을 쓰고, 둘 다가 아니라 둘 중 하나만 렌더링하세요. 같은 machine이므로 전환하는 데 드는 비용은 구성 변경뿐입니다. 관련 명령은 ItemGroup으로 묶고 그룹마다 레이블을 주세요. 접근 가능한 이름이 없는 그룹은 이름 없는 그룹으로 안내되어, 얻는 시각적 구분선보다 치르는 비용이 더 큽니다.
|
|
63
|
+
|
|
64
|
+
## Don't
|
|
65
|
+
|
|
66
|
+
> 값을 고르는 데 쓰지 마세요. menuitem은 선택 상태도 폼 값도 없는 명령으로 안내되므로, 하나를 고른 사용자는 지금 무엇이 적용되어 있는지 알 수 없습니다. 그것은 Select이거나, 선택지가 적다면 RadioGroup입니다. 사이트 내비게이션에도 쓰지 마세요. NavigationMenu는 랜드마크이고 그 링크는 aria-current를 지니는데, 링크로 이루어진 메뉴는 이를 버립니다. 길거나 검색이 필요한 목록에도 쓰지 마세요. 여기에는 컬렉션도, 윈도잉도, 입력해서 거르는 방법도 없으므로, 대략 한 화면을 넘는 메뉴는 아무도 탐색할 수 없는 스크롤이 됩니다. 그리고 현재 이 컴포넌트로 중첩 메뉴를 계획하지 마세요. TriggerItem이 렌더링되지 않으므로 하위 메뉴는 그냥 존재하지 않게 됩니다.
|
|
67
|
+
|
|
68
|
+
## Anti-patterns
|
|
69
|
+
|
|
70
|
+
> 항목 안에 두 번째 `Menu.Root`를 중첩해 하위 메뉴를 만드는 것. part는 타입 검사를 통과하고 바깥 메뉴도 계속 동작하므로 거의 맞아 보이지만, 두 machine은 서로를 전혀 알지 못합니다. 안쪽 메뉴는 바깥 메뉴와 함께 닫히지 않고, 바깥 메뉴는 안쪽 content를 바깥 상호작용으로 여겨 스스로 닫히며, 화살표 키 탐색은 경계에서 멈춥니다. 이 중첩은 없는 TriggerItem의 우회책이 아니라 두 번째로 망가진 메뉴입니다. 기반 결함이 고쳐질 때까지는 평평한 메뉴나 Dialog를 제공하세요.
|
|
71
|
+
|
|
72
|
+
Registry는 이 컴포넌트의 안내를 `reviewed`로 기록합니다(검토일 2026-09-22).
|
|
73
|
+
|
|
74
|
+
## 관련 컴포넌트
|
|
75
|
+
|
|
76
|
+
- `Select` (`select`)
|
|
77
|
+
- `NavigationMenu` (`navigation-menu`)
|
|
78
|
+
- `Popover` (`popover`)
|
|
79
|
+
- `ToggleGroup` (`toggle-group`)
|
|
80
|
+
- `Dialog` (`dialog`)
|
|
81
|
+
|
|
82
|
+
## 가져오기
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
import { Menu } from '@neurocle/synapse-react'
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Anatomy
|
|
89
|
+
|
|
90
|
+
React 네임스페이스가 노출하는 part 15개를 항목의 `parts.containment`가 기록한 대로 조합했습니다. 한 part가 놓일 수 있는 정당한 자리가 둘 이상이면 스니펫은 첫 번째를 쓰고, 아래 목록이 나머지를 알려 줍니다.
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
<Menu.Root>
|
|
94
|
+
<Menu.ContextTrigger />
|
|
95
|
+
<Menu.Positioner>
|
|
96
|
+
<Menu.Content>
|
|
97
|
+
<Menu.Arrow>
|
|
98
|
+
<Menu.ArrowTip />
|
|
99
|
+
</Menu.Arrow>
|
|
100
|
+
<Menu.ItemGroup>
|
|
101
|
+
<Menu.Item>
|
|
102
|
+
<Menu.ItemIndicator />
|
|
103
|
+
<Menu.ItemText />
|
|
104
|
+
</Menu.Item>
|
|
105
|
+
<Menu.ItemGroupLabel />
|
|
106
|
+
</Menu.ItemGroup>
|
|
107
|
+
<Menu.Separator />
|
|
108
|
+
<Menu.TriggerItem />
|
|
109
|
+
</Menu.Content>
|
|
110
|
+
</Menu.Positioner>
|
|
111
|
+
<Menu.Trigger>
|
|
112
|
+
<Menu.Indicator />
|
|
113
|
+
</Menu.Trigger>
|
|
114
|
+
</Menu.Root>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- `Menu.Root`
|
|
118
|
+
- `Menu.Arrow` — `Content` 안에 놓입니다
|
|
119
|
+
- `Menu.ArrowTip` — `Arrow` 안에 놓입니다
|
|
120
|
+
- `Menu.Content` — `Positioner` 안에 놓입니다
|
|
121
|
+
- `Menu.ContextTrigger` — 최상위에 놓입니다
|
|
122
|
+
- `Menu.Indicator` — `Trigger` 안에 놓입니다
|
|
123
|
+
- `Menu.Item` — `ItemGroup` 안, 또는 `Content` 안에 놓입니다
|
|
124
|
+
- `Menu.ItemGroup` — `Content` 안에 놓입니다
|
|
125
|
+
- `Menu.ItemGroupLabel` — `ItemGroup` 안에 놓입니다
|
|
126
|
+
- `Menu.ItemIndicator` — `Item` 안에 놓입니다
|
|
127
|
+
- `Menu.ItemText` — `Item` 안에 놓입니다
|
|
128
|
+
- `Menu.Positioner` — 최상위에 놓입니다
|
|
129
|
+
- `Menu.Separator` — `Content` 안에 놓입니다
|
|
130
|
+
- `Menu.Trigger` — 최상위에 놓입니다
|
|
131
|
+
- `Menu.TriggerItem` — `Content` 안에 놓입니다
|
|
132
|
+
|
|
133
|
+
## Props
|
|
134
|
+
|
|
135
|
+
빌드가 방출하는 선언에서 도출한 prop 17개. 선언에는 기본값을 둘 자리가 없으므로 prop 기록에는 기본값이 없습니다. 기본값이 있다면 그 prop의 설명에 적혀 있습니다.
|
|
136
|
+
|
|
137
|
+
모든 prop이 선택입니다. 아무것도 넘기지 않으면 컴포넌트는 비제어로 동작합니다.
|
|
138
|
+
|
|
139
|
+
### 선택
|
|
140
|
+
|
|
141
|
+
- `open` — `boolean`, 선택. 제어되는 열림 상태.
|
|
142
|
+
- `defaultOpen` — `boolean`, 선택. 비제어 모드의 초기 열림 상태. `open`을 주면 무시됩니다.
|
|
143
|
+
- `onOpenChange` — `(details: OpenChangeDetails) => void`, 선택. 제어 여부와 무관하게 메뉴가 열리거나 닫힐 때마다 호출됩니다.
|
|
144
|
+
- `onValueChange` — `(details: ValueChangeDetails<string>) => void`, 선택. 아이템이 선택됐을 때 그 아이템의 `value`와 함께 호출됩니다. machine은 이 prop을 `onSelect`라 부르는데, 어휘는 그것을 단 하나뿐인 변경 콜백의 경쟁 표기로 보고 거부합니다(`COMPETING_NAMES`). 변환은 이음매의 machine 쪽인 `useMachineProps`에서 일어나므로, 사용처는 이름 하나만 익히면 됩니다.
|
|
145
|
+
- `highlightedValue` — `string | null`, 선택. 제어되는 하이라이트 아이템. `aria-activedescendant`가 가리키는 대상입니다.
|
|
146
|
+
- `defaultHighlightedValue` — `string | null`, 선택. 비제어 모드에서 처음 하이라이트되는 아이템.
|
|
147
|
+
- `onHighlightChange` — `(details: MenuHighlightChangeDetails) => void`, 선택. 하이라이트가 옮겨 갈 때 호출됩니다.
|
|
148
|
+
- `closeOnSelect` — `boolean`, 선택. 아이템이 선택되면 메뉴를 닫습니다. 기본값은 true입니다.
|
|
149
|
+
- `loopFocus` — `boolean`, 선택. 키보드 이동이 양 끝을 넘어가면 반대쪽으로 돌아옵니다.
|
|
150
|
+
- `typeahead` — `boolean`, 선택. 레이블을 입력해 해당 아이템으로 건너뜁니다. 기본값은 true입니다.
|
|
151
|
+
- `composite` — `boolean`, 선택. 내용을 아이템이 복합 자식인 `menu`로 알립니다. 기본값은 true입니다. 복합이 아닌 메뉴는 `dialog`로 알려지며, 임의의 내용을 담은 메뉴에 씁니다.
|
|
152
|
+
- `positioning` — `MenuPositioning`, 선택. 메뉴가 trigger를 기준으로 놓이는 위치.
|
|
153
|
+
- `anchorPoint` — `MenuAnchorPoint`, 선택. trigger가 아니라 한 지점에 메뉴를 붙입니다. 컨텍스트 메뉴는 이렇게 자리를 잡습니다.
|
|
154
|
+
- `'aria-label'` — `string`, 선택. 어떤 trigger도 이름을 주지 않을 때 쓰는 메뉴의 접근성 이름.
|
|
155
|
+
- `translations` — `TranslationOverrides`, 선택. 이 Menu에만 적용되는 접근성 문자열로, provider의 값보다 우선합니다.
|
|
156
|
+
- `size` — `Size`, 선택. 하나뿐인 공용 척도를 따릅니다. 모든 컴포넌트와 마찬가지로 기본값은 `md`입니다.
|
|
157
|
+
- `id` — `string`, 선택. 팩토리가 만드는 식별자를 덮어씁니다. 서버와 클라이언트에서 같은 값으로 유지됩니다.
|
|
158
|
+
|
|
159
|
+
## Variants
|
|
160
|
+
|
|
161
|
+
- `size` — `xs`, `sm`, `md`, `lg`, `xl`. 기본값은 `md`. size는 trigger의 최소 높이, 각 항목의 글자와 인라인 패딩, content 자체의 패딩, 두 아이콘의 크기를 조절합니다. 메뉴의 너비는 정하지 않습니다. 메뉴는 가장 긴 레이블만큼 넓으며, 이는 다섯 단계 척도가 아니라 content가 정할 일입니다.
|
|
162
|
+
|
|
163
|
+
## 폼
|
|
164
|
+
|
|
165
|
+
폼 참여: 아니요.
|
|
166
|
+
|
|
167
|
+
> 폼에 제출하는 값이 없습니다. `onValueChange`는 어떤 명령이 선택되었는지 알리는데, 이는 필드가 아니라 동작입니다. 제출될 값을 고르는 데 쓰는 메뉴라면 그것은 Select입니다.
|
|
168
|
+
|
|
169
|
+
## 이 컴포넌트에 일부러 없는 것
|
|
170
|
+
|
|
171
|
+
- `empty-state` — 명령이 없는 메뉴는 렌더링하지 말았어야 할 trigger입니다. 항목은 이 컴포넌트가 불러오는 컬렉션이 아니라 제품이 작성하는 JSX이므로, 이 조건은 Menu가 존재하기 전에 결정됩니다. 아무것도 없는 곳으로 열리는 빈 팝업은 trigger가 없거나 비활성화된 것보다 나쁩니다.
|
|
172
|
+
- `loading-state` — 여기서는 아무것도 로드되지 않습니다. 명령은 자식으로 작성되므로 렌더링 시점에 이미 알려져 있으며, 명령 목록이 가져오기에 의존하는 제품은 trigger를 렌더링할지 결정하기 전에 그 가져오기를 끝냅니다.
|
|
173
|
+
- `error-state` — 항목을 고르면 `onValueChange`로 제품에 알릴 뿐입니다. 그 명령이 무엇을 하든, 무엇을 잘못하든, 그것은 메뉴가 이미 닫힌 뒤에 일어납니다. 실패는 더는 화면에 없는 팝업이 아니라 명령을 실행한 표면, 곧 Toast, 폼 필드, 페이지에 속합니다.
|
|
174
|
+
|
|
175
|
+
## 접근성
|
|
176
|
+
|
|
177
|
+
### 접근 가능한 이름
|
|
178
|
+
|
|
179
|
+
> content는 aria-labelledby를 통해 trigger에서 이름을 얻거나, 기준점이 설정되면 ContextTrigger에서 얻습니다. `Menu.Root`는 `aria-label`도 받으며 machine이 이를 content에 기록합니다. 이름 계산은 aria-labelledby를 우선하므로, 이 prop은 영역에 자체 텍스트가 없는 컨텍스트 메뉴를 위한 대체 수단입니다. 모든 항목은 자신의 내용으로 이름을 얻습니다. 이 machine은 영어 문자열을 하나도 하드코딩하지 않고 `translations`도 받지 않으므로, 제품이 바꿀 수 없는 이름을 내보내는 것이 없습니다. 이번 묶음의 컴포넌트 중에서는 규칙이 아니라 예외입니다.
|
|
180
|
+
|
|
181
|
+
### 포커스
|
|
182
|
+
|
|
183
|
+
> content는 tabIndex=0을 지니고 machine이 열릴 때 여기에 포커스를 주며, DOM 포커스를 항목마다 옮기는 대신 aria-activedescendant로 활성 항목을 가리킵니다. 닫히면 포커스가 trigger로 돌아오며, Escape로 닫을 때와 포커스 가능한 것에 닿지 않은 바깥 클릭으로 닫을 때도 마찬가지입니다.
|
|
184
|
+
|
|
185
|
+
### 알려진 빈틈
|
|
186
|
+
|
|
187
|
+
> `Menu.TriggerItem`은 렌더링할 수 없습니다. `@zag-js/menu`는 `getTriggerItemProps(childApi)`를 연결하는데, 이 함수는 하위 메뉴의 연결된 api를 위치 인자로 받습니다. 반면 part 팩토리가 지원하는 getter 인자 형태는 선언된 prop으로 만든 옵션 객체뿐이므로, 무언가가 이 part를 렌더링하는 즉시 getter가 예외를 던집니다. 그 이음매가 있다 해도 하위 메뉴는 마운트 시점에 `parentApi.setChild`와 `childApi.setParent`가 필요한데, Root는 자신을 감싸는 Root의 machine에 연결할 방법이 없습니다. 결과를 분명히 말하면, Synapse는 현재 중첩 메뉴를 제공하지 않으며, 이 part는 하네스 픽스처에 커버할 수 없는 것으로 기록되어 있고, 해결책은 이 컴포넌트가 할 수 있는 무언가가 아니라 `tools/vocabulary-check/src/exceptions.ts`의 기반 결함 `trigger-item-takes-a-child-api`입니다.
|
|
188
|
+
|
|
189
|
+
### 렌더링하지 않는 getter
|
|
190
|
+
|
|
191
|
+
> `getOptionItemProps`는 `menuitemcheckbox`나 `menuitemradio`를 만들지만 anatomy 키가 없으므로, part는 anatomy와 같아야 한다는 규칙을 깨지 않고는 part가 될 수 없습니다. `menu.tsx`에서 의도적인 결정으로 렌더링하지 않는다고 선언되어 있습니다. 현재 체크할 수 있는 메뉴가 필요한 제품은 다른 컨트롤을 써야 합니다.
|
|
192
|
+
|
|
193
|
+
## 로케일과 컬렉션
|
|
194
|
+
|
|
195
|
+
- 로케일 의존: 예. 배치는 논리적이어서 `bottom-start`가 텍스트 방향을 따르고, 화살표 키 탐색은 `dir`에 맞춰 해석되므로 오른쪽에서 왼쪽으로 쓰는 제품에서는 ArrowRight와 ArrowLeft의 의미가 뒤바뀝니다. 타입어헤드는 제품이 제공하는 항목 레이블, 곧 해당 로케일의 레이블과 대조합니다.
|
|
196
|
+
- 컬렉션 윈도잉: 아니요. Menu에는 컬렉션이 전혀 없습니다. 모든 항목은 사용처가 작성하는 요소이며, machine은 DOM을 질의해 그것들을 찾습니다. 윈도잉이 필요할 만큼 긴 메뉴는 명령 목록으로 잘못 이름 붙은 리스트박스이며, `whenNotToUse`가 짚는 실수가 바로 그것입니다.
|
|
197
|
+
|
|
198
|
+
## 기능 용어와 다른 이름
|
|
199
|
+
|
|
200
|
+
- 다루는 기능: `command-list`, `context-menu`, `grouped-options`, `typeahead`, `floating-layer`, `translatable-strings`.
|
|
201
|
+
- 다른 이름: `menu`, `dropdown menu`, `context menu`, `right-click menu`, `actions menu`, `overflow menu`, `kebab menu`, `메뉴`, `드롭다운 메뉴`, `컨텍스트 메뉴`, `우클릭 메뉴`, `더보기 메뉴`, `케밥 메뉴`.
|
|
202
|
+
- 어휘 상태: `controlled`.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'navigation-menu'
|
|
3
|
+
description: "NavigationMenu — 최상위 항목이 hover나 클릭으로 링크 패널을 여는 내비게이션 랜드마크입니다. 이번 묶음의 floating 컴포넌트 중 machine에 `root` anatomy part가 있는 유일한 것이어서 Root가 렌더링되며, `nav`로 렌더링됩니다. '내비게이션으로 건너뛰기'가 애초에 동작하게 하는 것이 바로 내비게이션 랜드마크이기 때문입니다. 다른 이름: navigation menu, nav menu, mega menu, main nav, header navigation, site menu, 내비게이션 메뉴, 내비 메뉴, 메가 메뉴, 주 내비게이션, 헤더 메뉴, 사이트 메뉴."
|
|
4
|
+
metadata:
|
|
5
|
+
package: '@neurocle/synapse-react'
|
|
6
|
+
packageVersion: '0.3.0'
|
|
7
|
+
registryEntry: 'packages/registry/data/components/navigation-menu.json'
|
|
8
|
+
registryStructuralVersion: '0.3.0'
|
|
9
|
+
lifecycle: 'active'
|
|
10
|
+
generator: 'packages/react/src/skills/generate.ts'
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<!--
|
|
14
|
+
생성된 파일 — 손으로 고치지 않습니다.
|
|
15
|
+
|
|
16
|
+
Source: packages/registry/data/components/navigation-menu.json (항목 구조 0.3.0)
|
|
17
|
+
Generator: packages/react/src/skills/generate.ts
|
|
18
|
+
Regenerate: npx nx run react:skills:generate
|
|
19
|
+
|
|
20
|
+
아래에서 이 컴포넌트에 대해 말하는 모든 문장은 그 항목의 필드입니다. 여기서 고친 내용은 다음
|
|
21
|
+
재생성 때 지워지고, 손으로 설명한 컴포넌트는 아무것도 실패하지 않은 채 설명과 어긋납니다.
|
|
22
|
+
대신 항목을 고칩니다.
|
|
23
|
+
-->
|
|
24
|
+
|
|
25
|
+
# NavigationMenu
|
|
26
|
+
|
|
27
|
+
> 최상위 항목이 hover나 클릭으로 링크 패널을 여는 내비게이션 랜드마크입니다. 이번 묶음의 floating 컴포넌트 중 machine에 `root` anatomy part가 있는 유일한 것이어서 Root가 렌더링되며, `nav`로 렌더링됩니다. '내비게이션으로 건너뛰기'가 애초에 동작하게 하는 것이 바로 내비게이션 랜드마크이기 때문입니다.
|
|
28
|
+
|
|
29
|
+
`@neurocle/synapse-react` 0.3.0에서 생성했습니다. 설치된 버전이 이 버전이 아니면, 이 페이지의 어떤 내용보다 설치된 패키지 안에 함께 배포된 Registry를 우선합니다.
|
|
30
|
+
|
|
31
|
+
- 패키지: `@neurocle/synapse-react`
|
|
32
|
+
- 내보내기: `NavigationMenu`
|
|
33
|
+
- 분류: `floating-and-overlay`
|
|
34
|
+
- 수명 주기: `active`
|
|
35
|
+
|
|
36
|
+
## 알려진 예외 — 사용 전에 확인
|
|
37
|
+
|
|
38
|
+
이 컴포넌트는 아래 기준 1개를 **의도적으로 충족하지 않습니다**. 기록된 결정이므로 고치려 들지 말고, 각 항목의 유의점을 지켜서 씁니다.
|
|
39
|
+
|
|
40
|
+
### WCAG 2.2 SC 2.1.1 키보드 (A)
|
|
41
|
+
|
|
42
|
+
- 충족하지 못하는 것: 공유 viewport를 쓰면 열린 trigger에서 Tab으로 그 패널 안에 들어가지 못합니다. 화살표 키와 포인터로는 여전히 조작할 수 있습니다.
|
|
43
|
+
- 의도한 이유: trigger에서 viewport로 포커스를 넘기는 프록시 요소(`getTriggerProxyProps`, `getViewportProxyProps`)는 인자를 받는 getter라 현재 팩토리로 렌더링할 수 없습니다. 기반 계층의 결함입니다.
|
|
44
|
+
- 사용 시 유의점: 키보드 사용자가 Tab으로 패널에 닿아야 한다면 공유 viewport 대신 항목별 패널을 쓰세요. 항목별 패널은 이 결함의 영향을 받지 않습니다.
|
|
45
|
+
|
|
46
|
+
## Do
|
|
47
|
+
|
|
48
|
+
> 사이트나 애플리케이션 셸의 주 내비게이션으로, 최상위 섹션이 곧바로 이동하지 않고 링크 패널을 여는 경우에 쓰세요. 사용자가 있는 페이지의 링크에 `current`를 전달하세요. 이것은 aria-current=page가 되며, 스크린 리더 사용자에게 자신이 이미 어디에 있는지 알려 주는 유일한 수단입니다. 모든 패널이 크기 사이를 애니메이션하는 하나의 상자를 차지해야 한다면 공유 Viewport를 쓰고, 패널이 작다면 각 Content를 자신의 Item 안에 렌더링하세요. 후자는 위에 기록된 탭 순서 공백도 피합니다.
|
|
49
|
+
|
|
50
|
+
## Don't
|
|
51
|
+
|
|
52
|
+
> 명령에는 쓰지 마세요. 항목은 내비게이션 랜드마크 안의 링크이므로, 이름을 바꾸고 삭제하는 버튼들의 패널은 어딘가로 이동하는 내비게이션으로 안내되는데, 실제로 일어나는 일과 정반대입니다. 그것은 Menu입니다. 임의 콘텐츠를 여닫는 단일 영역에도 쓰지 마세요. trigger 하나와 패널 하나는 Popover이며, 이를 `nav`로 감싸면 랜드마크 목록을 어지럽히는 랜드마크가 하나 늘어납니다. 콘텐츠가 페이지에 그대로 있는 페이지 내 섹션 전환에도 쓰지 마세요. 그것은 Tabs이며, 그 tablist와 패널은 내비게이션 메뉴에는 없는 관계를 지닙니다. 그리고 터치와 동등해지리라 기대하며 `disableHoverTrigger`를 끄지 마세요. hover로 여는 것은 포인터 어포던스이며, 터치 사용자가 얻는 것은 클릭 경로입니다.
|
|
53
|
+
|
|
54
|
+
## Anti-patterns
|
|
55
|
+
|
|
56
|
+
> Trigger를 List 안의 Item 안이 아니라 List의 형제로 렌더링하는 것. machine은 목록 요소를 기준으로 한 DOM 질의로 trigger를 찾은 다음 첫 번째 trigger의 `dir`을 검사 없이 읽습니다. 그래서 바깥에 놓인 trigger는 그저 무시되는 데 그치지 않고, 아무도 망가뜨리지 않은 컴포넌트의 이펙트 안에서 처리되지 않은 TypeError를 일으킵니다. HTML만으로는 이 중첩을 요구하지 않기 때문에, 하네스는 이를 machine이 부과하는 중첩 규칙으로 고정해 둡니다.
|
|
57
|
+
|
|
58
|
+
Registry는 이 컴포넌트의 안내를 `reviewed`로 기록합니다(검토일 2026-09-22).
|
|
59
|
+
|
|
60
|
+
## 관련 컴포넌트
|
|
61
|
+
|
|
62
|
+
- `Menu` (`menu`)
|
|
63
|
+
- `Tabs` (`tabs`)
|
|
64
|
+
- `Popover` (`popover`)
|
|
65
|
+
- `Toc` (`toc`)
|
|
66
|
+
- `HoverCard` (`hover-card`)
|
|
67
|
+
|
|
68
|
+
## 가져오기
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { NavigationMenu } from '@neurocle/synapse-react'
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Anatomy
|
|
75
|
+
|
|
76
|
+
React 네임스페이스가 노출하는 part 11개를 항목의 `parts.containment`가 기록한 대로 조합했습니다. 한 part가 놓일 수 있는 정당한 자리가 둘 이상이면 스니펫은 첫 번째를 쓰고, 아래 목록이 나머지를 알려 줍니다.
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
<NavigationMenu.Root>
|
|
80
|
+
<NavigationMenu.ViewportPositioner>
|
|
81
|
+
<NavigationMenu.Viewport />
|
|
82
|
+
</NavigationMenu.ViewportPositioner>
|
|
83
|
+
<NavigationMenu.List>
|
|
84
|
+
<NavigationMenu.Item>
|
|
85
|
+
<NavigationMenu.Trigger>
|
|
86
|
+
<NavigationMenu.ItemIndicator />
|
|
87
|
+
</NavigationMenu.Trigger>
|
|
88
|
+
<NavigationMenu.Content>
|
|
89
|
+
<NavigationMenu.Link />
|
|
90
|
+
</NavigationMenu.Content>
|
|
91
|
+
</NavigationMenu.Item>
|
|
92
|
+
</NavigationMenu.List>
|
|
93
|
+
<NavigationMenu.Indicator>
|
|
94
|
+
<NavigationMenu.Arrow />
|
|
95
|
+
</NavigationMenu.Indicator>
|
|
96
|
+
</NavigationMenu.Root>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- `NavigationMenu.Root` — 최상위에 놓입니다
|
|
100
|
+
- `NavigationMenu.ViewportPositioner` — `Root` 안에 놓입니다
|
|
101
|
+
- `NavigationMenu.Viewport` — `ViewportPositioner` 안에 놓입니다
|
|
102
|
+
- `NavigationMenu.Trigger` — `Item` 안에 놓입니다
|
|
103
|
+
- `NavigationMenu.Content` — `Item` 안, 또는 `Viewport` 안에 놓입니다
|
|
104
|
+
- `NavigationMenu.List` — `Root` 안에 놓입니다
|
|
105
|
+
- `NavigationMenu.Item` — `List` 안에 놓입니다
|
|
106
|
+
- `NavigationMenu.Link` — `Content` 안, 또는 `Item` 안에 놓입니다
|
|
107
|
+
- `NavigationMenu.Indicator` — `Root` 안에 놓입니다
|
|
108
|
+
- `NavigationMenu.ItemIndicator` — `Trigger` 안에 놓입니다
|
|
109
|
+
- `NavigationMenu.Arrow` — `Indicator` 안에 놓입니다
|
|
110
|
+
|
|
111
|
+
## Props
|
|
112
|
+
|
|
113
|
+
빌드가 방출하는 선언에서 도출한 prop 13개. 선언에는 기본값을 둘 자리가 없으므로 prop 기록에는 기본값이 없습니다. 기본값이 있다면 그 prop의 설명에 적혀 있습니다.
|
|
114
|
+
|
|
115
|
+
모든 prop이 선택입니다. 아무것도 넘기지 않으면 컴포넌트는 비제어로 동작합니다.
|
|
116
|
+
|
|
117
|
+
### 선택
|
|
118
|
+
|
|
119
|
+
- `value` — `string | null`, 선택. 제어되는 열린 아이템. 내용이 보이는 아이템의 `value`이거나 null입니다.
|
|
120
|
+
- `defaultValue` — `string | null`, 선택. 비제어 모드에서 처음 열려 있는 아이템. `value`를 주면 무시됩니다.
|
|
121
|
+
- `onValueChange` — `(details: ValueChangeDetails<string | null>) => void`, 선택. 제어 여부와 무관하게 열린 아이템이 바뀔 때마다 호출됩니다.
|
|
122
|
+
- `orientation` — `Orientation`, 선택. 메뉴가 배치되는 축. 기본값은 `horizontal`입니다.
|
|
123
|
+
- `openDelay` — `number`, 선택. 포인터가 trigger 위에 머물러야 그 내용이 열리기까지의 시간(밀리초).
|
|
124
|
+
- `closeDelay` — `number`, 선택. 포인터가 벗어난 뒤 내용이 닫히기까지의 시간(밀리초).
|
|
125
|
+
- `disableClickTrigger` — `boolean`, 선택. trigger의 클릭을 사용처에 맡깁니다. trigger가 링크를 겸할 때 씁니다.
|
|
126
|
+
- `disableHoverTrigger` — `boolean`, 선택. hover가 아니라 클릭으로만 내용을 엽니다.
|
|
127
|
+
- `disablePointerLeaveClose` — `boolean`, 선택. 포인터가 내용을 벗어나도 계속 열어 둡니다.
|
|
128
|
+
- `'aria-label'` — `string`, 선택. 내비게이션 랜드마크의 접근성 이름입니다. machine prop이 아니라 `nav` 요소에 붙는 DOM 속성입니다. machine 자체의 `rootLabel`은 기본값이 `undefined`라 덮어쓸 것도, 번역할 것도 없습니다. 한 페이지에 내비게이션 랜드마크가 둘 있는 제품은 둘을 구별하기 위해 이 값이 필요합니다.
|
|
129
|
+
- `translations` — `TranslationOverrides`, 선택. 이 NavigationMenu에만 적용되는 접근성 문자열로, provider의 값보다 우선합니다.
|
|
130
|
+
- `size` — `Size`, 선택. 하나뿐인 공용 척도를 따릅니다. 모든 컴포넌트와 마찬가지로 기본값은 `md`입니다.
|
|
131
|
+
- `id` — `string`, 선택. 팩토리가 만드는 식별자를 덮어씁니다. 서버와 클라이언트에서 같은 값으로 유지됩니다.
|
|
132
|
+
|
|
133
|
+
## Variants
|
|
134
|
+
|
|
135
|
+
- `size` — `xs`, `sm`, `md`, `lg`, `xl`. 기본값은 `md`. size는 trigger와 링크의 높이, 그 글자와 인라인 패딩, content의 패딩과 링크 사이 간격, 셰브론의 크기를 조절합니다. viewport의 너비는 척도에 없습니다. 메뉴 패널은 그 안에 담긴 레이아웃만큼 넓으며, 이는 다섯 단계 토큰이 아니라 제품의 구성에 속합니다.
|
|
136
|
+
|
|
137
|
+
## 폼
|
|
138
|
+
|
|
139
|
+
폼 참여: 아니요.
|
|
140
|
+
|
|
141
|
+
> 폼에 제출하는 값이 없습니다. `value`는 어떤 패널이 열려 있는지를 나타내며, 이는 필드가 아니라 보기 상태입니다.
|
|
142
|
+
|
|
143
|
+
## 이 컴포넌트에 일부러 없는 것
|
|
144
|
+
|
|
145
|
+
- `empty-state` — 내비게이션 구조는 JSX로 작성되어 빌드 시점에 알려집니다. 이 컴포넌트가 가져오는 데이터가 아니라 사이트 자체의 지도입니다. 아무것도 없는 내비게이션 랜드마크는 제품이 렌더링하지 말았어야 할 `nav`이며, 그 결정은 이 컴포넌트보다 위에서 내려집니다.
|
|
146
|
+
- `loading-state` — 여기서는 아무것도 로드되지 않습니다. content 패널은 첫 렌더링부터 존재하는 자식이며 machine은 그것을 보이거나 숨길 뿐이므로, 패널이 닫힌 것이 아니라 대기 중인 구간이 없습니다.
|
|
147
|
+
- `error-state` — Link를 따라가면 이동은 브라우저의 일이므로, 실패는 사용자가 이미 떠난 메뉴가 아니라 도착 페이지에서 일어납니다. 이 컴포넌트가 화면에 있는 동안 수행하는 작업 중 실패할 수 있는 것은 없습니다.
|
|
148
|
+
|
|
149
|
+
## 접근성
|
|
150
|
+
|
|
151
|
+
### 접근 가능한 이름
|
|
152
|
+
|
|
153
|
+
> 랜드마크의 이름은 사용처가 `NavigationMenu.Root`에 준 `aria-label`이며, 이는 누락이 아니라 결정입니다. machine의 `translations.rootLabel` 기본값이 `undefined`이므로 영어 문자열이 전혀 실려 나가지 않고, 제품이 덮어쓸 수 없는 것도 없습니다. "Navigation" 같은 기본값을 두면 Synapse가 제품의 랜드마크에 이름을 붙이는 셈이 되고, 누락을 드러내 두는 대신 감추게 됩니다. 내비게이션 랜드마크가 둘인 페이지는 이 prop으로 둘을 구분해야 합니다. 각 content 패널은 자신의 trigger로, 각 링크는 자신의 텍스트로 이름을 얻습니다.
|
|
154
|
+
|
|
155
|
+
### 포커스
|
|
156
|
+
|
|
157
|
+
> 포커스는 처음부터 끝까지 실제 DOM 포커스이며, 여기에는 aria-activedescendant가 없습니다. trigger는 방향에 맞는 진입 키로 포커스를 자신의 content로 옮기고, content 자체의 키 처리가 안의 탭 가능한 요소들을 거친 뒤 포커스를 다시 밖으로 넘깁니다.
|
|
158
|
+
|
|
159
|
+
### 알려진 빈틈
|
|
160
|
+
|
|
161
|
+
> 공유 viewport로 들어가는 키보드 다리는 렌더링할 수 없습니다. `api.getTriggerProxyProps({ value })`와 `api.getViewportProxyProps({ value })`는 trigger에서 공유 viewport의 content로 포커스를 옮겨 주는, 항목마다 하나씩 있는 시각적으로 숨긴 요소입니다. 둘 다 anatomy 키가 없고 인자를 받는 반면, `rootOwnedGetters`는 getter를 인자 없이 호출해 정확히 하나의 요소를 렌더링합니다. 둘 다 `navigation-menu.tsx`에 렌더링하지 않는다고 선언되어 있습니다. 그 비용은 이렇습니다. 공유 viewport에서는 열린 trigger에서 앞으로 탭해도 그 trigger의 패널 안에 닿지 않습니다. 메뉴는 화살표 키와 포인터로 여전히 완전히 조작할 수 있으며, 각 패널을 자신의 Item 안에 렌더링하는 메뉴, 곧 흔한 레이아웃은 영향을 받지 않습니다. 프록시는 공유 viewport가 만드는 틈을 잇기 위해서만 존재하기 때문입니다. 기반 결함 `root-owned-getter-cannot-render-per-item`으로 `tools/vocabulary-check/src/exceptions.ts`에 기록되어 있으며, 여기서 우회하지 않고 중앙에서 바로잡습니다.
|
|
162
|
+
|
|
163
|
+
## 로케일과 컬렉션
|
|
164
|
+
|
|
165
|
+
- 로케일 의존: 예. trigger에서 content로 포커스를 옮기는 키는 방향에 따라 다릅니다. 왼쪽에서 오른쪽으로 쓰는 제품에서는 ArrowRight, 오른쪽에서 왼쪽으로 쓰는 제품에서는 ArrowLeft이며, 목록을 따라가는 화살표 키 이동도 `dir`에 맞춰 해석됩니다. viewport는 논리적 레이아웃을 따르는 trigger의 측정된 상자를 기준으로 위치가 정해집니다.
|
|
166
|
+
- 컬렉션 윈도잉: 아니요. 컬렉션이 없습니다. 모든 항목, trigger, content 패널, 링크는 사용처가 작성하는 요소이며, machine은 DOM의 목록 요소를 질의해 trigger를 찾습니다. 그래서 List 바깥에 렌더링된 trigger는 machine이 볼 수 없는 trigger가 됩니다.
|
|
167
|
+
|
|
168
|
+
## 기능 용어와 다른 이름
|
|
169
|
+
|
|
170
|
+
- 다루는 기능: `site-navigation`, `mega-menu`, `hover-disclosure`, `current-page`, `floating-layer`, `axis-orientation`, `translatable-strings`.
|
|
171
|
+
- 다른 이름: `navigation menu`, `nav menu`, `mega menu`, `main nav`, `header navigation`, `site menu`, `내비게이션 메뉴`, `내비 메뉴`, `메가 메뉴`, `주 내비게이션`, `헤더 메뉴`, `사이트 메뉴`.
|
|
172
|
+
- 어휘 상태: `controlled`.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 'number-input'
|
|
3
|
+
description: 'NumberInput — 스테퍼가 달린 숫자 필드로, provider의 로케일에 따라 서식화하고 파싱하므로 소수점과 자릿수 구분 기호가 사용자가 입력하는 것과 일치합니다. 다른 이름: number input, spinner, stepper, quantity field, numeric field, 숫자 입력, 숫자 필드, 스피너, 스테퍼, 수량 입력.'
|
|
4
|
+
metadata:
|
|
5
|
+
package: '@neurocle/synapse-react'
|
|
6
|
+
packageVersion: '0.3.0'
|
|
7
|
+
registryEntry: 'packages/registry/data/components/number-input.json'
|
|
8
|
+
registryStructuralVersion: '0.3.0'
|
|
9
|
+
lifecycle: 'active'
|
|
10
|
+
generator: 'packages/react/src/skills/generate.ts'
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<!--
|
|
14
|
+
생성된 파일 — 손으로 고치지 않습니다.
|
|
15
|
+
|
|
16
|
+
Source: packages/registry/data/components/number-input.json (항목 구조 0.3.0)
|
|
17
|
+
Generator: packages/react/src/skills/generate.ts
|
|
18
|
+
Regenerate: npx nx run react:skills:generate
|
|
19
|
+
|
|
20
|
+
아래에서 이 컴포넌트에 대해 말하는 모든 문장은 그 항목의 필드입니다. 여기서 고친 내용은 다음
|
|
21
|
+
재생성 때 지워지고, 손으로 설명한 컴포넌트는 아무것도 실패하지 않은 채 설명과 어긋납니다.
|
|
22
|
+
대신 항목을 고칩니다.
|
|
23
|
+
-->
|
|
24
|
+
|
|
25
|
+
# NumberInput
|
|
26
|
+
|
|
27
|
+
> 스테퍼가 달린 숫자 필드로, provider의 로케일에 따라 서식화하고 파싱하므로 소수점과 자릿수 구분 기호가 사용자가 입력하는 것과 일치합니다.
|
|
28
|
+
|
|
29
|
+
`@neurocle/synapse-react` 0.3.0에서 생성했습니다. 설치된 버전이 이 버전이 아니면, 이 페이지의 어떤 내용보다 설치된 패키지 안에 함께 배포된 Registry를 우선합니다.
|
|
30
|
+
|
|
31
|
+
- 패키지: `@neurocle/synapse-react`
|
|
32
|
+
- 내보내기: `NumberInput`
|
|
33
|
+
- 분류: `form-controls`
|
|
34
|
+
- 수명 주기: `active`
|
|
35
|
+
|
|
36
|
+
## 알려진 예외 — 사용 전에 확인
|
|
37
|
+
|
|
38
|
+
이 컴포넌트는 아래 기준 1개를 **의도적으로 충족하지 않습니다**. 기록된 결정이므로 고치려 들지 말고, 각 항목의 유의점을 지켜서 씁니다.
|
|
39
|
+
|
|
40
|
+
### WCAG 2.2 SC 2.5.8 대상 크기(최소) (AA)
|
|
41
|
+
|
|
42
|
+
- 대상 part: `incrementTrigger`, `decrementTrigger`
|
|
43
|
+
- 충족하지 못하는 것: 두 스테퍼가 위아래로 쌓여 각각 컨트롤 높이의 절반이 되므로, `xl`을 제외한 모든 크기에서 높이가 24px보다 작습니다(약 12·14·16·20px). 둘 다 `tabIndex=-1`입니다.
|
|
44
|
+
- 의도한 이유: SC 2.5.8의 동등 대안 예외에 기댑니다. 입력 자체가 대상 크기를 충족하고, 입력이나 화살표 키로 모든 값에 닿을 수 있습니다.
|
|
45
|
+
- 사용 시 유의점: 스테퍼를 유일한 조작 수단으로 만들지 마세요(예: 입력을 `readOnly`로 두고 스테퍼만 쓰게 하는 것). 터치 비중이 높은 화면에서는 큰 크기를 쓰세요.
|
|
46
|
+
|
|
47
|
+
## Do
|
|
48
|
+
|
|
49
|
+
> 사용자가 입력하거나 조금씩 조정하는 숫자에 쓰세요. 수량, 가격, 기간, 임곗값이 그렇습니다. 스테퍼는 작은 조정을 쉽게 만들고, 서식화는 사용자가 구분 기호를 직접 넣지 않아도 긴 숫자를 읽기 쉽게 유지합니다.
|
|
50
|
+
|
|
51
|
+
## Don't
|
|
52
|
+
|
|
53
|
+
> 정확한 수치보다 값들 사이의 관계가 더 중요한, 좁고 한정된 범위에서 고르는 숫자에는 쓰지 마세요. 그것은 Slider이며, spinbutton은 가운데를 찾으려고 사용자에게 계산을 시킵니다. 코드, 전화번호, 연도에도 쓰지 마세요. 이들은 숫자처럼 보일 뿐인 숫자 문자열이며, 자릿수 구분 기호로 서식화하는 것은 명백히 잘못입니다. 값에 올리고 내릴 자연스러운 단위가 없는 곳에도 쓰지 마세요.
|
|
54
|
+
|
|
55
|
+
## Anti-patterns
|
|
56
|
+
|
|
57
|
+
> `locale` prop을 전달하는 것. 로케일은 방향과 똑같이 SynapseProvider에서 옵니다. 한 번 설정한 제품이 어떤 컴포넌트에 또 알려 줘야 하는지 기억할 필요가 없어야 하기 때문이며, 하나의 사실에 출처가 둘이면 필드가 한 로케일로 서식화하고 다른 로케일로 파싱하는 일이 생깁니다.
|
|
58
|
+
|
|
59
|
+
Registry는 이 컴포넌트의 안내를 `reviewed`로 기록합니다(검토일 2026-09-22).
|
|
60
|
+
|
|
61
|
+
## 관련 컴포넌트
|
|
62
|
+
|
|
63
|
+
- `Slider` (`slider`)
|
|
64
|
+
- `PinInput` (`pin-input`)
|
|
65
|
+
- `Editable` (`editable`)
|
|
66
|
+
|
|
67
|
+
## 가져오기
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import { NumberInput } from '@neurocle/synapse-react'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Anatomy
|
|
74
|
+
|
|
75
|
+
React 네임스페이스가 노출하는 part 8개를 항목의 `parts.containment`가 기록한 대로 조합했습니다. 한 part가 놓일 수 있는 정당한 자리가 둘 이상이면 스니펫은 첫 번째를 쓰고, 아래 목록이 나머지를 알려 줍니다.
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<NumberInput.Root>
|
|
79
|
+
<NumberInput.Label />
|
|
80
|
+
<NumberInput.Control>
|
|
81
|
+
<NumberInput.Input />
|
|
82
|
+
<NumberInput.IncrementTrigger />
|
|
83
|
+
<NumberInput.DecrementTrigger />
|
|
84
|
+
</NumberInput.Control>
|
|
85
|
+
<NumberInput.ValueText />
|
|
86
|
+
<NumberInput.Scrubber />
|
|
87
|
+
</NumberInput.Root>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
- `NumberInput.Root` — 최상위에 놓입니다
|
|
91
|
+
- `NumberInput.Label` — `Root` 안에 놓입니다
|
|
92
|
+
- `NumberInput.Input` — `Control` 안, 또는 `Root` 안에 놓입니다
|
|
93
|
+
- `NumberInput.Control` — `Root` 안에 놓입니다
|
|
94
|
+
- `NumberInput.ValueText` — `Root` 안에 놓입니다
|
|
95
|
+
- `NumberInput.IncrementTrigger` — `Control` 안에 놓입니다
|
|
96
|
+
- `NumberInput.DecrementTrigger` — `Control` 안에 놓입니다
|
|
97
|
+
- `NumberInput.Scrubber` — `Root` 안에 놓입니다
|
|
98
|
+
|
|
99
|
+
## Props
|
|
100
|
+
|
|
101
|
+
빌드가 방출하는 선언에서 도출한 prop 26개. 선언에는 기본값을 둘 자리가 없으므로 prop 기록에는 기본값이 없습니다. 기본값이 있다면 그 prop의 설명에 적혀 있습니다.
|
|
102
|
+
|
|
103
|
+
모든 prop이 선택입니다. 아무것도 넘기지 않으면 컴포넌트는 비제어로 동작합니다.
|
|
104
|
+
|
|
105
|
+
### 선택
|
|
106
|
+
|
|
107
|
+
- `value` — `string`, 선택. 제어되는 값이며 문자열입니다. 파싱된 숫자가 아니라 입력이 담고 있는 텍스트 그대로입니다.
|
|
108
|
+
- `defaultValue` — `string`, 선택. 비제어 모드의 초기 값. `value`를 주면 무시됩니다.
|
|
109
|
+
- `onValueChange` — `(details: NumberInputValueChangeDetails) => void`, 선택. 값을 바꾸는 모든 키 입력마다 호출됩니다.
|
|
110
|
+
- `onValueCommit` — `(details: NumberInputValueChangeDetails) => void`, 선택. 값이 가라앉은 뒤 호출됩니다. 블러, Enter, 또는 길게 누르기가 끝나는 시점입니다.
|
|
111
|
+
- `onValueInvalid` — `(details: { readonly value: string; }) => void`, 선택. `min`/`max` 바깥의 값이 입력됐을 때 호출됩니다.
|
|
112
|
+
- `min` — `number`, 선택. 받아들이는 가장 낮은 값.
|
|
113
|
+
- `max` — `number`, 선택. 받아들이는 가장 높은 값.
|
|
114
|
+
- `step` — `number`, 선택. 화살표 키와 스테퍼의 단위. 기본값은 1입니다.
|
|
115
|
+
- `largeStep` — `number`, 선택. PageUp/PageDown의 단위. 기본값은 열 스텝입니다.
|
|
116
|
+
- `smallStep` — `number`, 선택. Shift+화살표의 단위. 기본값은 한 스텝의 10분의 1입니다.
|
|
117
|
+
- `formatOptions` — `NumberFormatOptions`, 선택. 로케일이 정하는 것 너머로 숫자를 쓰는 방식입니다. 형태는 `Intl.NumberFormatOptions`와 같고, 주지 않으면 입력한 소수 자릿수를 모두 유지합니다.
|
|
118
|
+
- `locale` — `string`, 선택. 이 필드에만 provider의 로케일을 덮어씁니다. 한 화면에 정말로 둘 이상의 로케일이 함께 나오는 제품을 위한 것입니다. 이를테면 다른 언어로 된 텍스트 옆에 통화를 그 시장의 서식대로 입력받는 경우입니다. 그 밖의 모든 경우에는 `SynapseProvider`에서 로케일을 한 번만 정해야 합니다.
|
|
119
|
+
- `clampValueOnBlur` — `boolean`, 선택. 블러 시 범위를 벗어난 값을 `min`..`max` 안으로 되돌립니다. 기본값은 true입니다.
|
|
120
|
+
- `allowOverflow` — `boolean`, 선택. 값이 잘리기 전까지는 `min`/`max`를 넘겨 입력하는 것을 허용합니다.
|
|
121
|
+
- `allowMouseWheel` — `boolean`, 선택. 입력에 포커스가 있는 동안 스크롤 휠로 값을 올리고 내립니다. 기본값은 false입니다.
|
|
122
|
+
- `spinOnPress` — `boolean`, 선택. 스테퍼를 누르고 있는 동안 스텝을 반복합니다. 기본값은 true입니다.
|
|
123
|
+
- `inputMode` — `'text' | 'tel' | 'numeric' | 'decimal' | 'search' | 'none'`, 선택. 요청할 가상 키보드. 기본값은 `decimal`입니다.
|
|
124
|
+
- `name` — `string`, 선택. 폼 필드 이름. 이 값이 없으면 컨트롤은 아무것도 제출하지 않습니다.
|
|
125
|
+
- `form` — `string`, 선택. 폼 바깥에 렌더된 입력을 id로 그 폼에 연결합니다.
|
|
126
|
+
- `disabled` — `boolean`, 선택. 비활성화된 NumberInput은 제출하지도, 반응하지도 않습니다.
|
|
127
|
+
- `readOnly` — `boolean`, 선택. 읽기 전용 NumberInput은 값을 제출하지만 바꿀 수는 없습니다.
|
|
128
|
+
- `invalid` — `boolean`, 선택. 보조 기술에 `aria-invalid`로 알립니다.
|
|
129
|
+
- `required` — `boolean`, 선택. 제약 검증. 폼이 제출되려면 필드에 값이 있어야 합니다.
|
|
130
|
+
- `translations` — `TranslationOverrides`, 선택. 이 NumberInput에만 적용되는 접근성 문자열로, provider의 값보다 우선합니다.
|
|
131
|
+
- `size` — `Size`, 선택. 하나뿐인 공용 척도를 따릅니다. 모든 컴포넌트와 마찬가지로 기본값은 `md`입니다.
|
|
132
|
+
- `id` — `string`, 선택. 팩토리가 만드는 식별자를 덮어씁니다. 서버와 클라이언트에서 같은 값으로 유지됩니다.
|
|
133
|
+
|
|
134
|
+
## Variants
|
|
135
|
+
|
|
136
|
+
- `size` — `xs`, `sm`, `md`, `lg`, `xl`. 기본값은 `md`.
|
|
137
|
+
|
|
138
|
+
## 폼
|
|
139
|
+
|
|
140
|
+
폼 참여: 예.
|
|
141
|
+
|
|
142
|
+
- `input[role=spinbutton]`으로 제출합니다.
|
|
143
|
+
- 제출 값은 `value`에서 옵니다.
|
|
144
|
+
- 항목은 사용처가 아무것도 설정하지 않았을 때 제출되는 값을 기록하지 않습니다.
|
|
145
|
+
|
|
146
|
+
> 보이는 입력이 곧 폼 컨트롤입니다. `getInputProps()`가 `name`과 `form`을 지니므로 제출만을 위해 렌더링되는 것이 없고, 그런 요소를 보조 기술에서 숨겨야 한다는 규칙은 여기서 적용될 대상이 없습니다.
|
|
147
|
+
|
|
148
|
+
## 이 컴포넌트에 일부러 없는 것
|
|
149
|
+
|
|
150
|
+
- `empty-state` — 컬렉션이 아니라 값 하나를 보유하므로, 비어 있을 수 있는 집합이 없습니다. 값이 없는 필드는 placeholder를 보여 주는 필드이며, 이는 컴포넌트의 part가 아니라 입력의 한 상태입니다.
|
|
151
|
+
- `loading-state` — 아직 도착하지 않은 값은 비활성화된 NumberInput에 주변 페이지가 이미 쓰는 스켈레톤을 더해 표현하세요. 로딩 part를 두면 비활성 상태와 겹쳐, 하나의 조건을 표현하는 방법이 두 가지가 됩니다.
|
|
152
|
+
- `error-state` — 유효하지 않음은 컨트롤의 상태이며, `invalid`로 보고되고 aria-invalid로 안내되며, min..max 범위 밖의 값이 입력되면 `onValueInvalid`가 호출됩니다. 범위를 설명하는 문장은 주변 필드에 속합니다.
|
|
153
|
+
|
|
154
|
+
## 접근성
|
|
155
|
+
|
|
156
|
+
### 접근 가능한 이름
|
|
157
|
+
|
|
158
|
+
> htmlFor로 연결된 실제 `<label>`인 Label part에서 이름을 얻습니다. 스테퍼는 machine에 내장된 영어가 아니라 provider의 번역 가능한 문자열 집합에서 이름을 얻습니다.
|
|
159
|
+
|
|
160
|
+
### 포커스
|
|
161
|
+
|
|
162
|
+
> 입력이 유일한 탭 정지 지점입니다. 두 스테퍼는 machine 자체의 결정으로 `tabIndex={-1}`인데, 화살표 키가 이미 그 일을 하므로 필드마다 탭 정지 지점 두 개를 더해도 새로운 기능이 생기지 않기 때문입니다. 스테퍼는 위아래로 쌓여 있어 각각 컨트롤 높이의 절반이며, `xl`을 제외한 모든 크기에서 `target.minimum`보다 작습니다. 이는 WCAG 2.5.8의 동등 대안 예외에 기대는데, 입력 자체가 대상 크기를 충족하고 입력이나 화살표 키로 모든 값에 닿을 수 있기 때문입니다.
|
|
163
|
+
|
|
164
|
+
### 로케일
|
|
165
|
+
|
|
166
|
+
> 구분 기호는 provider의 로케일이 정하며, 표시뿐 아니라 파싱도 좌우합니다. 잘못된 로케일을 받은 필드는 그 로케일 사용자가 입력하는 키 입력을 조용히 거부합니다.
|
|
167
|
+
|
|
168
|
+
## 로케일과 컬렉션
|
|
169
|
+
|
|
170
|
+
- 로케일 의존: 예. 구분 기호는 provider의 로케일이 정하며, 표시뿐 아니라 파싱도 좌우합니다. 잘못된 로케일을 받은 필드는 그 로케일 사용자가 입력하는 키 입력을 조용히 거부합니다. 한 로케일로 서식화하고 다른 로케일로 파싱한 값은 표시 차이가 아니라 필드가 받아들이기를 거부하는 숫자입니다.
|
|
171
|
+
- 컬렉션 윈도잉: 아니요. 항목은 이를 이유 없이 사실로만 기록합니다.
|
|
172
|
+
|
|
173
|
+
## 기능 용어와 다른 이름
|
|
174
|
+
|
|
175
|
+
- 다루는 기능: `numeric-entry`, `increment-decrement`, `stepped-value`, `locale-formatting`, `locale-parsing`, `form-value`, `readonly-display`, `translatable-strings`.
|
|
176
|
+
- 다른 이름: `number input`, `spinner`, `stepper`, `quantity field`, `numeric field`, `숫자 입력`, `숫자 필드`, `스피너`, `스테퍼`, `수량 입력`.
|
|
177
|
+
- 어휘 상태: `controlled`.
|