@archytechtor/ui 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +105 -2
- package/dist/components/accordion/accordion.d.ts +25 -0
- package/dist/components/accordion/accordion.js +88 -0
- package/dist/components/accordion/index.d.ts +3 -0
- package/dist/components/accordion/index.js +1 -0
- package/dist/components/accordion/types.d.ts +39 -0
- package/dist/components/alert/alert.d.ts +25 -0
- package/dist/components/alert/alert.js +59 -0
- package/dist/components/alert/index.d.ts +3 -0
- package/dist/components/alert/index.js +3 -0
- package/dist/components/alert/types.d.ts +32 -0
- package/dist/components/alert/types.js +19 -0
- package/dist/components/alert-dialog/alert-dialog.d.ts +73 -0
- package/dist/components/alert-dialog/alert-dialog.js +170 -0
- package/dist/components/alert-dialog/index.d.ts +3 -0
- package/dist/components/alert-dialog/index.js +1 -0
- package/dist/components/alert-dialog/types.d.ts +80 -0
- package/dist/components/aspect-ratio/aspect-ratio.d.ts +8 -0
- package/dist/components/aspect-ratio/aspect-ratio.js +20 -0
- package/dist/components/aspect-ratio/index.d.ts +3 -0
- package/dist/components/aspect-ratio/index.js +1 -0
- package/dist/components/aspect-ratio/types.d.ts +8 -0
- package/dist/components/attachment/attachment.d.ts +57 -0
- package/dist/components/attachment/attachment.js +139 -0
- package/dist/components/attachment/index.d.ts +3 -0
- package/dist/components/attachment/index.js +3 -0
- package/dist/components/attachment/types.d.ts +79 -0
- package/dist/components/attachment/types.js +43 -0
- package/dist/components/avatar/avatar.d.ts +39 -0
- package/dist/components/avatar/avatar.js +88 -0
- package/dist/components/avatar/index.d.ts +3 -0
- package/dist/components/avatar/index.js +3 -0
- package/dist/components/avatar/types.d.ts +54 -0
- package/dist/components/avatar/types.js +21 -0
- package/dist/components/badge/badge.d.ts +7 -0
- package/dist/components/badge/badge.js +23 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/badge/index.js +3 -0
- package/dist/components/badge/types.d.ts +21 -0
- package/dist/components/badge/types.js +26 -0
- package/dist/components/breadcrumb/breadcrumb.d.ts +43 -0
- package/dist/components/breadcrumb/breadcrumb.js +115 -0
- package/dist/components/breadcrumb/index.d.ts +3 -0
- package/dist/components/breadcrumb/index.js +1 -0
- package/dist/components/breadcrumb/types.d.ts +36 -0
- package/dist/components/bubble/bubble.d.ts +25 -0
- package/dist/components/bubble/bubble.js +69 -0
- package/dist/components/bubble/index.d.ts +3 -0
- package/dist/components/bubble/index.js +3 -0
- package/dist/components/bubble/types.d.ts +51 -0
- package/dist/components/bubble/types.js +60 -0
- package/dist/components/button/button.d.ts +7 -0
- package/dist/components/button/button.js +155 -0
- package/dist/components/button/index.d.ts +4 -0
- package/dist/components/button/index.js +4 -0
- package/dist/components/button/types.d.ts +80 -0
- package/dist/components/button/types.js +99 -0
- package/dist/components/button/use-hold-to-confirm.d.ts +25 -0
- package/dist/components/button/use-hold-to-confirm.js +161 -0
- package/dist/components/button-group/button-group.d.ts +20 -0
- package/dist/components/button-group/button-group.js +62 -0
- package/dist/components/button-group/index.d.ts +3 -0
- package/dist/components/button-group/index.js +3 -0
- package/dist/components/button-group/types.d.ts +30 -0
- package/dist/components/button-group/types.js +19 -0
- package/dist/components/calendar/calendar.d.ts +15 -0
- package/dist/components/calendar/calendar.js +157 -0
- package/dist/components/calendar/index.d.ts +3 -0
- package/dist/components/calendar/index.js +1 -0
- package/dist/components/calendar/types.d.ts +21 -0
- package/dist/components/card/card.d.ts +43 -0
- package/dist/components/card/card.js +97 -0
- package/dist/components/card/index.d.ts +3 -0
- package/dist/components/card/index.js +3 -0
- package/dist/components/card/types.d.ts +44 -0
- package/dist/components/card/types.js +19 -0
- package/dist/components/carousel/carousel.d.ts +36 -0
- package/dist/components/carousel/carousel.js +190 -0
- package/dist/components/carousel/index.d.ts +3 -0
- package/dist/components/carousel/index.js +1 -0
- package/dist/components/carousel/types.d.ts +79 -0
- package/dist/components/chart/chart.d.ts +35 -0
- package/dist/components/chart/chart.js +212 -0
- package/dist/components/chart/index.d.ts +3 -0
- package/dist/components/chart/index.js +1 -0
- package/dist/components/chart/types.d.ts +89 -0
- package/dist/components/chart/types.js +7 -0
- package/dist/components/checkbox/checkbox.d.ts +7 -0
- package/dist/components/checkbox/checkbox.js +31 -0
- package/dist/components/checkbox/index.d.ts +3 -0
- package/dist/components/checkbox/index.js +1 -0
- package/dist/components/checkbox/types.d.ts +25 -0
- package/dist/components/code-block/code-block.d.ts +49 -0
- package/dist/components/code-block/code-block.js +188 -0
- package/dist/components/code-block/highlighter.d.ts +15 -0
- package/dist/components/code-block/highlighter.js +123 -0
- package/dist/components/code-block/index.d.ts +5 -0
- package/dist/components/code-block/index.js +5 -0
- package/dist/components/code-block/types.d.ts +94 -0
- package/dist/components/code-block/types.js +38 -0
- package/dist/components/code-block/use-highlighted-code.d.ts +9 -0
- package/dist/components/code-block/use-highlighted-code.js +67 -0
- package/dist/components/collapsible/collapsible.d.ts +19 -0
- package/dist/components/collapsible/collapsible.js +44 -0
- package/dist/components/collapsible/index.d.ts +3 -0
- package/dist/components/collapsible/index.js +1 -0
- package/dist/components/collapsible/types.d.ts +26 -0
- package/dist/components/combobox/combobox.d.ts +104 -0
- package/dist/components/combobox/combobox.js +365 -0
- package/dist/components/combobox/index.d.ts +3 -0
- package/dist/components/combobox/index.js +1 -0
- package/dist/components/combobox/types.d.ts +229 -0
- package/dist/components/command/command.d.ts +55 -0
- package/dist/components/command/command.js +179 -0
- package/dist/components/command/index.d.ts +3 -0
- package/dist/components/command/index.js +1 -0
- package/dist/components/command/types.d.ts +69 -0
- package/dist/components/context-menu/context-menu.d.ts +92 -0
- package/dist/components/context-menu/context-menu.js +270 -0
- package/dist/components/context-menu/index.d.ts +3 -0
- package/dist/components/context-menu/index.js +1 -0
- package/dist/components/context-menu/types.d.ts +138 -0
- package/dist/components/data-table/data-table-features.d.ts +21 -0
- package/dist/components/data-table/data-table-features.js +22 -0
- package/dist/components/data-table/data-table.d.ts +69 -0
- package/dist/components/data-table/data-table.js +283 -0
- package/dist/components/data-table/index.d.ts +4 -0
- package/dist/components/data-table/index.js +3 -0
- package/dist/components/data-table/types.d.ts +63 -0
- package/dist/components/date-input/date-input.d.ts +7 -0
- package/dist/components/date-input/date-input.js +147 -0
- package/dist/components/date-input/index.d.ts +3 -0
- package/dist/components/date-input/index.js +1 -0
- package/dist/components/date-input/types.d.ts +27 -0
- package/dist/components/date-picker/date-picker.d.ts +7 -0
- package/dist/components/date-picker/date-picker.js +74 -0
- package/dist/components/date-picker/index.d.ts +3 -0
- package/dist/components/date-picker/index.js +1 -0
- package/dist/components/date-picker/types.d.ts +38 -0
- package/dist/components/date-range-picker/date-range-picker.d.ts +7 -0
- package/dist/components/date-range-picker/date-range-picker.js +89 -0
- package/dist/components/date-range-picker/index.d.ts +3 -0
- package/dist/components/date-range-picker/index.js +1 -0
- package/dist/components/date-range-picker/types.d.ts +43 -0
- package/dist/components/dialog/dialog.d.ts +61 -0
- package/dist/components/dialog/dialog.js +160 -0
- package/dist/components/dialog/index.d.ts +3 -0
- package/dist/components/dialog/index.js +1 -0
- package/dist/components/dialog/types.d.ts +68 -0
- package/dist/components/drawer/drawer.d.ts +69 -0
- package/dist/components/drawer/drawer.js +245 -0
- package/dist/components/drawer/index.d.ts +3 -0
- package/dist/components/drawer/index.js +1 -0
- package/dist/components/drawer/types.d.ts +93 -0
- package/dist/components/dropdown-menu/dropdown-menu.d.ts +92 -0
- package/dist/components/dropdown-menu/dropdown-menu.js +268 -0
- package/dist/components/dropdown-menu/index.d.ts +3 -0
- package/dist/components/dropdown-menu/index.js +1 -0
- package/dist/components/dropdown-menu/types.d.ts +143 -0
- package/dist/components/empty/empty.d.ts +37 -0
- package/dist/components/empty/empty.js +84 -0
- package/dist/components/empty/index.d.ts +3 -0
- package/dist/components/empty/index.js +3 -0
- package/dist/components/empty/types.d.ts +39 -0
- package/dist/components/empty/types.js +13 -0
- package/dist/components/expanded-card/expanded-card.d.ts +43 -0
- package/dist/components/expanded-card/expanded-card.js +352 -0
- package/dist/components/expanded-card/index.d.ts +3 -0
- package/dist/components/expanded-card/index.js +1 -0
- package/dist/components/expanded-card/types.d.ts +52 -0
- package/dist/components/field/field.d.ts +62 -0
- package/dist/components/field/field.js +173 -0
- package/dist/components/field/index.d.ts +3 -0
- package/dist/components/field/index.js +3 -0
- package/dist/components/field/types.d.ts +81 -0
- package/dist/components/field/types.js +21 -0
- package/dist/components/form/form.d.ts +49 -0
- package/dist/components/form/form.js +136 -0
- package/dist/components/form/index.d.ts +3 -0
- package/dist/components/form/index.js +1 -0
- package/dist/components/form/types.d.ts +59 -0
- package/dist/components/hover-card/hover-card.d.ts +19 -0
- package/dist/components/hover-card/hover-card.js +63 -0
- package/dist/components/hover-card/index.d.ts +3 -0
- package/dist/components/hover-card/index.js +1 -0
- package/dist/components/hover-card/types.d.ts +27 -0
- package/dist/components/image-gallery/image-gallery.d.ts +8 -0
- package/dist/components/image-gallery/image-gallery.js +294 -0
- package/dist/components/image-gallery/index.d.ts +4 -0
- package/dist/components/image-gallery/index.js +3 -0
- package/dist/components/image-gallery/masonry.d.ts +11 -0
- package/dist/components/image-gallery/masonry.js +62 -0
- package/dist/components/image-gallery/types.d.ts +80 -0
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/index.js +1 -0
- package/dist/components/input/input.d.ts +7 -0
- package/dist/components/input/input.js +18 -0
- package/dist/components/input/types.d.ts +28 -0
- package/dist/components/input-group/index.d.ts +3 -0
- package/dist/components/input-group/index.js +3 -0
- package/dist/components/input-group/input-group.d.ts +37 -0
- package/dist/components/input-group/input-group.js +103 -0
- package/dist/components/input-group/types.d.ts +64 -0
- package/dist/components/input-group/types.js +31 -0
- package/dist/components/input-otp/index.d.ts +3 -0
- package/dist/components/input-otp/index.js +1 -0
- package/dist/components/input-otp/input-otp.d.ts +25 -0
- package/dist/components/input-otp/input-otp.js +76 -0
- package/dist/components/input-otp/types.d.ts +43 -0
- package/dist/components/item/index.d.ts +3 -0
- package/dist/components/item/index.js +3 -0
- package/dist/components/item/item.d.ts +61 -0
- package/dist/components/item/item.js +149 -0
- package/dist/components/item/types.d.ts +75 -0
- package/dist/components/item/types.js +48 -0
- package/dist/components/kbd/index.d.ts +3 -0
- package/dist/components/kbd/index.js +1 -0
- package/dist/components/kbd/kbd.d.ts +13 -0
- package/dist/components/kbd/kbd.js +30 -0
- package/dist/components/kbd/types.d.ts +9 -0
- package/dist/components/label/index.d.ts +3 -0
- package/dist/components/label/index.js +1 -0
- package/dist/components/label/label.d.ts +7 -0
- package/dist/components/label/label.js +17 -0
- package/dist/components/label/types.d.ts +8 -0
- package/dist/components/loader/index.d.ts +3 -0
- package/dist/components/loader/index.js +3 -0
- package/dist/components/loader/loader.d.ts +8 -0
- package/dist/components/loader/loader.js +386 -0
- package/dist/components/loader/types.d.ts +27 -0
- package/dist/components/loader/types.js +58 -0
- package/dist/components/marker/index.d.ts +3 -0
- package/dist/components/marker/index.js +3 -0
- package/dist/components/marker/marker.d.ts +19 -0
- package/dist/components/marker/marker.js +51 -0
- package/dist/components/marker/types.d.ts +30 -0
- package/dist/components/marker/types.js +16 -0
- package/dist/components/menubar/index.d.ts +3 -0
- package/dist/components/menubar/index.js +1 -0
- package/dist/components/menubar/menubar.d.ts +98 -0
- package/dist/components/menubar/menubar.js +284 -0
- package/dist/components/menubar/types.d.ts +146 -0
- package/dist/components/message/index.d.ts +3 -0
- package/dist/components/message/index.js +1 -0
- package/dist/components/message/message.d.ts +37 -0
- package/dist/components/message/message.js +83 -0
- package/dist/components/message/types.d.ts +32 -0
- package/dist/components/message-scroller/index.d.ts +4 -0
- package/dist/components/message-scroller/index.js +3 -0
- package/dist/components/message-scroller/message-scroller-primitive.d.ts +21 -0
- package/dist/components/message-scroller/message-scroller-primitive.js +1349 -0
- package/dist/components/message-scroller/message-scroller.d.ts +39 -0
- package/dist/components/message-scroller/message-scroller.js +103 -0
- package/dist/components/message-scroller/types.d.ts +107 -0
- package/dist/components/money-input/index.d.ts +3 -0
- package/dist/components/money-input/index.js +1 -0
- package/dist/components/money-input/money-input.d.ts +7 -0
- package/dist/components/money-input/money-input.js +143 -0
- package/dist/components/money-input/types.d.ts +20 -0
- package/dist/components/morph-image/index.d.ts +3 -0
- package/dist/components/morph-image/index.js +3 -0
- package/dist/components/morph-image/morph-image.d.ts +8 -0
- package/dist/components/morph-image/morph-image.js +155 -0
- package/dist/components/morph-image/types.d.ts +38 -0
- package/dist/components/morph-image/types.js +18 -0
- package/dist/components/native-select/index.d.ts +3 -0
- package/dist/components/native-select/index.js +3 -0
- package/dist/components/native-select/native-select.d.ts +20 -0
- package/dist/components/native-select/native-select.js +57 -0
- package/dist/components/native-select/types.d.ts +52 -0
- package/dist/components/native-select/types.js +23 -0
- package/dist/components/navigation-menu/index.d.ts +3 -0
- package/dist/components/navigation-menu/index.js +3 -0
- package/dist/components/navigation-menu/navigation-menu.d.ts +50 -0
- package/dist/components/navigation-menu/navigation-menu.js +145 -0
- package/dist/components/navigation-menu/types.d.ts +79 -0
- package/dist/components/navigation-menu/types.js +15 -0
- package/dist/components/number-stepper/index.d.ts +3 -0
- package/dist/components/number-stepper/index.js +3 -0
- package/dist/components/number-stepper/number-stepper.d.ts +9 -0
- package/dist/components/number-stepper/number-stepper.js +223 -0
- package/dist/components/number-stepper/types.d.ts +47 -0
- package/dist/components/number-stepper/types.js +174 -0
- package/dist/components/pagination/index.d.ts +3 -0
- package/dist/components/pagination/index.js +1 -0
- package/dist/components/pagination/pagination.d.ts +43 -0
- package/dist/components/pagination/pagination.js +121 -0
- package/dist/components/pagination/types.d.ts +37 -0
- package/dist/components/phone-input/index.d.ts +3 -0
- package/dist/components/phone-input/index.js +1 -0
- package/dist/components/phone-input/phone-input.d.ts +7 -0
- package/dist/components/phone-input/phone-input.js +54 -0
- package/dist/components/phone-input/types.d.ts +12 -0
- package/dist/components/popover/index.d.ts +3 -0
- package/dist/components/popover/index.js +1 -0
- package/dist/components/popover/popover.d.ts +37 -0
- package/dist/components/popover/popover.js +100 -0
- package/dist/components/popover/types.d.ts +51 -0
- package/dist/components/progress/index.d.ts +3 -0
- package/dist/components/progress/index.js +1 -0
- package/dist/components/progress/progress.d.ts +32 -0
- package/dist/components/progress/progress.js +100 -0
- package/dist/components/progress/types.d.ts +31 -0
- package/dist/components/questionnaire/index.d.ts +3 -0
- package/dist/components/questionnaire/index.js +1 -0
- package/dist/components/questionnaire/questionnaire-primitive.js +1563 -0
- package/dist/components/questionnaire/questionnaire.d.ts +91 -0
- package/dist/components/questionnaire/questionnaire.js +315 -0
- package/dist/components/questionnaire/types.d.ts +203 -0
- package/dist/components/radio-group/index.d.ts +3 -0
- package/dist/components/radio-group/index.js +1 -0
- package/dist/components/radio-group/radio-group.d.ts +13 -0
- package/dist/components/radio-group/radio-group.js +44 -0
- package/dist/components/radio-group/types.d.ts +33 -0
- package/dist/components/reorder-list/index.d.ts +3 -0
- package/dist/components/reorder-list/index.js +1 -0
- package/dist/components/reorder-list/reorder-list.d.ts +19 -0
- package/dist/components/reorder-list/reorder-list.js +279 -0
- package/dist/components/reorder-list/types.d.ts +65 -0
- package/dist/components/resizable/index.d.ts +3 -0
- package/dist/components/resizable/index.js +1 -0
- package/dist/components/resizable/resizable.d.ts +19 -0
- package/dist/components/resizable/resizable.js +44 -0
- package/dist/components/resizable/types.d.ts +89 -0
- package/dist/components/scroll-area/index.d.ts +3 -0
- package/dist/components/scroll-area/index.js +1 -0
- package/dist/components/scroll-area/scroll-area.d.ts +13 -0
- package/dist/components/scroll-area/scroll-area.js +47 -0
- package/dist/components/scroll-area/types.d.ts +19 -0
- package/dist/components/select/index.d.ts +3 -0
- package/dist/components/select/index.js +1 -0
- package/dist/components/select/select.d.ts +61 -0
- package/dist/components/select/select.js +183 -0
- package/dist/components/select/types.d.ts +100 -0
- package/dist/components/separator/index.d.ts +3 -0
- package/dist/components/separator/index.js +1 -0
- package/dist/components/separator/separator.d.ts +7 -0
- package/dist/components/separator/separator.js +20 -0
- package/dist/components/separator/types.d.ts +9 -0
- package/dist/components/sheet/index.d.ts +3 -0
- package/dist/components/sheet/index.js +1 -0
- package/dist/components/sheet/sheet.d.ts +61 -0
- package/dist/components/sheet/sheet.js +155 -0
- package/dist/components/sheet/types.d.ts +69 -0
- package/dist/components/sidebar/index.d.ts +3 -0
- package/dist/components/sidebar/index.js +3 -0
- package/dist/components/sidebar/sidebar.d.ts +145 -0
- package/dist/components/sidebar/sidebar.js +550 -0
- package/dist/components/sidebar/types.d.ts +186 -0
- package/dist/components/sidebar/types.js +42 -0
- package/dist/components/sidebar/use-mobile.js +21 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/skeleton/skeleton.d.ts +8 -0
- package/dist/components/skeleton/skeleton.js +18 -0
- package/dist/components/skeleton/types.d.ts +5 -0
- package/dist/components/slider/index.d.ts +3 -0
- package/dist/components/slider/index.js +1 -0
- package/dist/components/slider/slider.d.ts +7 -0
- package/dist/components/slider/slider.js +106 -0
- package/dist/components/slider/types.d.ts +39 -0
- package/dist/components/spinner/index.d.ts +3 -0
- package/dist/components/spinner/index.js +1 -0
- package/dist/components/spinner/spinner.d.ts +7 -0
- package/dist/components/spinner/spinner.js +21 -0
- package/dist/components/spinner/types.d.ts +8 -0
- package/dist/components/switch/index.d.ts +3 -0
- package/dist/components/switch/index.js +3 -0
- package/dist/components/switch/switch.d.ts +7 -0
- package/dist/components/switch/switch.js +32 -0
- package/dist/components/switch/types.d.ts +37 -0
- package/dist/components/switch/types.js +23 -0
- package/dist/components/table/index.d.ts +3 -0
- package/dist/components/table/index.js +1 -0
- package/dist/components/table/table.d.ts +49 -0
- package/dist/components/table/table.js +112 -0
- package/dist/components/table/types.d.ts +33 -0
- package/dist/components/tabs/index.d.ts +3 -0
- package/dist/components/tabs/index.js +3 -0
- package/dist/components/tabs/tabs.d.ts +25 -0
- package/dist/components/tabs/tabs.js +81 -0
- package/dist/components/tabs/types.d.ts +61 -0
- package/dist/components/tabs/types.js +18 -0
- package/dist/components/textarea/index.d.ts +3 -0
- package/dist/components/textarea/index.js +1 -0
- package/dist/components/textarea/textarea.d.ts +7 -0
- package/dist/components/textarea/textarea.js +17 -0
- package/dist/components/textarea/types.d.ts +26 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.js +1 -0
- package/dist/components/toast/toast.d.ts +63 -0
- package/dist/components/toast/toast.js +321 -0
- package/dist/components/toast/types.d.ts +120 -0
- package/dist/components/toggle/index.d.ts +3 -0
- package/dist/components/toggle/index.js +3 -0
- package/dist/components/toggle/toggle.d.ts +7 -0
- package/dist/components/toggle/toggle.js +32 -0
- package/dist/components/toggle/types.d.ts +35 -0
- package/dist/components/toggle/types.js +37 -0
- package/dist/components/toggle-group/index.d.ts +3 -0
- package/dist/components/toggle-group/index.js +1 -0
- package/dist/components/toggle-group/toggle-group.d.ts +13 -0
- package/dist/components/toggle-group/toggle-group.js +88 -0
- package/dist/components/toggle-group/types.d.ts +52 -0
- package/dist/components/tooltip/index.d.ts +3 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/tooltip/tooltip.d.ts +25 -0
- package/dist/components/tooltip/tooltip.js +79 -0
- package/dist/components/tooltip/types.d.ts +48 -0
- package/dist/components/trace/index.d.ts +3 -0
- package/dist/components/trace/index.js +1 -0
- package/dist/components/trace/trace.d.ts +52 -0
- package/dist/components/trace/trace.js +132 -0
- package/dist/components/trace/types.d.ts +54 -0
- package/dist/components/typography/index.d.ts +3 -0
- package/dist/components/typography/index.js +3 -0
- package/dist/components/typography/types.d.ts +29 -0
- package/dist/components/typography/types.js +25 -0
- package/dist/components/typography/typography.d.ts +7 -0
- package/dist/components/typography/typography.js +40 -0
- package/dist/components/video-player/index.d.ts +6 -0
- package/dist/components/video-player/index.js +5 -0
- package/dist/components/video-player/types.d.ts +143 -0
- package/dist/components/video-player/use-video-player.js +319 -0
- package/dist/components/video-player/video-player-context.d.ts +45 -0
- package/dist/components/video-player/video-player-context.js +15 -0
- package/dist/components/video-player/video-player-controls.d.ts +38 -0
- package/dist/components/video-player/video-player-controls.js +226 -0
- package/dist/components/video-player/video-player-overlay.d.ts +13 -0
- package/dist/components/video-player/video-player-overlay.js +113 -0
- package/dist/components/video-player/video-player.d.ts +8 -0
- package/dist/components/video-player/video-player.js +139 -0
- package/dist/index.d.ts +244 -0
- package/dist/index.js +114 -0
- package/dist/lib/floating.d.ts +44 -0
- package/dist/lib/focus-source.js +51 -0
- package/dist/lib/format.d.ts +67 -0
- package/dist/lib/format.js +130 -0
- package/dist/lib/locale.d.ts +104 -0
- package/dist/lib/locale.js +103 -0
- package/dist/lib/part-props.d.ts +15 -0
- package/dist/lib/use-controllable-state.js +22 -0
- package/dist/lib/utils.d.ts +9 -0
- package/dist/lib/utils.js +16 -0
- package/dist/styles/index.css +126 -0
- package/dist/styles/theme.css +80 -0
- package/dist/styles/utilities.css +553 -0
- package/package.json +89 -3
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { VariantProps } from "class-variance-authority";
|
|
2
|
+
import { ComponentProps } from "react";
|
|
3
|
+
import { useRender } from "@base-ui/react/use-render";
|
|
4
|
+
/**
|
|
5
|
+
* Стили пузыря: цвет содержимого задаёт вариант.
|
|
6
|
+
* Содержимое-кнопка или ссылка (render у BubbleContent) меняет фон при наведении
|
|
7
|
+
*/
|
|
8
|
+
export declare const bubbleVariants: (props?: ({
|
|
9
|
+
variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "muted" | "tinted" | null | undefined;
|
|
10
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
11
|
+
/**
|
|
12
|
+
* Стили реакций: плашка на краю пузыря сверху или снизу
|
|
13
|
+
*/
|
|
14
|
+
export declare const bubbleReactionsVariants: (props?: ({
|
|
15
|
+
side?: "top" | "bottom" | null | undefined;
|
|
16
|
+
align?: "start" | "end" | null | undefined;
|
|
17
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Варианты оформления пузыря
|
|
20
|
+
*/
|
|
21
|
+
type BubbleVariantsT = VariantProps<typeof bubbleVariants>;
|
|
22
|
+
/**
|
|
23
|
+
* Пропсы группы пузырей
|
|
24
|
+
*/
|
|
25
|
+
export type BubbleGroupPropsT = ComponentProps<'div'>;
|
|
26
|
+
/**
|
|
27
|
+
* Пропсы пузыря
|
|
28
|
+
*/
|
|
29
|
+
export type BubblePropsT = ComponentProps<'div'> & {
|
|
30
|
+
/**
|
|
31
|
+
* Оформление: default — основной цвет, secondary, muted — приглушённый, tinted — оттенок основного,
|
|
32
|
+
* outline — с рамкой, ghost — без рамки и фона во всю ширину, destructive — ошибка
|
|
33
|
+
*/
|
|
34
|
+
variant?: BubbleVariantsT['variant'];
|
|
35
|
+
/** Сторона: start — слева (собеседник), end — справа (свои сообщения) */
|
|
36
|
+
align?: 'start' | 'end';
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Пропсы содержимого пузыря
|
|
40
|
+
*/
|
|
41
|
+
export type BubbleContentPropsT = useRender.ComponentProps<'div'>;
|
|
42
|
+
/**
|
|
43
|
+
* Пропсы реакций пузыря
|
|
44
|
+
*/
|
|
45
|
+
export type BubbleReactionsPropsT = ComponentProps<'div'> & {
|
|
46
|
+
/** Край пузыря по горизонтали: start — слева, end — справа */
|
|
47
|
+
align?: 'start' | 'end';
|
|
48
|
+
/** Край пузыря по вертикали: top — сверху, bottom — снизу */
|
|
49
|
+
side?: 'top' | 'bottom';
|
|
50
|
+
};
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
// src/components/bubble/types.ts
|
|
3
|
+
/**
|
|
4
|
+
* Стили пузыря: цвет содержимого задаёт вариант.
|
|
5
|
+
* Содержимое-кнопка или ссылка (render у BubbleContent) меняет фон при наведении
|
|
6
|
+
*/
|
|
7
|
+
const bubbleVariants = cva(["group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1", "data-[align=end]:self-end data-[variant=ghost]:max-w-full group-data-[align=end]/message:self-end"], {
|
|
8
|
+
variants: { variant: {
|
|
9
|
+
default: ["*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground", "[&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80"],
|
|
10
|
+
secondary: ["*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground", "[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]"],
|
|
11
|
+
muted: ["*:data-[slot=bubble-content]:bg-muted", "[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]"],
|
|
12
|
+
tinted: [
|
|
13
|
+
"*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)]",
|
|
14
|
+
"dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)]",
|
|
15
|
+
"*:data-[slot=bubble-content]:text-foreground",
|
|
16
|
+
"[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)]",
|
|
17
|
+
"dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]"
|
|
18
|
+
],
|
|
19
|
+
outline: [
|
|
20
|
+
"*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background",
|
|
21
|
+
"[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted",
|
|
22
|
+
"[&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground",
|
|
23
|
+
"dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30"
|
|
24
|
+
],
|
|
25
|
+
ghost: [
|
|
26
|
+
"border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent",
|
|
27
|
+
"*:data-[slot=bubble-content]:p-0",
|
|
28
|
+
"[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted",
|
|
29
|
+
"[&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground",
|
|
30
|
+
"dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50"
|
|
31
|
+
],
|
|
32
|
+
destructive: [
|
|
33
|
+
"*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive",
|
|
34
|
+
"dark:*:data-[slot=bubble-content]:bg-destructive/20",
|
|
35
|
+
"[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20",
|
|
36
|
+
"dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30"
|
|
37
|
+
]
|
|
38
|
+
} },
|
|
39
|
+
defaultVariants: { variant: "default" }
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Стили реакций: плашка на краю пузыря сверху или снизу
|
|
43
|
+
*/
|
|
44
|
+
const bubbleReactionsVariants = cva(["absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5", "text-sm ring-3 ring-card has-[button]:p-0"], {
|
|
45
|
+
variants: {
|
|
46
|
+
side: {
|
|
47
|
+
top: "top-0 -translate-y-3/4",
|
|
48
|
+
bottom: "bottom-0 translate-y-3/4"
|
|
49
|
+
},
|
|
50
|
+
align: {
|
|
51
|
+
start: "left-3",
|
|
52
|
+
end: "right-3"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
defaultVariants: {
|
|
56
|
+
side: "bottom",
|
|
57
|
+
align: "end"
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
export { bubbleReactionsVariants, bubbleVariants };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ButtonPropsT } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Кнопка: действие на странице или в форме. Ссылку в стилях кнопки рисуют через render={<a href />}
|
|
4
|
+
* @param props - пропсы кнопки
|
|
5
|
+
* @returns кнопка или свой элемент в стилях кнопки
|
|
6
|
+
*/
|
|
7
|
+
export declare function Button({ className, variant, size, disabled, loading, loadingLabel, render, nativeButton, onClick, holdToConfirm, holdDuration, holdResetDelay, onConfirm, onHoldCancel, confirmedContent, holdLabel, ref, children, ...props }: ButtonPropsT): import("react").JSX.Element;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../../lib/utils.js";
|
|
3
|
+
import { texts } from "../../lib/locale.js";
|
|
4
|
+
import { buttonHoldFillVariants, buttonVariants } from "./types.js";
|
|
5
|
+
import { useHoldToConfirm } from "./use-hold-to-confirm.js";
|
|
6
|
+
import { LoaderCircleIcon } from "lucide-react";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { Button } from "@base-ui/react/button";
|
|
9
|
+
import { mergeProps } from "@base-ui/react/merge-props";
|
|
10
|
+
import { isValidElement, useId } from "react";
|
|
11
|
+
// src/components/button/button.tsx
|
|
12
|
+
/**
|
|
13
|
+
* render отрисовывает не <button>: ссылку или другой элемент
|
|
14
|
+
* @param render - свой элемент
|
|
15
|
+
* @returns true, если это не кнопка
|
|
16
|
+
*/
|
|
17
|
+
function isCustomElement(render) {
|
|
18
|
+
if (render === void 0) return false;
|
|
19
|
+
return !isValidElement(render) || render.type !== "button";
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Кнопка: действие на странице или в форме. Ссылку в стилях кнопки рисуют через render={<a href />}
|
|
23
|
+
* @param props - пропсы кнопки
|
|
24
|
+
* @returns кнопка или свой элемент в стилях кнопки
|
|
25
|
+
*/
|
|
26
|
+
function Button$1({ className, variant = "default", size = "default", disabled = false, loading = false, loadingLabel = texts.loading, render, nativeButton, onClick, holdToConfirm = false, holdDuration = 1500, holdResetDelay = 2e3, onConfirm, onHoldCancel, confirmedContent, holdLabel = texts.holdToConfirm, ref, children, ...props }) {
|
|
27
|
+
const isInactive = disabled || loading;
|
|
28
|
+
const isCustom = isCustomElement(render);
|
|
29
|
+
const holdLabelId = useId();
|
|
30
|
+
const hold = useHoldToConfirm({
|
|
31
|
+
enabled: holdToConfirm,
|
|
32
|
+
duration: holdDuration,
|
|
33
|
+
resetDelay: holdResetDelay,
|
|
34
|
+
disabled: isInactive,
|
|
35
|
+
onConfirm,
|
|
36
|
+
onCancel: onHoldCancel
|
|
37
|
+
});
|
|
38
|
+
const isConfirmed = hold.state === "confirmed";
|
|
39
|
+
const classes = cn(buttonVariants({
|
|
40
|
+
variant,
|
|
41
|
+
size
|
|
42
|
+
}), holdToConfirm && "relative", holdToConfirm && "touch-manipulation", holdToConfirm && "[-webkit-touch-callout:none]", holdToConfirm && "transition-[color,background-color,border-color,box-shadow,scale]", holdToConfirm && "duration-[600ms]", holdToConfirm && "ease-spring-bounce", holdToConfirm && "data-[hold=holding]:scale-[0.97]", holdToConfirm && "data-[hold=holding]:duration-200", holdToConfirm && "data-[hold=holding]:ease-out", holdToConfirm && "motion-reduce:scale-100", className);
|
|
43
|
+
/**
|
|
44
|
+
* Нажатие: у отключённой ссылки отменить переход и не вызывать onClick
|
|
45
|
+
* @param event - событие нажатия
|
|
46
|
+
*/
|
|
47
|
+
const handleClick = (event) => {
|
|
48
|
+
if (isInactive) {
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
onClick?.(event);
|
|
53
|
+
};
|
|
54
|
+
const ariaDisabled = isCustom && isInactive || void 0;
|
|
55
|
+
const nativeDisabled = isCustom ? void 0 : isInactive;
|
|
56
|
+
/**
|
|
57
|
+
* Элемент кнопки: в хук удержания и наружу
|
|
58
|
+
* @param node - элемент или null при размонтировании
|
|
59
|
+
*/
|
|
60
|
+
const setRef = (node) => {
|
|
61
|
+
hold.setElement(node);
|
|
62
|
+
if (typeof ref === "function") {
|
|
63
|
+
ref(node);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (ref) ref.current = node;
|
|
67
|
+
};
|
|
68
|
+
const holdProps = holdToConfirm ? {
|
|
69
|
+
...hold.handlers,
|
|
70
|
+
"data-hold": hold.state,
|
|
71
|
+
"aria-describedby": holdLabelId
|
|
72
|
+
} : {};
|
|
73
|
+
const rootProps = mergeProps(props, holdProps);
|
|
74
|
+
const fillClasses = buttonHoldFillVariants({ variant });
|
|
75
|
+
const fillContent = isConfirmed ? confirmedContent ?? /* @__PURE__ */ jsx(ButtonConfirmed, {}) : children;
|
|
76
|
+
const fillKey = isConfirmed ? "confirmed" : "idle";
|
|
77
|
+
return /* @__PURE__ */ jsxs(Button, {
|
|
78
|
+
"data-slot": "button",
|
|
79
|
+
"data-variant": variant,
|
|
80
|
+
"data-size": size,
|
|
81
|
+
"data-loading": loading || void 0,
|
|
82
|
+
"aria-busy": loading || void 0,
|
|
83
|
+
"aria-disabled": ariaDisabled,
|
|
84
|
+
disabled: nativeDisabled,
|
|
85
|
+
nativeButton: nativeButton ?? !isCustom,
|
|
86
|
+
render,
|
|
87
|
+
ref: setRef,
|
|
88
|
+
className: classes,
|
|
89
|
+
onClick: handleClick,
|
|
90
|
+
...rootProps,
|
|
91
|
+
children: [
|
|
92
|
+
loading && /* @__PURE__ */ jsx(ButtonSpinner, {}),
|
|
93
|
+
children,
|
|
94
|
+
loading && " ",
|
|
95
|
+
loading && /* @__PURE__ */ jsx("span", {
|
|
96
|
+
className: "sr-only",
|
|
97
|
+
children: loadingLabel
|
|
98
|
+
}),
|
|
99
|
+
holdToConfirm && /* @__PURE__ */ jsx("span", {
|
|
100
|
+
"data-slot": "button-hold-fill",
|
|
101
|
+
"aria-hidden": true,
|
|
102
|
+
className: fillClasses,
|
|
103
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
104
|
+
className: "inline-flex items-center gap-[inherit] animate-in duration-300 fade-in-0 zoom-in-90 blur-in",
|
|
105
|
+
children: fillContent
|
|
106
|
+
}, fillKey)
|
|
107
|
+
}),
|
|
108
|
+
holdToConfirm && /* @__PURE__ */ jsx("span", {
|
|
109
|
+
id: holdLabelId,
|
|
110
|
+
className: "sr-only",
|
|
111
|
+
children: holdLabel
|
|
112
|
+
}),
|
|
113
|
+
holdToConfirm && /* @__PURE__ */ jsx("span", {
|
|
114
|
+
"aria-live": "polite",
|
|
115
|
+
className: "sr-only",
|
|
116
|
+
children: isConfirmed && texts.done
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Содержимое после подтверждения удержанием: прорисованная галочка и «Готово»
|
|
123
|
+
* @returns галочка и текст
|
|
124
|
+
*/
|
|
125
|
+
function ButtonConfirmed() {
|
|
126
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("svg", {
|
|
127
|
+
viewBox: "0 0 24 24",
|
|
128
|
+
fill: "none",
|
|
129
|
+
stroke: "currentColor",
|
|
130
|
+
strokeWidth: 2.5,
|
|
131
|
+
strokeLinecap: "round",
|
|
132
|
+
strokeLinejoin: "round",
|
|
133
|
+
"aria-hidden": true,
|
|
134
|
+
"data-icon": "inline-start",
|
|
135
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
136
|
+
d: "M5 12.5l4.5 4.5L19 7.5",
|
|
137
|
+
pathLength: 1,
|
|
138
|
+
strokeDasharray: 1,
|
|
139
|
+
className: "animate-draw motion-reduce:animate-none"
|
|
140
|
+
})
|
|
141
|
+
}), texts.done] });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Спиннер загрузки: декоративный, состояние объявляет текст loadingLabel
|
|
145
|
+
* @returns иконка спиннера
|
|
146
|
+
*/
|
|
147
|
+
function ButtonSpinner() {
|
|
148
|
+
return /* @__PURE__ */ jsx(LoaderCircleIcon, {
|
|
149
|
+
"data-slot": "button-spinner",
|
|
150
|
+
"data-icon": "inline-start",
|
|
151
|
+
"aria-hidden": true,
|
|
152
|
+
className: "animate-spin"
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export { Button$1 as Button };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ButtonPropsT, HoldStateT, HoldToConfirmOptionsI, buttonHoldFillVariants, buttonVariants } from "./types.js";
|
|
2
|
+
import { Button } from "./button.js";
|
|
3
|
+
import { useHoldToConfirm } from "./use-hold-to-confirm.js";
|
|
4
|
+
export { Button, type ButtonPropsT, type HoldStateT, type HoldToConfirmOptionsI, buttonHoldFillVariants, buttonVariants, useHoldToConfirm };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { PartPropsT } from "../../lib/part-props.js";
|
|
2
|
+
import { VariantProps } from "class-variance-authority";
|
|
3
|
+
import { Button } from "@base-ui/react/button";
|
|
4
|
+
import { MouseEvent, ReactNode, Ref } from "react";
|
|
5
|
+
/**
|
|
6
|
+
* Стили кнопки: вариант оформления и размер.
|
|
7
|
+
* Экспортируются, чтобы оформить кнопкой другой элемент: buttonVariants({ variant: 'outline' }).
|
|
8
|
+
*
|
|
9
|
+
* Отключённая кнопка (disabled или aria-disabled у render) не теряет события мыши, чтобы показать
|
|
10
|
+
* курсор not-allowed (в загрузке — progress): нажатие блокирует сам disabled или обработчик Button,
|
|
11
|
+
* а цвета наведения у каждого варианта возвращаются к обычным.
|
|
12
|
+
*/
|
|
13
|
+
export declare const buttonVariants: (props?: ({
|
|
14
|
+
variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "ghost" | null | undefined;
|
|
15
|
+
size?: "default" | "sm" | "xs" | "icon" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
16
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Варианты оформления и размеры кнопки
|
|
19
|
+
*/
|
|
20
|
+
export type ButtonVariantsT = VariantProps<typeof buttonVariants>;
|
|
21
|
+
/**
|
|
22
|
+
* Стили заливки удержания: растёт слева направо поверх кнопки, цвет контрастен варианту
|
|
23
|
+
*/
|
|
24
|
+
export declare const buttonHoldFillVariants: (props?: ({
|
|
25
|
+
variant?: "link" | "default" | "secondary" | "destructive" | "outline" | "ghost" | null | undefined;
|
|
26
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
27
|
+
/**
|
|
28
|
+
* Пропсы кнопки
|
|
29
|
+
*/
|
|
30
|
+
export type ButtonPropsT = PartPropsT<Omit<Button.Props, 'onClick' | 'disabled' | 'ref'>> & {
|
|
31
|
+
/** Оформление: основная, контурная, второстепенная, без фона, опасное действие или ссылка */
|
|
32
|
+
variant?: ButtonVariantsT['variant'];
|
|
33
|
+
/** Размер: xs, sm, default, lg — для кнопки с текстом; icon-xs, icon-sm, icon, icon-lg — для кнопки с одной иконкой */
|
|
34
|
+
size?: ButtonVariantsT['size'];
|
|
35
|
+
/** Отключённое состояние: кнопка не нажимается */
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
/** Состояние загрузки: спиннер вместо иконки в начале, кнопка отключена */
|
|
38
|
+
loading?: boolean;
|
|
39
|
+
/** Текст для скринридера во время загрузки, по умолчанию «Загрузка…» */
|
|
40
|
+
loadingLabel?: string;
|
|
41
|
+
/** Нажатие на кнопку. Не вызывается, пока кнопка отключена или в состоянии загрузки */
|
|
42
|
+
onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
43
|
+
/** Подтверждение удержанием: действие срабатывает, только если держать кнопку holdDuration мс */
|
|
44
|
+
holdToConfirm?: boolean;
|
|
45
|
+
/** Сколько держать кнопку до подтверждения, мс. По умолчанию 1500 */
|
|
46
|
+
holdDuration?: number;
|
|
47
|
+
/** Через сколько мс после подтверждения кнопка вернётся в исходный вид; false — останется. По умолчанию 2000 */
|
|
48
|
+
holdResetDelay?: number | false;
|
|
49
|
+
/** Кнопку удержали до конца */
|
|
50
|
+
onConfirm?: () => void;
|
|
51
|
+
/** Кнопку отпустили раньше: доля пройденного пути от 0 до 1 */
|
|
52
|
+
onHoldCancel?: (progress: number) => void;
|
|
53
|
+
/** Содержимое после подтверждения, по умолчанию галочка и «Готово» */
|
|
54
|
+
confirmedContent?: ReactNode;
|
|
55
|
+
/** Подсказка для скринридера, по умолчанию «Нажмите и удерживайте, чтобы подтвердить» */
|
|
56
|
+
holdLabel?: string;
|
|
57
|
+
/** Ссылка на элемент кнопки */
|
|
58
|
+
ref?: Ref<HTMLElement>;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Состояние удержания: ожидание, удерживают, подтверждено, возврат к ожиданию
|
|
62
|
+
*/
|
|
63
|
+
export type HoldStateT = 'idle' | 'holding' | 'confirmed' | 'resetting';
|
|
64
|
+
/**
|
|
65
|
+
* Настройки удержания для подтверждения
|
|
66
|
+
* @property enabled - Включить удержание; false — обработчики ничего не делают
|
|
67
|
+
* @property duration - Сколько держать до подтверждения, мс
|
|
68
|
+
* @property resetDelay - Через сколько мс после подтверждения вернуться к ожиданию; false — остаться
|
|
69
|
+
* @property disabled - Не реагировать на нажатия
|
|
70
|
+
* @property onConfirm - Удержали до конца
|
|
71
|
+
* @property onCancel - Отпустили раньше: доля пройденного пути от 0 до 1
|
|
72
|
+
*/
|
|
73
|
+
export interface HoldToConfirmOptionsI {
|
|
74
|
+
enabled: boolean;
|
|
75
|
+
duration: number;
|
|
76
|
+
resetDelay: number | false;
|
|
77
|
+
disabled: boolean;
|
|
78
|
+
onConfirm?: () => void;
|
|
79
|
+
onCancel?: (progress: number) => void;
|
|
80
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
// src/components/button/types.ts
|
|
3
|
+
/**
|
|
4
|
+
* Стили кнопки: вариант оформления и размер.
|
|
5
|
+
* Экспортируются, чтобы оформить кнопкой другой элемент: buttonVariants({ variant: 'outline' }).
|
|
6
|
+
*
|
|
7
|
+
* Отключённая кнопка (disabled или aria-disabled у render) не теряет события мыши, чтобы показать
|
|
8
|
+
* курсор not-allowed (в загрузке — progress): нажатие блокирует сам disabled или обработчик Button,
|
|
9
|
+
* а цвета наведения у каждого варианта возвращаются к обычным.
|
|
10
|
+
*/
|
|
11
|
+
const buttonVariants = cva([
|
|
12
|
+
"group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding",
|
|
13
|
+
"text-sm font-medium whitespace-nowrap transition-all outline-none select-none",
|
|
14
|
+
"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50",
|
|
15
|
+
"active:not-aria-[haspopup]:not-aria-disabled:translate-y-px",
|
|
16
|
+
"cursor-pointer disabled:cursor-not-allowed aria-disabled:cursor-not-allowed",
|
|
17
|
+
"data-loading:disabled:cursor-progress data-loading:aria-disabled:cursor-progress",
|
|
18
|
+
"disabled:opacity-50 aria-disabled:opacity-50",
|
|
19
|
+
"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20",
|
|
20
|
+
"dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
21
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-4",
|
|
22
|
+
"[&>[data-slot=button-spinner]+svg]:hidden"
|
|
23
|
+
], {
|
|
24
|
+
variants: {
|
|
25
|
+
variant: {
|
|
26
|
+
default: ["bg-primary text-primary-foreground hover:bg-primary/80", "disabled:hover:bg-primary aria-disabled:hover:bg-primary"],
|
|
27
|
+
outline: [
|
|
28
|
+
"border-border bg-background hover:bg-muted hover:text-foreground",
|
|
29
|
+
"aria-expanded:bg-muted aria-expanded:text-foreground",
|
|
30
|
+
"dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
|
|
31
|
+
"disabled:hover:bg-background disabled:hover:text-inherit",
|
|
32
|
+
"aria-disabled:hover:bg-background aria-disabled:hover:text-inherit",
|
|
33
|
+
"dark:disabled:hover:bg-input/30 dark:aria-disabled:hover:bg-input/30"
|
|
34
|
+
],
|
|
35
|
+
secondary: [
|
|
36
|
+
"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]",
|
|
37
|
+
"aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
|
|
38
|
+
"disabled:hover:bg-secondary aria-disabled:hover:bg-secondary"
|
|
39
|
+
],
|
|
40
|
+
ghost: [
|
|
41
|
+
"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground",
|
|
42
|
+
"dark:hover:bg-muted/50",
|
|
43
|
+
"disabled:hover:bg-transparent disabled:hover:text-inherit",
|
|
44
|
+
"aria-disabled:hover:bg-transparent aria-disabled:hover:text-inherit"
|
|
45
|
+
],
|
|
46
|
+
destructive: [
|
|
47
|
+
"bg-destructive/10 text-destructive hover:bg-destructive/20",
|
|
48
|
+
"focus-visible:border-destructive/40 focus-visible:ring-destructive/20",
|
|
49
|
+
"dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
|
|
50
|
+
"disabled:hover:bg-destructive/10 aria-disabled:hover:bg-destructive/10",
|
|
51
|
+
"dark:disabled:hover:bg-destructive/20 dark:aria-disabled:hover:bg-destructive/20"
|
|
52
|
+
],
|
|
53
|
+
link: ["text-primary underline-offset-4 hover:underline", "disabled:hover:no-underline aria-disabled:hover:no-underline"]
|
|
54
|
+
},
|
|
55
|
+
size: {
|
|
56
|
+
default: ["h-8 gap-1.5 px-2.5", "has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2"],
|
|
57
|
+
xs: [
|
|
58
|
+
"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs",
|
|
59
|
+
"in-data-[slot=button-group]:rounded-lg",
|
|
60
|
+
"has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
|
|
61
|
+
"[&_svg:not([class*=size-])]:size-3"
|
|
62
|
+
],
|
|
63
|
+
sm: [
|
|
64
|
+
"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem]",
|
|
65
|
+
"in-data-[slot=button-group]:rounded-lg",
|
|
66
|
+
"has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
|
|
67
|
+
"[&_svg:not([class*=size-])]:size-3.5"
|
|
68
|
+
],
|
|
69
|
+
lg: ["h-9 gap-1.5 px-2.5", "has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2"],
|
|
70
|
+
icon: "size-8",
|
|
71
|
+
"icon-xs": ["size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg", "[&_svg:not([class*=size-])]:size-3"],
|
|
72
|
+
"icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
|
|
73
|
+
"icon-lg": "size-9"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
defaultVariants: {
|
|
77
|
+
variant: "default",
|
|
78
|
+
size: "default"
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* Стили заливки удержания: растёт слева направо поверх кнопки, цвет контрастен варианту
|
|
83
|
+
*/
|
|
84
|
+
const buttonHoldFillVariants = cva([
|
|
85
|
+
"pointer-events-none absolute -inset-px flex items-center justify-center gap-[inherit] rounded-[inherit]",
|
|
86
|
+
"border border-transparent [clip-path:inset(0_calc((1-var(--hold-progress,0))*100%)_0_0)]",
|
|
87
|
+
"transition-opacity duration-200 group-data-[hold=resetting]/button:opacity-0"
|
|
88
|
+
], {
|
|
89
|
+
variants: { variant: {
|
|
90
|
+
default: "bg-primary-foreground text-primary",
|
|
91
|
+
outline: "bg-primary text-primary-foreground",
|
|
92
|
+
secondary: "bg-primary text-primary-foreground",
|
|
93
|
+
ghost: "bg-primary text-primary-foreground",
|
|
94
|
+
destructive: "bg-destructive text-white",
|
|
95
|
+
link: "bg-primary text-primary-foreground"
|
|
96
|
+
} },
|
|
97
|
+
defaultVariants: { variant: "default" }
|
|
98
|
+
});
|
|
99
|
+
export { buttonHoldFillVariants, buttonVariants };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HoldStateT, HoldToConfirmOptionsI } from "./types.js";
|
|
2
|
+
import { KeyboardEvent, PointerEvent } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Удержание для подтверждения: пока держат кнопку (мышью, касанием, пробелом или Enter), заливка
|
|
5
|
+
* растёт до конца и вызывает onConfirm; отпустили раньше — заливка откатывается. Прогресс пишется
|
|
6
|
+
* в CSS-переменную --hold-progress (0…1) на элементе из ref, без перерисовки React
|
|
7
|
+
* @param options - настройки
|
|
8
|
+
* @returns состояние, ref для элемента и обработчики событий
|
|
9
|
+
*/
|
|
10
|
+
export declare function useHoldToConfirm({ enabled, duration, resetDelay, disabled, onConfirm, onCancel }: HoldToConfirmOptionsI): {
|
|
11
|
+
state: HoldStateT;
|
|
12
|
+
setElement: (node: HTMLElement | null) => void;
|
|
13
|
+
handlers: {
|
|
14
|
+
onPointerDown: (event: PointerEvent<HTMLElement>) => void;
|
|
15
|
+
onPointerUp: () => void;
|
|
16
|
+
onPointerCancel: () => void;
|
|
17
|
+
onLostPointerCapture: () => void;
|
|
18
|
+
onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
|
|
19
|
+
onKeyUp: (event: KeyboardEvent<HTMLElement>) => void;
|
|
20
|
+
onBlur: () => void;
|
|
21
|
+
onContextMenu: (event: {
|
|
22
|
+
preventDefault: () => void;
|
|
23
|
+
}) => void;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
// src/components/button/use-hold-to-confirm.ts
|
|
4
|
+
/** Длительность отката заливки после раннего отпускания, мс */
|
|
5
|
+
const CANCEL_DURATION = 350;
|
|
6
|
+
/** Длительность исчезновения заливки при возврате к ожиданию, мс */
|
|
7
|
+
const FADE_DURATION = 200;
|
|
8
|
+
/**
|
|
9
|
+
* Замедление к концу: откат заливки
|
|
10
|
+
* @param time - доля времени от 0 до 1
|
|
11
|
+
* @returns доля пути
|
|
12
|
+
*/
|
|
13
|
+
function easeOut(time) {
|
|
14
|
+
return 1 - (1 - time) ** 3;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Клавиша, которой нажимают кнопку
|
|
18
|
+
* @param key - клавиша
|
|
19
|
+
* @returns true для пробела и Enter
|
|
20
|
+
*/
|
|
21
|
+
function isHoldKey(key) {
|
|
22
|
+
return key === " " || key === "Enter";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Удержание для подтверждения: пока держат кнопку (мышью, касанием, пробелом или Enter), заливка
|
|
26
|
+
* растёт до конца и вызывает onConfirm; отпустили раньше — заливка откатывается. Прогресс пишется
|
|
27
|
+
* в CSS-переменную --hold-progress (0…1) на элементе из ref, без перерисовки React
|
|
28
|
+
* @param options - настройки
|
|
29
|
+
* @returns состояние, ref для элемента и обработчики событий
|
|
30
|
+
*/
|
|
31
|
+
function useHoldToConfirm({ enabled, duration, resetDelay, disabled, onConfirm, onCancel }) {
|
|
32
|
+
const [state, setState] = useState("idle");
|
|
33
|
+
const stateRef = useRef("idle");
|
|
34
|
+
const elementRef = useRef(null);
|
|
35
|
+
const progressRef = useRef(0);
|
|
36
|
+
/**
|
|
37
|
+
* Запомнить элемент кнопки: на нём обновляется прогресс удержания
|
|
38
|
+
* @param node - элемент или null при размонтировании
|
|
39
|
+
*/
|
|
40
|
+
const setElement = useCallback((node) => {
|
|
41
|
+
elementRef.current = node;
|
|
42
|
+
}, []);
|
|
43
|
+
const frameRef = useRef(0);
|
|
44
|
+
const timerRef = useRef(null);
|
|
45
|
+
const callbacksRef = useRef({
|
|
46
|
+
onConfirm,
|
|
47
|
+
onCancel
|
|
48
|
+
});
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
callbacksRef.current = {
|
|
51
|
+
onConfirm,
|
|
52
|
+
onCancel
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Сменить состояние
|
|
57
|
+
* @param next - новое состояние
|
|
58
|
+
*/
|
|
59
|
+
const updateState = (next) => {
|
|
60
|
+
stateRef.current = next;
|
|
61
|
+
setState(next);
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Записать прогресс в CSS-переменную
|
|
65
|
+
* @param value - доля от 0 до 1
|
|
66
|
+
*/
|
|
67
|
+
const setProgress = (value) => {
|
|
68
|
+
progressRef.current = value;
|
|
69
|
+
elementRef.current?.style.setProperty("--hold-progress", String(value));
|
|
70
|
+
};
|
|
71
|
+
/** Остановить анимацию и таймер */
|
|
72
|
+
const stopAll = () => {
|
|
73
|
+
cancelAnimationFrame(frameRef.current);
|
|
74
|
+
if (timerRef.current) {
|
|
75
|
+
clearTimeout(timerRef.current);
|
|
76
|
+
timerRef.current = null;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Плавно довести прогресс до значения
|
|
81
|
+
* @param to - целевая доля
|
|
82
|
+
* @param time - длительность, мс
|
|
83
|
+
* @param easing - кривая
|
|
84
|
+
* @param onDone - по окончании
|
|
85
|
+
*/
|
|
86
|
+
const animateProgress = (to, time, easing, onDone) => {
|
|
87
|
+
const from = progressRef.current;
|
|
88
|
+
const startedAt = performance.now();
|
|
89
|
+
/** Кадр анимации */
|
|
90
|
+
const tick = () => {
|
|
91
|
+
const elapsed = Math.min((performance.now() - startedAt) / time, 1);
|
|
92
|
+
setProgress(from + (to - from) * easing(elapsed));
|
|
93
|
+
if (elapsed < 1) {
|
|
94
|
+
frameRef.current = requestAnimationFrame(tick);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
onDone?.();
|
|
98
|
+
};
|
|
99
|
+
cancelAnimationFrame(frameRef.current);
|
|
100
|
+
frameRef.current = requestAnimationFrame(tick);
|
|
101
|
+
};
|
|
102
|
+
/** Вернуться к ожиданию: заливка гаснет, прогресс обнуляется */
|
|
103
|
+
const reset = () => {
|
|
104
|
+
updateState("resetting");
|
|
105
|
+
timerRef.current = setTimeout(() => {
|
|
106
|
+
setProgress(0);
|
|
107
|
+
updateState("idle");
|
|
108
|
+
}, FADE_DURATION);
|
|
109
|
+
};
|
|
110
|
+
/** Удержали до конца */
|
|
111
|
+
const confirm = () => {
|
|
112
|
+
updateState("confirmed");
|
|
113
|
+
callbacksRef.current.onConfirm?.();
|
|
114
|
+
if (resetDelay !== false) timerRef.current = setTimeout(reset, resetDelay);
|
|
115
|
+
};
|
|
116
|
+
/** Начали удерживать: заливка растёт с текущего места */
|
|
117
|
+
const start = () => {
|
|
118
|
+
if (!enabled || disabled || stateRef.current !== "idle") return;
|
|
119
|
+
stopAll();
|
|
120
|
+
updateState("holding");
|
|
121
|
+
const remaining = duration * (1 - progressRef.current);
|
|
122
|
+
animateProgress(1, remaining, (value) => value, confirm);
|
|
123
|
+
};
|
|
124
|
+
/** Отпустили раньше: заливка откатывается */
|
|
125
|
+
const cancel = () => {
|
|
126
|
+
if (stateRef.current !== "holding") return;
|
|
127
|
+
const reached = progressRef.current;
|
|
128
|
+
updateState("idle");
|
|
129
|
+
animateProgress(0, CANCEL_DURATION, easeOut);
|
|
130
|
+
callbacksRef.current.onCancel?.(reached);
|
|
131
|
+
};
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (disabled) cancel();
|
|
134
|
+
});
|
|
135
|
+
useEffect(() => stopAll, []);
|
|
136
|
+
return {
|
|
137
|
+
state,
|
|
138
|
+
setElement,
|
|
139
|
+
handlers: {
|
|
140
|
+
onPointerDown: (event) => {
|
|
141
|
+
if (event.button !== 0) return;
|
|
142
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
143
|
+
start();
|
|
144
|
+
},
|
|
145
|
+
onPointerUp: cancel,
|
|
146
|
+
onPointerCancel: cancel,
|
|
147
|
+
onLostPointerCapture: cancel,
|
|
148
|
+
onKeyDown: (event) => {
|
|
149
|
+
if (!isHoldKey(event.key)) return;
|
|
150
|
+
event.preventDefault();
|
|
151
|
+
if (!event.repeat) start();
|
|
152
|
+
},
|
|
153
|
+
onKeyUp: (event) => {
|
|
154
|
+
if (isHoldKey(event.key)) cancel();
|
|
155
|
+
},
|
|
156
|
+
onBlur: cancel,
|
|
157
|
+
onContextMenu: (event) => event.preventDefault()
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export { useHoldToConfirm };
|