@poppy-ui/vue 0.5.6 → 0.5.7-beta.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 +103 -0
- package/dist/ClassWrapper-BNZO3mhP.cjs +2 -0
- package/dist/ClassWrapper-BNZO3mhP.cjs.map +1 -0
- package/dist/ClassWrapper-DdnnHfAj.js +24 -0
- package/dist/ClassWrapper-DdnnHfAj.js.map +1 -0
- package/dist/Toast-BEnfZApB.cjs +2 -0
- package/dist/Toast-BEnfZApB.cjs.map +1 -0
- package/dist/Toast-BWTVE5_U.js +62 -0
- package/dist/Toast-BWTVE5_U.js.map +1 -0
- package/dist/_plugin-vue_export-helper-B3ysoDQm.js +8 -0
- package/dist/_plugin-vue_export-helper-BTmtiIyf.cjs +1 -0
- package/dist/build-class.util-Cp-ZBFgO.js +1730 -0
- package/dist/build-class.util-Cp-ZBFgO.js.map +1 -0
- package/dist/build-class.util-Lo1-M_t1.cjs +2 -0
- package/dist/build-class.util-Lo1-M_t1.cjs.map +1 -0
- package/dist/components/ClassWrapper.d.ts +27 -0
- package/dist/components/ClassWrapper.d.ts.map +1 -0
- package/dist/components/actions/button/Button.d.ts +18 -0
- package/dist/components/actions/button/Button.d.ts.map +1 -0
- package/dist/components/actions/button/button.context.d.ts +2 -0
- package/dist/components/actions/button/button.context.d.ts.map +1 -0
- package/dist/components/actions/button/button.props.d.ts +59 -0
- package/dist/components/actions/button/button.props.d.ts.map +1 -0
- package/dist/components/actions/button/button.types.d.ts +7 -0
- package/dist/components/actions/button/button.types.d.ts.map +1 -0
- package/dist/components/actions/dropdown/Dropdown.d.ts +25 -0
- package/dist/components/actions/dropdown/Dropdown.d.ts.map +1 -0
- package/dist/components/actions/dropdown/dropdown.context.d.ts +2 -0
- package/dist/components/actions/dropdown/dropdown.context.d.ts.map +1 -0
- package/dist/components/actions/dropdown/dropdown.props.d.ts +61 -0
- package/dist/components/actions/dropdown/dropdown.props.d.ts.map +1 -0
- package/dist/components/actions/dropdown/dropdown.types.d.ts +4 -0
- package/dist/components/actions/dropdown/dropdown.types.d.ts.map +1 -0
- package/dist/components/actions/fab/Fab.d.ts +16 -0
- package/dist/components/actions/fab/Fab.d.ts.map +1 -0
- package/dist/components/actions/fab/fab.context.d.ts +2 -0
- package/dist/components/actions/fab/fab.context.d.ts.map +1 -0
- package/dist/components/actions/fab/fab.props.d.ts +11 -0
- package/dist/components/actions/fab/fab.props.d.ts.map +1 -0
- package/dist/components/actions/fab/fab.types.d.ts +2 -0
- package/dist/components/actions/fab/fab.types.d.ts.map +1 -0
- package/dist/components/actions/modal/Modal.d.ts +39 -0
- package/dist/components/actions/modal/Modal.d.ts.map +1 -0
- package/dist/components/actions/modal/modal.context.d.ts +2 -0
- package/dist/components/actions/modal/modal.context.d.ts.map +1 -0
- package/dist/components/actions/modal/modal.props.d.ts +32 -0
- package/dist/components/actions/modal/modal.props.d.ts.map +1 -0
- package/dist/components/actions/modal/modal.types.d.ts +2 -0
- package/dist/components/actions/modal/modal.types.d.ts.map +1 -0
- package/dist/components/actions/public.d.ts +6 -0
- package/dist/components/actions/public.d.ts.map +1 -0
- package/dist/components/actions/public.es.js +319 -0
- package/dist/components/actions/public.es.js.map +1 -0
- package/dist/components/actions/public.types.d.ts +11 -0
- package/dist/components/actions/public.types.d.ts.map +1 -0
- package/dist/components/actions/public.umd.js +2 -0
- package/dist/components/actions/public.umd.js.map +1 -0
- package/dist/components/actions/swap/Swap.d.ts +36 -0
- package/dist/components/actions/swap/Swap.d.ts.map +1 -0
- package/dist/components/actions/swap/swap.context.d.ts +2 -0
- package/dist/components/actions/swap/swap.context.d.ts.map +1 -0
- package/dist/components/actions/swap/swap.props.d.ts +19 -0
- package/dist/components/actions/swap/swap.props.d.ts.map +1 -0
- package/dist/components/actions/swap/swap.types.d.ts +2 -0
- package/dist/components/actions/swap/swap.types.d.ts.map +1 -0
- package/dist/components/app/PoppyApp.d.ts +14 -0
- package/dist/components/app/PoppyApp.d.ts.map +1 -0
- package/dist/components/app/public.d.ts +2 -0
- package/dist/components/app/public.d.ts.map +1 -0
- package/dist/components/app/public.es.js +41 -0
- package/dist/components/app/public.es.js.map +1 -0
- package/dist/components/app/public.umd.js +2 -0
- package/dist/components/app/public.umd.js.map +1 -0
- package/dist/components/data/checkbox/Checkbox.d.ts +20 -0
- package/dist/components/data/checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/data/checkbox/checkbox.context.d.ts +2 -0
- package/dist/components/data/checkbox/checkbox.context.d.ts.map +1 -0
- package/dist/components/data/checkbox/checkbox.props.d.ts +35 -0
- package/dist/components/data/checkbox/checkbox.props.d.ts.map +1 -0
- package/dist/components/data/checkbox/checkbox.types.d.ts +4 -0
- package/dist/components/data/checkbox/checkbox.types.d.ts.map +1 -0
- package/dist/components/data/form/Form.d.ts +37 -0
- package/dist/components/data/form/Form.d.ts.map +1 -0
- package/dist/components/data/form/form.context.d.ts +53 -0
- package/dist/components/data/form/form.context.d.ts.map +1 -0
- package/dist/components/data/form/form.props.d.ts +28 -0
- package/dist/components/data/form/form.props.d.ts.map +1 -0
- package/dist/components/data/form/form.types.d.ts +25 -0
- package/dist/components/data/form/form.types.d.ts.map +1 -0
- package/dist/components/data/form-field/FormField.d.ts +26 -0
- package/dist/components/data/form-field/FormField.d.ts.map +1 -0
- package/dist/components/data/form-field/form-field.context.d.ts +37 -0
- package/dist/components/data/form-field/form-field.context.d.ts.map +1 -0
- package/dist/components/data/form-field/form-field.props.d.ts +30 -0
- package/dist/components/data/form-field/form-field.props.d.ts.map +1 -0
- package/dist/components/data/form-field/form-field.types.d.ts +2 -0
- package/dist/components/data/form-field/form-field.types.d.ts.map +1 -0
- package/dist/components/data/input/Input.d.ts +44 -0
- package/dist/components/data/input/Input.d.ts.map +1 -0
- package/dist/components/data/input/input.context.d.ts +2 -0
- package/dist/components/data/input/input.context.d.ts.map +1 -0
- package/dist/components/data/input/input.props.d.ts +73 -0
- package/dist/components/data/input/input.props.d.ts.map +1 -0
- package/dist/components/data/input/input.types.d.ts +6 -0
- package/dist/components/data/input/input.types.d.ts.map +1 -0
- package/dist/components/data/public.d.ts +11 -0
- package/dist/components/data/public.d.ts.map +1 -0
- package/dist/components/data/public.es.js +1355 -0
- package/dist/components/data/public.es.js.map +1 -0
- package/dist/components/data/public.types.d.ts +21 -0
- package/dist/components/data/public.types.d.ts.map +1 -0
- package/dist/components/data/public.umd.js +2 -0
- package/dist/components/data/public.umd.js.map +1 -0
- package/dist/components/data/radio/Radio.d.ts +20 -0
- package/dist/components/data/radio/Radio.d.ts.map +1 -0
- package/dist/components/data/radio/radio.context.d.ts +2 -0
- package/dist/components/data/radio/radio.context.d.ts.map +1 -0
- package/dist/components/data/radio/radio.props.d.ts +41 -0
- package/dist/components/data/radio/radio.props.d.ts.map +1 -0
- package/dist/components/data/radio/radio.types.d.ts +4 -0
- package/dist/components/data/radio/radio.types.d.ts.map +1 -0
- package/dist/components/data/rating/Rating.d.ts +23 -0
- package/dist/components/data/rating/Rating.d.ts.map +1 -0
- package/dist/components/data/rating/rating.context.d.ts +2 -0
- package/dist/components/data/rating/rating.context.d.ts.map +1 -0
- package/dist/components/data/rating/rating.props.d.ts +45 -0
- package/dist/components/data/rating/rating.props.d.ts.map +1 -0
- package/dist/components/data/rating/rating.types.d.ts +6 -0
- package/dist/components/data/rating/rating.types.d.ts.map +1 -0
- package/dist/components/data/select/Select.d.ts +48 -0
- package/dist/components/data/select/Select.d.ts.map +1 -0
- package/dist/components/data/select/select.context.d.ts +2 -0
- package/dist/components/data/select/select.context.d.ts.map +1 -0
- package/dist/components/data/select/select.props.d.ts +60 -0
- package/dist/components/data/select/select.props.d.ts.map +1 -0
- package/dist/components/data/select/select.types.d.ts +11 -0
- package/dist/components/data/select/select.types.d.ts.map +1 -0
- package/dist/components/data/slider/Slider.d.ts +26 -0
- package/dist/components/data/slider/Slider.d.ts.map +1 -0
- package/dist/components/data/slider/slider.context.d.ts +2 -0
- package/dist/components/data/slider/slider.context.d.ts.map +1 -0
- package/dist/components/data/slider/slider.props.d.ts +71 -0
- package/dist/components/data/slider/slider.props.d.ts.map +1 -0
- package/dist/components/data/slider/slider.types.d.ts +7 -0
- package/dist/components/data/slider/slider.types.d.ts.map +1 -0
- package/dist/components/data/textarea/Textarea.d.ts +44 -0
- package/dist/components/data/textarea/Textarea.d.ts.map +1 -0
- package/dist/components/data/textarea/textarea.context.d.ts +2 -0
- package/dist/components/data/textarea/textarea.context.d.ts.map +1 -0
- package/dist/components/data/textarea/textarea.props.d.ts +66 -0
- package/dist/components/data/textarea/textarea.props.d.ts.map +1 -0
- package/dist/components/data/textarea/textarea.types.d.ts +5 -0
- package/dist/components/data/textarea/textarea.types.d.ts.map +1 -0
- package/dist/components/data/toggle/Toggle.d.ts +28 -0
- package/dist/components/data/toggle/Toggle.d.ts.map +1 -0
- package/dist/components/data/toggle/toggle.context.d.ts +2 -0
- package/dist/components/data/toggle/toggle.context.d.ts.map +1 -0
- package/dist/components/data/toggle/toggle.props.d.ts +28 -0
- package/dist/components/data/toggle/toggle.props.d.ts.map +1 -0
- package/dist/components/data/toggle/toggle.types.d.ts +4 -0
- package/dist/components/data/toggle/toggle.types.d.ts.map +1 -0
- package/dist/components/display/accordion/Accordion.d.ts +42 -0
- package/dist/components/display/accordion/Accordion.d.ts.map +1 -0
- package/dist/components/display/accordion/AccordionItem.d.ts +35 -0
- package/dist/components/display/accordion/AccordionItem.d.ts.map +1 -0
- package/dist/components/display/accordion/accordion-item.context.d.ts +2 -0
- package/dist/components/display/accordion/accordion-item.context.d.ts.map +1 -0
- package/dist/components/display/accordion/accordion-item.props.d.ts +19 -0
- package/dist/components/display/accordion/accordion-item.props.d.ts.map +1 -0
- package/dist/components/display/accordion/accordion-item.types.d.ts +2 -0
- package/dist/components/display/accordion/accordion-item.types.d.ts.map +1 -0
- package/dist/components/display/accordion/accordion.context.d.ts +9 -0
- package/dist/components/display/accordion/accordion.context.d.ts.map +1 -0
- package/dist/components/display/accordion/accordion.props.d.ts +15 -0
- package/dist/components/display/accordion/accordion.props.d.ts.map +1 -0
- package/dist/components/display/avatar/Avatar.d.ts +14 -0
- package/dist/components/display/avatar/Avatar.d.ts.map +1 -0
- package/dist/components/display/avatar/avatar.context.d.ts +2 -0
- package/dist/components/display/avatar/avatar.context.d.ts.map +1 -0
- package/dist/components/display/avatar/avatar.props.d.ts +46 -0
- package/dist/components/display/avatar/avatar.props.d.ts.map +1 -0
- package/dist/components/display/avatar/avatar.types.d.ts +5 -0
- package/dist/components/display/avatar/avatar.types.d.ts.map +1 -0
- package/dist/components/display/badge/Badge.d.ts +12 -0
- package/dist/components/display/badge/Badge.d.ts.map +1 -0
- package/dist/components/display/badge/badge.context.d.ts +2 -0
- package/dist/components/display/badge/badge.context.d.ts.map +1 -0
- package/dist/components/display/badge/badge.props.d.ts +20 -0
- package/dist/components/display/badge/badge.props.d.ts.map +1 -0
- package/dist/components/display/badge/badge.types.d.ts +5 -0
- package/dist/components/display/badge/badge.types.d.ts.map +1 -0
- package/dist/components/display/card/Card.d.ts +12 -0
- package/dist/components/display/card/Card.d.ts.map +1 -0
- package/dist/components/display/card/CardActions.d.ts +12 -0
- package/dist/components/display/card/CardActions.d.ts.map +1 -0
- package/dist/components/display/card/CardBody.d.ts +14 -0
- package/dist/components/display/card/CardBody.d.ts.map +1 -0
- package/dist/components/display/card/CardTitle.d.ts +14 -0
- package/dist/components/display/card/CardTitle.d.ts.map +1 -0
- package/dist/components/display/card/card-actions.context.d.ts +2 -0
- package/dist/components/display/card/card-actions.context.d.ts.map +1 -0
- package/dist/components/display/card/card-actions.props.d.ts +15 -0
- package/dist/components/display/card/card-actions.props.d.ts.map +1 -0
- package/dist/components/display/card/card-actions.types.d.ts +2 -0
- package/dist/components/display/card/card-actions.types.d.ts.map +1 -0
- package/dist/components/display/card/card.context.d.ts +2 -0
- package/dist/components/display/card/card.context.d.ts.map +1 -0
- package/dist/components/display/card/card.props.d.ts +31 -0
- package/dist/components/display/card/card.props.d.ts.map +1 -0
- package/dist/components/display/card/card.types.d.ts +4 -0
- package/dist/components/display/card/card.types.d.ts.map +1 -0
- package/dist/components/display/carousel/Carousel.d.ts +16 -0
- package/dist/components/display/carousel/Carousel.d.ts.map +1 -0
- package/dist/components/display/carousel/carousel.context.d.ts +2 -0
- package/dist/components/display/carousel/carousel.context.d.ts.map +1 -0
- package/dist/components/display/carousel/carousel.props.d.ts +53 -0
- package/dist/components/display/carousel/carousel.props.d.ts.map +1 -0
- package/dist/components/display/carousel/carousel.types.d.ts +3 -0
- package/dist/components/display/carousel/carousel.types.d.ts.map +1 -0
- package/dist/components/display/chat/Chat.d.ts +20 -0
- package/dist/components/display/chat/Chat.d.ts.map +1 -0
- package/dist/components/display/chat/chat.context.d.ts +2 -0
- package/dist/components/display/chat/chat.context.d.ts.map +1 -0
- package/dist/components/display/chat/chat.props.d.ts +18 -0
- package/dist/components/display/chat/chat.props.d.ts.map +1 -0
- package/dist/components/display/chat/chat.types.d.ts +3 -0
- package/dist/components/display/chat/chat.types.d.ts.map +1 -0
- package/dist/components/display/countdown/Countdown.d.ts +38 -0
- package/dist/components/display/countdown/Countdown.d.ts.map +1 -0
- package/dist/components/display/countdown/countdown.props.d.ts +23 -0
- package/dist/components/display/countdown/countdown.props.d.ts.map +1 -0
- package/dist/components/display/countdown/countdown.types.d.ts +23 -0
- package/dist/components/display/countdown/countdown.types.d.ts.map +1 -0
- package/dist/components/display/diff/Diff.d.ts +16 -0
- package/dist/components/display/diff/Diff.d.ts.map +1 -0
- package/dist/components/display/hover-3d/Hover3d.d.ts +12 -0
- package/dist/components/display/hover-3d/Hover3d.d.ts.map +1 -0
- package/dist/components/display/hover-3d/hover-3d.props.d.ts +9 -0
- package/dist/components/display/hover-3d/hover-3d.props.d.ts.map +1 -0
- package/dist/components/display/hover-gallery/HoverGallery.d.ts +14 -0
- package/dist/components/display/hover-gallery/HoverGallery.d.ts.map +1 -0
- package/dist/components/display/kbd/Kbd.d.ts +12 -0
- package/dist/components/display/kbd/Kbd.d.ts.map +1 -0
- package/dist/components/display/kbd/kbd.context.d.ts +2 -0
- package/dist/components/display/kbd/kbd.context.d.ts.map +1 -0
- package/dist/components/display/kbd/kbd.props.d.ts +12 -0
- package/dist/components/display/kbd/kbd.props.d.ts.map +1 -0
- package/dist/components/display/kbd/kbd.types.d.ts +3 -0
- package/dist/components/display/kbd/kbd.types.d.ts.map +1 -0
- package/dist/components/display/list/List.d.ts +17 -0
- package/dist/components/display/list/List.d.ts.map +1 -0
- package/dist/components/display/list/ListItem.d.ts +22 -0
- package/dist/components/display/list/ListItem.d.ts.map +1 -0
- package/dist/components/display/list/list-item.props.d.ts +17 -0
- package/dist/components/display/list/list-item.props.d.ts.map +1 -0
- package/dist/components/display/list/list.props.d.ts +8 -0
- package/dist/components/display/list/list.props.d.ts.map +1 -0
- package/dist/components/display/public.d.ts +19 -0
- package/dist/components/display/public.d.ts.map +1 -0
- package/dist/components/display/public.es.js +2 -0
- package/dist/components/display/public.types.d.ts +24 -0
- package/dist/components/display/public.types.d.ts.map +1 -0
- package/dist/components/display/public.umd.js +1 -0
- package/dist/components/display/status/Status.d.ts +5 -0
- package/dist/components/display/status/Status.d.ts.map +1 -0
- package/dist/components/display/status/status.context.d.ts +2 -0
- package/dist/components/display/status/status.context.d.ts.map +1 -0
- package/dist/components/display/status/status.props.d.ts +27 -0
- package/dist/components/display/status/status.props.d.ts.map +1 -0
- package/dist/components/display/status/status.types.d.ts +5 -0
- package/dist/components/display/status/status.types.d.ts.map +1 -0
- package/dist/components/feedback/alert/Alert.d.ts +14 -0
- package/dist/components/feedback/alert/Alert.d.ts.map +1 -0
- package/dist/components/feedback/alert/alert.context.d.ts +2 -0
- package/dist/components/feedback/alert/alert.context.d.ts.map +1 -0
- package/dist/components/feedback/alert/alert.props.d.ts +27 -0
- package/dist/components/feedback/alert/alert.props.d.ts.map +1 -0
- package/dist/components/feedback/alert/alert.types.d.ts +4 -0
- package/dist/components/feedback/alert/alert.types.d.ts.map +1 -0
- package/dist/components/feedback/loading/Loading.d.ts +5 -0
- package/dist/components/feedback/loading/Loading.d.ts.map +1 -0
- package/dist/components/feedback/loading/loading.context.d.ts +2 -0
- package/dist/components/feedback/loading/loading.context.d.ts.map +1 -0
- package/dist/components/feedback/loading/loading.props.d.ts +23 -0
- package/dist/components/feedback/loading/loading.props.d.ts.map +1 -0
- package/dist/components/feedback/loading/loading.types.d.ts +5 -0
- package/dist/components/feedback/loading/loading.types.d.ts.map +1 -0
- package/dist/components/feedback/progress/Progress.d.ts +5 -0
- package/dist/components/feedback/progress/Progress.d.ts.map +1 -0
- package/dist/components/feedback/progress/progress.context.d.ts +2 -0
- package/dist/components/feedback/progress/progress.context.d.ts.map +1 -0
- package/dist/components/feedback/progress/progress.props.d.ts +29 -0
- package/dist/components/feedback/progress/progress.props.d.ts.map +1 -0
- package/dist/components/feedback/progress/progress.types.d.ts +2 -0
- package/dist/components/feedback/progress/progress.types.d.ts.map +1 -0
- package/dist/components/feedback/public.d.ts +6 -0
- package/dist/components/feedback/public.d.ts.map +1 -0
- package/dist/components/feedback/public.es.js +129 -0
- package/dist/components/feedback/public.es.js.map +1 -0
- package/dist/components/feedback/public.types.d.ts +13 -0
- package/dist/components/feedback/public.types.d.ts.map +1 -0
- package/dist/components/feedback/public.umd.js +2 -0
- package/dist/components/feedback/public.umd.js.map +1 -0
- package/dist/components/feedback/radial-progress/radial-progress.context.d.ts +2 -0
- package/dist/components/feedback/radial-progress/radial-progress.context.d.ts.map +1 -0
- package/dist/components/feedback/radial-progress/radial-progress.props.d.ts +32 -0
- package/dist/components/feedback/radial-progress/radial-progress.props.d.ts.map +1 -0
- package/dist/components/feedback/radial-progress/radial-progress.types.d.ts +2 -0
- package/dist/components/feedback/radial-progress/radial-progress.types.d.ts.map +1 -0
- package/dist/components/feedback/toast/Toast.d.ts +12 -0
- package/dist/components/feedback/toast/Toast.d.ts.map +1 -0
- package/dist/components/feedback/toast/toast.context.d.ts +9 -0
- package/dist/components/feedback/toast/toast.context.d.ts.map +1 -0
- package/dist/components/feedback/toast/toast.props.d.ts +31 -0
- package/dist/components/feedback/toast/toast.props.d.ts.map +1 -0
- package/dist/components/feedback/toast/toast.types.d.ts +5 -0
- package/dist/components/feedback/toast/toast.types.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/Tooltip.d.ts +14 -0
- package/dist/components/feedback/tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/tooltip.context.d.ts +2 -0
- package/dist/components/feedback/tooltip/tooltip.context.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/tooltip.props.d.ts +39 -0
- package/dist/components/feedback/tooltip/tooltip.props.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/tooltip.types.d.ts +3 -0
- package/dist/components/feedback/tooltip/tooltip.types.d.ts.map +1 -0
- package/dist/components/layout/divider/Divider.d.ts +12 -0
- package/dist/components/layout/divider/Divider.d.ts.map +1 -0
- package/dist/components/layout/divider/divider.context.d.ts +2 -0
- package/dist/components/layout/divider/divider.context.d.ts.map +1 -0
- package/dist/components/layout/divider/divider.props.d.ts +26 -0
- package/dist/components/layout/divider/divider.props.d.ts.map +1 -0
- package/dist/components/layout/divider/divider.types.d.ts +4 -0
- package/dist/components/layout/divider/divider.types.d.ts.map +1 -0
- package/dist/components/layout/drawer/Drawer.d.ts +39 -0
- package/dist/components/layout/drawer/Drawer.d.ts.map +1 -0
- package/dist/components/layout/drawer/drawer.context.d.ts +2 -0
- package/dist/components/layout/drawer/drawer.context.d.ts.map +1 -0
- package/dist/components/layout/drawer/drawer.props.d.ts +28 -0
- package/dist/components/layout/drawer/drawer.props.d.ts.map +1 -0
- package/dist/components/layout/drawer/drawer.types.d.ts +6 -0
- package/dist/components/layout/drawer/drawer.types.d.ts.map +1 -0
- package/dist/components/layout/indicator/Indicator.d.ts +14 -0
- package/dist/components/layout/indicator/Indicator.d.ts.map +1 -0
- package/dist/components/layout/indicator/indicator.context.d.ts +2 -0
- package/dist/components/layout/indicator/indicator.context.d.ts.map +1 -0
- package/dist/components/layout/indicator/indicator.props.d.ts +29 -0
- package/dist/components/layout/indicator/indicator.props.d.ts.map +1 -0
- package/dist/components/layout/indicator/indicator.types.d.ts +3 -0
- package/dist/components/layout/indicator/indicator.types.d.ts.map +1 -0
- package/dist/components/layout/join/Join.d.ts +12 -0
- package/dist/components/layout/join/Join.d.ts.map +1 -0
- package/dist/components/layout/join/join.context.d.ts +2 -0
- package/dist/components/layout/join/join.context.d.ts.map +1 -0
- package/dist/components/layout/join/join.props.d.ts +14 -0
- package/dist/components/layout/join/join.props.d.ts.map +1 -0
- package/dist/components/layout/join/join.types.d.ts +2 -0
- package/dist/components/layout/join/join.types.d.ts.map +1 -0
- package/dist/components/layout/mask/Mask.d.ts +12 -0
- package/dist/components/layout/mask/Mask.d.ts.map +1 -0
- package/dist/components/layout/mask/mask.context.d.ts +2 -0
- package/dist/components/layout/mask/mask.context.d.ts.map +1 -0
- package/dist/components/layout/mask/mask.props.d.ts +38 -0
- package/dist/components/layout/mask/mask.props.d.ts.map +1 -0
- package/dist/components/layout/mask/mask.types.d.ts +3 -0
- package/dist/components/layout/mask/mask.types.d.ts.map +1 -0
- package/dist/components/layout/public.d.ts +7 -0
- package/dist/components/layout/public.d.ts.map +1 -0
- package/dist/components/layout/public.es.js +207 -0
- package/dist/components/layout/public.es.js.map +1 -0
- package/dist/components/layout/public.types.d.ts +13 -0
- package/dist/components/layout/public.types.d.ts.map +1 -0
- package/dist/components/layout/public.umd.js +2 -0
- package/dist/components/layout/public.umd.js.map +1 -0
- package/dist/components/layout/stack/Stack.d.ts +12 -0
- package/dist/components/layout/stack/Stack.d.ts.map +1 -0
- package/dist/components/layout/stack/stack.context.d.ts +2 -0
- package/dist/components/layout/stack/stack.context.d.ts.map +1 -0
- package/dist/components/layout/stack/stack.props.d.ts +12 -0
- package/dist/components/layout/stack/stack.props.d.ts.map +1 -0
- package/dist/components/layout/stack/stack.types.d.ts +2 -0
- package/dist/components/layout/stack/stack.types.d.ts.map +1 -0
- package/dist/components/navigation/breadcrumbs/Breadcrumbs.d.ts +5 -0
- package/dist/components/navigation/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.context.d.ts +2 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.context.d.ts.map +1 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.props.d.ts +17 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.props.d.ts.map +1 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.types.d.ts +11 -0
- package/dist/components/navigation/breadcrumbs/breadcrumbs.types.d.ts.map +1 -0
- package/dist/components/navigation/dock/Dock.d.ts +12 -0
- package/dist/components/navigation/dock/Dock.d.ts.map +1 -0
- package/dist/components/navigation/dock/DockItem.d.ts +5 -0
- package/dist/components/navigation/dock/DockItem.d.ts.map +1 -0
- package/dist/components/navigation/dock/dock.context.d.ts +3 -0
- package/dist/components/navigation/dock/dock.context.d.ts.map +1 -0
- package/dist/components/navigation/dock/dock.props.d.ts +30 -0
- package/dist/components/navigation/dock/dock.props.d.ts.map +1 -0
- package/dist/components/navigation/dock/dock.types.d.ts +3 -0
- package/dist/components/navigation/dock/dock.types.d.ts.map +1 -0
- package/dist/components/navigation/link/Link.d.ts +12 -0
- package/dist/components/navigation/link/Link.d.ts.map +1 -0
- package/dist/components/navigation/link/link.context.d.ts +2 -0
- package/dist/components/navigation/link/link.context.d.ts.map +1 -0
- package/dist/components/navigation/link/link.props.d.ts +22 -0
- package/dist/components/navigation/link/link.props.d.ts.map +1 -0
- package/dist/components/navigation/link/link.types.d.ts +2 -0
- package/dist/components/navigation/link/link.types.d.ts.map +1 -0
- package/dist/components/navigation/menu/Menu.d.ts +12 -0
- package/dist/components/navigation/menu/Menu.d.ts.map +1 -0
- package/dist/components/navigation/menu/menu.context.d.ts +3 -0
- package/dist/components/navigation/menu/menu.context.d.ts.map +1 -0
- package/dist/components/navigation/menu/menu.props.d.ts +62 -0
- package/dist/components/navigation/menu/menu.props.d.ts.map +1 -0
- package/dist/components/navigation/menu/menu.types.d.ts +4 -0
- package/dist/components/navigation/menu/menu.types.d.ts.map +1 -0
- package/dist/components/navigation/public.d.ts +6 -0
- package/dist/components/navigation/public.d.ts.map +1 -0
- package/dist/components/navigation/public.es.js +128 -0
- package/dist/components/navigation/public.es.js.map +1 -0
- package/dist/components/navigation/public.types.d.ts +9 -0
- package/dist/components/navigation/public.types.d.ts.map +1 -0
- package/dist/components/navigation/public.umd.js +2 -0
- package/dist/components/navigation/public.umd.js.map +1 -0
- package/dist/composables/public.d.ts +4 -0
- package/dist/composables/public.d.ts.map +1 -0
- package/dist/composables/public.es.js +12 -0
- package/dist/composables/public.es.js.map +1 -0
- package/dist/composables/public.umd.js +2 -0
- package/dist/composables/public.umd.js.map +1 -0
- package/dist/composables/use-component-config.d.ts +27 -0
- package/dist/composables/use-component-config.d.ts.map +1 -0
- package/dist/composables/use-config.d.ts +2 -0
- package/dist/composables/use-config.d.ts.map +1 -0
- package/dist/composables/use-form-field.d.ts +24 -0
- package/dist/composables/use-form-field.d.ts.map +1 -0
- package/dist/composables/use-select-counter.d.ts +13 -0
- package/dist/composables/use-select-counter.d.ts.map +1 -0
- package/dist/composables/use-toast.d.ts +36 -0
- package/dist/composables/use-toast.d.ts.map +1 -0
- package/dist/favicon.svg +1 -0
- package/dist/icons.svg +24 -0
- package/dist/is-true-B9ixxcRp.js +8 -0
- package/dist/is-true-B9ixxcRp.js.map +1 -0
- package/dist/is-true-D7MXJ1b7.cjs +2 -0
- package/dist/is-true-D7MXJ1b7.cjs.map +1 -0
- package/dist/plugin-vue.d.ts +33 -0
- package/dist/plugin-vue.d.ts.map +1 -0
- package/dist/public-CsUi4LK8.cjs +2 -0
- package/dist/public-CsUi4LK8.cjs.map +1 -0
- package/dist/public-D8Z0iHnm.js +563 -0
- package/dist/public-D8Z0iHnm.js.map +1 -0
- package/dist/public.d.ts +9 -0
- package/dist/public.d.ts.map +1 -0
- package/dist/public.es.js +15 -0
- package/dist/public.es.js.map +1 -0
- package/dist/public.umd.js +2 -0
- package/dist/public.umd.js.map +1 -0
- package/dist/symbol-6E8gXxBa.cjs +2 -0
- package/dist/symbol-6E8gXxBa.cjs.map +1 -0
- package/dist/symbol-Dy7mXgB5.js +14 -0
- package/dist/symbol-Dy7mXgB5.js.map +1 -0
- package/dist/symbol.d.ts +6 -0
- package/dist/symbol.d.ts.map +1 -0
- package/dist/types/config.type.d.ts +85 -0
- package/dist/types/config.type.d.ts.map +1 -0
- package/dist/types/public.d.ts +4 -0
- package/dist/types/public.d.ts.map +1 -0
- package/dist/types/public.es.js +0 -0
- package/dist/types/public.umd.js +1 -0
- package/dist/types/size.type.d.ts +2 -0
- package/dist/types/size.type.d.ts.map +1 -0
- package/dist/types/utils.type.d.ts +6 -0
- package/dist/types/utils.type.d.ts.map +1 -0
- package/dist/use-component-config-DX0jSicI.cjs +2 -0
- package/dist/use-component-config-DX0jSicI.cjs.map +1 -0
- package/dist/use-component-config-DfXvZ0-o.js +20 -0
- package/dist/use-component-config-DfXvZ0-o.js.map +1 -0
- package/dist/use-form-field-CHsU-LtQ.js +57 -0
- package/dist/use-form-field-CHsU-LtQ.js.map +1 -0
- package/dist/use-form-field-Zw9_0CVq.cjs +2 -0
- package/dist/use-form-field-Zw9_0CVq.cjs.map +1 -0
- package/dist/utils/build-class.util.d.ts +4 -0
- package/dist/utils/build-class.util.d.ts.map +1 -0
- package/dist/utils/get-validation-message.d.ts +22 -0
- package/dist/utils/get-validation-message.d.ts.map +1 -0
- package/dist/utils/is-true.d.ts +3 -0
- package/dist/utils/is-true.d.ts.map +1 -0
- package/dist/utils/path.d.ts +20 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/props.util.d.ts +2 -0
- package/dist/utils/props.util.d.ts.map +1 -0
- package/dist/utils/public.d.ts +2 -0
- package/dist/utils/public.d.ts.map +1 -0
- package/dist/vue.css +2 -0
- package/package.json +106 -56
- package/src/assets/hero.png +0 -0
- package/src/assets/vite.svg +1 -0
- package/src/assets/vue.svg +1 -0
- package/src/components/ClassWrapper.vue +42 -0
- package/src/components/actions/button/Button.story.vue +187 -0
- package/src/components/actions/button/Button.vue +103 -0
- package/src/components/actions/button/button.context.ts +3 -0
- package/src/components/actions/button/button.props.ts +67 -0
- package/src/components/actions/button/button.types.ts +7 -0
- package/src/components/actions/dropdown/Dropdown.story.vue +349 -0
- package/src/components/actions/dropdown/Dropdown.vue +219 -0
- package/src/components/actions/dropdown/dropdown.context.ts +3 -0
- package/src/components/actions/dropdown/dropdown.props.ts +67 -0
- package/src/components/actions/dropdown/dropdown.types.ts +4 -0
- package/src/components/actions/fab/Fab.story.vue +227 -0
- package/src/components/actions/fab/Fab.vue +33 -0
- package/src/components/actions/fab/fab.context.ts +3 -0
- package/src/components/actions/fab/fab.props.ts +11 -0
- package/src/components/actions/fab/fab.types.ts +1 -0
- package/src/components/actions/modal/Modal.story.vue +284 -0
- package/src/components/actions/modal/Modal.vue +104 -0
- package/src/components/actions/modal/modal.context.ts +3 -0
- package/src/components/actions/modal/modal.props.ts +34 -0
- package/src/components/actions/modal/modal.types.ts +1 -0
- package/src/components/actions/public.ts +5 -0
- package/src/components/actions/public.types.ts +15 -0
- package/src/components/actions/swap/Swap.story.vue +302 -0
- package/src/components/actions/swap/Swap.vue +60 -0
- package/src/components/actions/swap/swap.context.ts +3 -0
- package/src/components/actions/swap/swap.props.ts +20 -0
- package/src/components/actions/swap/swap.types.ts +1 -0
- package/src/components/app/PoppyApp.vue +48 -0
- package/src/components/app/public.ts +1 -0
- package/src/components/data/checkbox/Checkbox.story.vue +156 -0
- package/src/components/data/checkbox/Checkbox.vue +119 -0
- package/src/components/data/checkbox/checkbox.context.ts +3 -0
- package/src/components/data/checkbox/checkbox.props.ts +38 -0
- package/src/components/data/checkbox/checkbox.types.ts +5 -0
- package/src/components/data/form/Form.story.vue +144 -0
- package/src/components/data/form/Form.vue +222 -0
- package/src/components/data/form/form.context.ts +76 -0
- package/src/components/data/form/form.props.ts +30 -0
- package/src/components/data/form/form.types.ts +25 -0
- package/src/components/data/form-field/FormField.vue +133 -0
- package/src/components/data/form-field/form-field.context.ts +51 -0
- package/src/components/data/form-field/form-field.props.ts +34 -0
- package/src/components/data/form-field/form-field.types.ts +1 -0
- package/src/components/data/input/Input.story.vue +219 -0
- package/src/components/data/input/Input.vue +196 -0
- package/src/components/data/input/input.context.ts +3 -0
- package/src/components/data/input/input.props.ts +83 -0
- package/src/components/data/input/input.types.ts +10 -0
- package/src/components/data/public.ts +10 -0
- package/src/components/data/public.types.ts +30 -0
- package/src/components/data/radio/Radio.story.vue +158 -0
- package/src/components/data/radio/Radio.vue +105 -0
- package/src/components/data/radio/radio.context.ts +3 -0
- package/src/components/data/radio/radio.props.ts +46 -0
- package/src/components/data/radio/radio.types.ts +5 -0
- package/src/components/data/rating/Rating.story.vue +150 -0
- package/src/components/data/rating/Rating.vue +178 -0
- package/src/components/data/rating/rating.context.ts +3 -0
- package/src/components/data/rating/rating.props.ts +51 -0
- package/src/components/data/rating/rating.types.ts +8 -0
- package/src/components/data/select/Select.story.vue +221 -0
- package/src/components/data/select/Select.vue +329 -0
- package/src/components/data/select/select.context.ts +3 -0
- package/src/components/data/select/select.props.ts +65 -0
- package/src/components/data/select/select.types.ts +13 -0
- package/src/components/data/slider/Slider.story.vue +276 -0
- package/src/components/data/slider/Slider.vue +772 -0
- package/src/components/data/slider/slider.context.ts +3 -0
- package/src/components/data/slider/slider.props.ts +84 -0
- package/src/components/data/slider/slider.types.ts +11 -0
- package/src/components/data/textarea/Textarea.story.vue +222 -0
- package/src/components/data/textarea/Textarea.vue +179 -0
- package/src/components/data/textarea/textarea.context.ts +3 -0
- package/src/components/data/textarea/textarea.props.ts +75 -0
- package/src/components/data/textarea/textarea.types.ts +7 -0
- package/src/components/data/toggle/Toggle.story.vue +146 -0
- package/src/components/data/toggle/Toggle.vue +115 -0
- package/src/components/data/toggle/toggle.context.ts +3 -0
- package/src/components/data/toggle/toggle.props.ts +30 -0
- package/src/components/data/toggle/toggle.types.ts +5 -0
- package/src/components/display/accordion/Accordion.story.vue +482 -0
- package/src/components/display/accordion/Accordion.vue +112 -0
- package/src/components/display/accordion/AccordionItem.vue +111 -0
- package/src/components/display/accordion/accordion-item.context.ts +3 -0
- package/src/components/display/accordion/accordion-item.props.ts +20 -0
- package/src/components/display/accordion/accordion-item.types.ts +1 -0
- package/src/components/display/accordion/accordion.context.ts +10 -0
- package/src/components/display/accordion/accordion.props.ts +16 -0
- package/src/components/display/avatar/Avatar.story.vue +341 -0
- package/src/components/display/avatar/Avatar.vue +58 -0
- package/src/components/display/avatar/avatar.context.ts +3 -0
- package/src/components/display/avatar/avatar.props.ts +50 -0
- package/src/components/display/avatar/avatar.types.ts +5 -0
- package/src/components/display/badge/Badge.story.vue +156 -0
- package/src/components/display/badge/Badge.vue +51 -0
- package/src/components/display/badge/badge.context.ts +3 -0
- package/src/components/display/badge/badge.props.ts +22 -0
- package/src/components/display/badge/badge.types.ts +5 -0
- package/src/components/display/card/Card.story.vue +308 -0
- package/src/components/display/card/Card.vue +41 -0
- package/src/components/display/card/CardActions.vue +30 -0
- package/src/components/display/card/CardBody.vue +5 -0
- package/src/components/display/card/CardTitle.vue +5 -0
- package/src/components/display/card/card-actions.context.ts +3 -0
- package/src/components/display/card/card-actions.props.ts +15 -0
- package/src/components/display/card/card-actions.types.ts +1 -0
- package/src/components/display/card/card.context.ts +3 -0
- package/src/components/display/card/card.props.ts +34 -0
- package/src/components/display/card/card.types.ts +4 -0
- package/src/components/display/carousel/Carousel.story.vue +216 -0
- package/src/components/display/carousel/Carousel.vue +157 -0
- package/src/components/display/carousel/carousel.context.ts +3 -0
- package/src/components/display/carousel/carousel.props.ts +59 -0
- package/src/components/display/carousel/carousel.types.ts +2 -0
- package/src/components/display/chat/Chat.story.vue +251 -0
- package/src/components/display/chat/Chat.vue +56 -0
- package/src/components/display/chat/chat.context.ts +3 -0
- package/src/components/display/chat/chat.props.ts +19 -0
- package/src/components/display/chat/chat.types.ts +2 -0
- package/src/components/display/countdown/Countdown.story.vue +284 -0
- package/src/components/display/countdown/Countdown.vue +111 -0
- package/src/components/display/countdown/countdown.props.ts +24 -0
- package/src/components/display/countdown/countdown.types.ts +24 -0
- package/src/components/display/diff/Diff.story.vue +118 -0
- package/src/components/display/diff/Diff.vue +13 -0
- package/src/components/display/hover-3d/Hover3d.story.vue +154 -0
- package/src/components/display/hover-3d/Hover3d.vue +37 -0
- package/src/components/display/hover-3d/hover-3d.props.ts +9 -0
- package/src/components/display/hover-gallery/HoverGallery.story.vue +121 -0
- package/src/components/display/hover-gallery/HoverGallery.vue +5 -0
- package/src/components/display/kbd/Kbd.story.vue +214 -0
- package/src/components/display/kbd/Kbd.vue +32 -0
- package/src/components/display/kbd/kbd.context.ts +3 -0
- package/src/components/display/kbd/kbd.props.ts +12 -0
- package/src/components/display/kbd/kbd.types.ts +3 -0
- package/src/components/display/list/List.story.vue +381 -0
- package/src/components/display/list/List.vue +14 -0
- package/src/components/display/list/ListItem.vue +53 -0
- package/src/components/display/list/list-item.props.ts +19 -0
- package/src/components/display/list/list.props.ts +7 -0
- package/src/components/display/public.ts +18 -0
- package/src/components/display/public.types.ts +34 -0
- package/src/components/display/status/Status.story.vue +195 -0
- package/src/components/display/status/Status.vue +70 -0
- package/src/components/display/status/status.context.ts +3 -0
- package/src/components/display/status/status.props.ts +30 -0
- package/src/components/display/status/status.types.ts +5 -0
- package/src/components/feedback/alert/Alert.story.vue +243 -0
- package/src/components/feedback/alert/Alert.vue +46 -0
- package/src/components/feedback/alert/alert.context.ts +3 -0
- package/src/components/feedback/alert/alert.props.ts +29 -0
- package/src/components/feedback/alert/alert.types.ts +3 -0
- package/src/components/feedback/loading/Loading.story.vue +156 -0
- package/src/components/feedback/loading/Loading.vue +55 -0
- package/src/components/feedback/loading/loading.context.ts +3 -0
- package/src/components/feedback/loading/loading.props.ts +25 -0
- package/src/components/feedback/loading/loading.types.ts +5 -0
- package/src/components/feedback/progress/Progress.story.vue +96 -0
- package/src/components/feedback/progress/Progress.vue +37 -0
- package/src/components/feedback/progress/progress.context.ts +3 -0
- package/src/components/feedback/progress/progress.props.ts +32 -0
- package/src/components/feedback/progress/progress.types.ts +1 -0
- package/src/components/feedback/public.ts +5 -0
- package/src/components/feedback/public.types.ts +18 -0
- package/src/components/feedback/radial-progress/RadialProgress.story.vue +118 -0
- package/src/components/feedback/radial-progress/RadialProgress.vue +46 -0
- package/src/components/feedback/radial-progress/radial-progress.context.ts +3 -0
- package/src/components/feedback/radial-progress/radial-progress.props.ts +35 -0
- package/src/components/feedback/radial-progress/radial-progress.types.ts +9 -0
- package/src/components/feedback/toast/Toast.story.vue +356 -0
- package/src/components/feedback/toast/Toast.vue +40 -0
- package/src/components/feedback/toast/toast.context.ts +12 -0
- package/src/components/feedback/toast/toast.props.ts +33 -0
- package/src/components/feedback/toast/toast.types.ts +5 -0
- package/src/components/feedback/tooltip/Tooltip.story.vue +256 -0
- package/src/components/feedback/tooltip/Tooltip.vue +123 -0
- package/src/components/feedback/tooltip/tooltip.context.ts +3 -0
- package/src/components/feedback/tooltip/tooltip.props.ts +44 -0
- package/src/components/feedback/tooltip/tooltip.types.ts +2 -0
- package/src/components/layout/divider/Divider.story.vue +217 -0
- package/src/components/layout/divider/Divider.vue +48 -0
- package/src/components/layout/divider/divider.context.ts +3 -0
- package/src/components/layout/divider/divider.props.ts +28 -0
- package/src/components/layout/divider/divider.types.ts +3 -0
- package/src/components/layout/drawer/Drawer.story.vue +301 -0
- package/src/components/layout/drawer/Drawer.vue +91 -0
- package/src/components/layout/drawer/drawer.context.ts +3 -0
- package/src/components/layout/drawer/drawer.props.ts +31 -0
- package/src/components/layout/drawer/drawer.types.ts +6 -0
- package/src/components/layout/indicator/Indicator.story.vue +264 -0
- package/src/components/layout/indicator/Indicator.vue +44 -0
- package/src/components/layout/indicator/indicator.context.ts +3 -0
- package/src/components/layout/indicator/indicator.props.ts +31 -0
- package/src/components/layout/indicator/indicator.types.ts +2 -0
- package/src/components/layout/join/Join.story.vue +147 -0
- package/src/components/layout/join/Join.vue +32 -0
- package/src/components/layout/join/join.context.ts +3 -0
- package/src/components/layout/join/join.props.ts +14 -0
- package/src/components/layout/join/join.types.ts +1 -0
- package/src/components/layout/mask/Mask.story.vue +181 -0
- package/src/components/layout/mask/Mask.vue +50 -0
- package/src/components/layout/mask/mask.context.ts +3 -0
- package/src/components/layout/mask/mask.props.ts +40 -0
- package/src/components/layout/mask/mask.types.ts +18 -0
- package/src/components/layout/public.ts +6 -0
- package/src/components/layout/public.types.ts +18 -0
- package/src/components/layout/stack/Stack.story.vue +170 -0
- package/src/components/layout/stack/Stack.vue +29 -0
- package/src/components/layout/stack/stack.context.ts +3 -0
- package/src/components/layout/stack/stack.props.ts +12 -0
- package/src/components/layout/stack/stack.types.ts +1 -0
- package/src/components/navigation/breadcrumbs/Breadcrumbs.story.vue +94 -0
- package/src/components/navigation/breadcrumbs/Breadcrumbs.vue +53 -0
- package/src/components/navigation/breadcrumbs/breadcrumbs.context.ts +3 -0
- package/src/components/navigation/breadcrumbs/breadcrumbs.props.ts +18 -0
- package/src/components/navigation/breadcrumbs/breadcrumbs.types.ts +13 -0
- package/src/components/navigation/dock/Dock.story.vue +109 -0
- package/src/components/navigation/dock/Dock.vue +32 -0
- package/src/components/navigation/dock/DockItem.vue +50 -0
- package/src/components/navigation/dock/dock.context.ts +4 -0
- package/src/components/navigation/dock/dock.props.ts +34 -0
- package/src/components/navigation/dock/dock.types.ts +3 -0
- package/src/components/navigation/link/Link.story.vue +129 -0
- package/src/components/navigation/link/Link.vue +58 -0
- package/src/components/navigation/link/link.context.ts +3 -0
- package/src/components/navigation/link/link.props.ts +24 -0
- package/src/components/navigation/link/link.types.ts +1 -0
- package/src/components/navigation/menu/Menu.story.vue +284 -0
- package/src/components/navigation/menu/Menu.vue +41 -0
- package/src/components/navigation/menu/MenuItem.vue +104 -0
- package/src/components/navigation/menu/menu.context.ts +4 -0
- package/src/components/navigation/menu/menu.props.ts +70 -0
- package/src/components/navigation/menu/menu.types.ts +4 -0
- package/src/components/navigation/public.ts +5 -0
- package/src/components/navigation/public.types.ts +12 -0
- package/src/composables/public.ts +3 -0
- package/src/composables/use-component-config.ts +44 -0
- package/src/composables/use-config.ts +6 -0
- package/src/composables/use-form-field.ts +84 -0
- package/src/composables/use-select-counter.ts +59 -0
- package/src/composables/use-toast.ts +47 -0
- package/src/histoire.css +8 -0
- package/src/plugin-vue.ts +53 -0
- package/src/public.ts +9 -0
- package/src/stories/Configuration.story.md +55 -0
- package/src/style.css +6 -0
- package/src/symbol.ts +18 -0
- package/src/types/config.type.ts +96 -0
- package/src/types/public.ts +3 -0
- package/src/types/size.type.ts +1 -0
- package/src/types/utils.type.ts +7 -0
- package/src/utils/build-class.util.ts +38 -0
- package/src/utils/get-validation-message.ts +61 -0
- package/src/utils/is-true.ts +12 -0
- package/src/utils/path.ts +102 -0
- package/src/utils/props.util.ts +11 -0
- package/src/utils/public.ts +1 -0
- package/src/vite-env.d.ts +11 -0
- package/src/vue.d.ts +15 -0
- package/css/core.css +0 -1
- package/css/core.css.map +0 -1
- package/css/global.bundle.css +0 -1
- package/css/global.bundle.css.map +0 -1
- package/css/normalize.css +0 -1
- package/css/normalize.css.map +0 -1
- package/css/poppy.bundle.css +0 -1
- package/css/poppy.bundle.css.map +0 -1
- package/css/structure.css +0 -1
- package/css/structure.css.map +0 -1
- package/css/themes/dark.always.css +0 -1
- package/css/themes/dark.always.css.map +0 -1
- package/css/themes/dark.class.css +0 -1
- package/css/themes/dark.class.css.map +0 -1
- package/css/themes/dark.system.css +0 -1
- package/css/themes/dark.system.css.map +0 -1
- package/css/themes/dark.theme.css +0 -1
- package/css/themes/dark.theme.css.map +0 -1
- package/css/themes/light.always.css +0 -1
- package/css/themes/light.always.css.map +0 -1
- package/css/themes/light.class.css +0 -1
- package/css/themes/light.class.css.map +0 -1
- package/css/themes/light.system.css +0 -1
- package/css/themes/light.system.css.map +0 -1
- package/css/themes/light.theme.css +0 -1
- package/css/themes/light.theme.css.map +0 -1
- package/dist/index.js +0 -448
- package/dist/index.js.map +0 -1
- package/dist/types/generated/components.d.ts +0 -38
- package/dist/types/generated/vue-component-lib/utils.d.ts +0 -16
- package/dist/types/index.d.ts +0 -6
- package/dist/types/plugin.d.ts +0 -3
- package/dist/vetur/attributes.json +0 -1392
- package/dist/vetur/tags.json +0 -376
- package/dist/web-types.json +0 -2940
- package/readme.md +0 -39
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.es.js","names":["$slots","$slots","$slots","$attrs","$t","$slots"],"sources":["../../../src/components/data/checkbox/checkbox.context.ts","../../../src/components/data/checkbox/Checkbox.vue","../../../src/components/data/checkbox/Checkbox.vue","../../../src/utils/path.ts","../../../src/components/data/form/form.context.ts","../../../src/components/data/form/Form.vue","../../../src/components/data/form/Form.vue","../../../src/components/data/form-field/FormField.vue","../../../src/components/data/form-field/FormField.vue","../../../src/components/data/input/input.context.ts","../../../src/components/data/input/Input.vue","../../../src/components/data/input/Input.vue","../../../src/components/data/radio/radio.context.ts","../../../src/components/data/radio/Radio.vue","../../../src/components/data/radio/Radio.vue","../../../src/components/data/rating/rating.context.ts","../../../src/components/data/rating/Rating.vue","../../../src/components/data/rating/Rating.vue","../../../src/composables/use-select-counter.ts","../../../src/components/data/select/select.context.ts","../../../src/components/data/select/Select.vue","../../../src/components/data/select/Select.vue","../../../src/components/data/slider/slider.context.ts","../../../src/components/data/slider/Slider.vue","../../../src/components/data/slider/Slider.vue","../../../src/components/data/textarea/textarea.context.ts","../../../src/components/data/textarea/Textarea.vue","../../../src/components/data/textarea/Textarea.vue","../../../src/components/data/toggle/toggle.context.ts","../../../src/components/data/toggle/Toggle.vue","../../../src/components/data/toggle/Toggle.vue"],"sourcesContent":["import { createComponentConfigKey } from '@/symbol'\n\nexport const CHECKBOX_CONFIG = createComponentConfigKey('checkbox')\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, useSlots, useTemplateRef, watchEffect } from 'vue'\nimport { CHECKBOX_CONFIG } from './checkbox.context'\nimport type { CheckboxProps } from './checkbox.props'\nimport type { CheckboxColor, CheckboxSize } from './checkbox.types'\n\nconst colors: ComponentClass<'checkbox', CheckboxColor> = {\n neutral: 'checkbox-neutral',\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n info: 'checkbox-info',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n error: 'checkbox-error',\n}\n\nconst sizes: ComponentClass<'checkbox', CheckboxSize> = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: 'checkbox-md',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<CheckboxProps>()\nconst model = defineModel<boolean>()\nconst config = useComponentConfig(CHECKBOX_CONFIG, props, { size: 'md' })\n\nconst inputEl = useTemplateRef('inputEl')\n\nconst slots = useSlots()\n\n// ── Indeterminate — must be set imperatively on the DOM node ─────────────────\n\nwatchEffect(() => {\n if (inputEl.value) {\n inputEl.value.indeterminate = isTrue(props.indeterminate)\n }\n})\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() =>\n field ? field.value.value : model.value,\n)\n\nfunction handleChange(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked\n model.value = checked\n field?.setValue(checked)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\n// ── Description presence ─────────────────────────────────────────────────────\n\nconst hasDescription = computed(() => !!(props.description || slots.description))\n</script>\n\n<template>\n <!-- Bare checkbox — no description -->\n <input\n v-if=\"!hasDescription\"\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"checkbox\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'checkbox-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n\n <!-- Checkbox with description -->\n <label v-else class=\"flex cursor-pointer items-start gap-2\">\n <input\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"checkbox mt-0.5\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'checkbox-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"label-text text-base-content/60\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </label>\n</template>","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, useSlots, useTemplateRef, watchEffect } from 'vue'\nimport { CHECKBOX_CONFIG } from './checkbox.context'\nimport type { CheckboxProps } from './checkbox.props'\nimport type { CheckboxColor, CheckboxSize } from './checkbox.types'\n\nconst colors: ComponentClass<'checkbox', CheckboxColor> = {\n neutral: 'checkbox-neutral',\n primary: 'checkbox-primary',\n secondary: 'checkbox-secondary',\n accent: 'checkbox-accent',\n info: 'checkbox-info',\n success: 'checkbox-success',\n warning: 'checkbox-warning',\n error: 'checkbox-error',\n}\n\nconst sizes: ComponentClass<'checkbox', CheckboxSize> = {\n xs: 'checkbox-xs',\n sm: 'checkbox-sm',\n md: 'checkbox-md',\n lg: 'checkbox-lg',\n xl: 'checkbox-xl',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<CheckboxProps>()\nconst model = defineModel<boolean>()\nconst config = useComponentConfig(CHECKBOX_CONFIG, props, { size: 'md' })\n\nconst inputEl = useTemplateRef('inputEl')\n\nconst slots = useSlots()\n\n// ── Indeterminate — must be set imperatively on the DOM node ─────────────────\n\nwatchEffect(() => {\n if (inputEl.value) {\n inputEl.value.indeterminate = isTrue(props.indeterminate)\n }\n})\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() =>\n field ? field.value.value : model.value,\n)\n\nfunction handleChange(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked\n model.value = checked\n field?.setValue(checked)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\n// ── Description presence ─────────────────────────────────────────────────────\n\nconst hasDescription = computed(() => !!(props.description || slots.description))\n</script>\n\n<template>\n <!-- Bare checkbox — no description -->\n <input\n v-if=\"!hasDescription\"\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"checkbox\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'checkbox-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n\n <!-- Checkbox with description -->\n <label v-else class=\"flex cursor-pointer items-start gap-2\">\n <input\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"checkbox mt-0.5\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'checkbox-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"label-text text-base-content/60\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </label>\n</template>","/**\n * Gets a value from an object using a dot-notation path.\n * Supports nested objects and array indices.\n *\n * @example\n * getByPath({ a: { b: 1 } }, 'a.b') // returns 1\n * getByPath({ users: [{ name: 'John' }] }, 'users.0.name') // returns 'John'\n */\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n if (!obj || !path) return undefined\n\n const keys = parsePath(path)\n let current: unknown = obj\n\n for (const key of keys) {\n if (current === null || current === undefined) {\n return undefined\n }\n\n if (typeof current !== 'object') {\n return undefined\n }\n\n current = (current as Record<string, unknown>)[key]\n }\n\n return current\n}\n\n/**\n * Sets a value in an object using a dot-notation path.\n * Creates intermediate objects/arrays as needed.\n * Supports nested objects and array indices.\n *\n * @example\n * setByPath({}, 'a.b', 1) // returns { a: { b: 1 } }\n * setByPath({ users: [] }, 'users.0.name', 'John') // returns { users: [{ name: 'John' }] }\n */\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): void {\n if (!path) return\n\n const keys = parsePath(path)\n let current: Record<string, unknown> = obj\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i]\n const nextKey = keys[i + 1]\n\n if (current[key] === undefined) {\n // Create array if next key is numeric\n if (isNumericKey(nextKey)) {\n current[key] = []\n } else {\n current[key] = {}\n }\n }\n\n if (typeof current[key] !== 'object' || current[key] === null) {\n // Overwrite with array if next key is numeric\n if (isNumericKey(nextKey)) {\n current[key] = []\n } else {\n current[key] = {}\n }\n }\n\n current = current[key] as Record<string, unknown>\n }\n\n const lastKey = keys[keys.length - 1]\n if (isNumericKey(lastKey)) {\n const arr = current as unknown as unknown[]\n const index = Number.parseInt(lastKey, 10)\n // Expand array if needed\n while (arr.length <= index) {\n arr.push(undefined)\n }\n arr[index] = value\n } else {\n current[lastKey] = value\n }\n}\n\n/**\n * Parses a dot-notation path into an array of keys.\n * Handles array indices (e.g., 'users.0.name' -> ['users', '0', 'name'])\n */\nfunction parsePath(path: string): string[] {\n // Handle empty path\n if (!path.trim()) return []\n\n // Split by dots, but preserve empty strings for consecutive dots\n // Then filter out empty strings\n return path.split('.').filter(key => key !== '')\n}\n\n/**\n * Checks if a key is a numeric index (for arrays).\n */\nfunction isNumericKey(key: string): boolean {\n return /^\\d+$/.test(key)\n}\n","import type { InjectionKey, ShallowRef } from 'vue'\nimport type { FieldState } from './form.types'\n\nexport interface FormContext {\n /**\n * Unified error record.\n * Global form error is stored under the `\"$\"` key.\n * Per-field errors are stored under their dot-notation field name/path.\n *\n * @example { '$': 'Server error', 'email': 'Invalid email', 'address.street': 'Required' }\n */\n errors: ShallowRef<Record<string, string | undefined>>\n\n /** Shallow reactive mirror of the form's v-model data. */\n data: Record<string, unknown>\n\n /**\n * Counter config — exposed as raw `boolean | undefined`.\n * `undefined` means \"no opinion\" — inputs resolve the final value themselves\n * via `mergeProps` in `useComponentConfig`.\n */\n counter: ShallowRef<boolean | undefined>\n counterFormat: ShallowRef<string | ((c: number, min?: number, max?: number) => string) | undefined>\n\n // ── Field value methods ─────────────────────────────────────────────────\n\n /** Sets a single field value by dot-notation path. Supports nested objects and arrays. */\n setFieldValue: (path: string, value: unknown) => void\n\n /** Returns the current value at a dot-notation path. */\n getFieldValue: (path: string) => unknown\n\n /** Replaces the entire data record and emits update:modelValue. */\n setValues: (values: Record<string, unknown>) => void\n\n // ── Field error methods ─────────────────────────────────────────────────\n\n /** Returns the error string for a path, or \"$\" for the global error. */\n getFieldError: (path: string) => string | undefined\n\n /** Sets an error on a specific field (or \"$\" for global). */\n setFieldError: (path: string, message: string | undefined) => void\n\n /**\n * Replaces the entire errors record.\n * Use \"$\" key for the global error.\n */\n setErrors: (errors: Record<string, string | undefined>) => void\n\n /**\n * Clears all errors, or a specific field's error if `path` is provided.\n * Pass `\"$\"` to clear only the global error.\n */\n clearErrors: (path?: string) => void\n\n // ── Field state methods ─────────────────────────────────────────────────\n\n /** Returns the full FieldState for a given path. */\n getFieldState: (path: string) => FieldState\n\n /** Marks a field as dirty (user has changed its value). */\n setDirty: (path: string, value?: boolean) => void\n\n /** Marks a field as touched (user has blurred the input). */\n setTouched: (path: string, value?: boolean) => void\n\n // ── Form-level methods ──────────────────────────────────────────────────\n\n /** Triggers validation on all registered fields. Returns true if all valid. */\n validate: () => boolean\n\n /** Resets data to initial values, clears all errors and field states. */\n reset: () => void\n}\n\nexport const FORM_CONTEXT_KEY: InjectionKey<FormContext> = Symbol('FormContext')\n","<script lang=\"ts\">\nimport type { CounterFn } from '@/types/utils.type'\nimport { isTrue } from '@/utils/is-true'\nimport { getByPath, setByPath } from '@/utils/path'\nimport { provide, shallowReactive, shallowRef, watch } from 'vue'\nimport type { FormContext } from './form.context'\nimport { FORM_CONTEXT_KEY } from './form.context'\nimport type { FormProps } from './form.props'\nimport type { FieldState } from './form.types'\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<FormProps>()\n\n/**\n * The form data object. All field values are stored under their name/path key.\n * Supports nested paths and arrays via dot-notation.\n */\nconst model = defineModel<Record<string, unknown>>({ required: true })\n\nconst emit = defineEmits<{\n /**\n * Fired on form submit after serialization.\n * The payload is the raw data (or serialized data if `serializer` is set).\n */\n submit: [data: Record<string, unknown>]\n /** Fired on form reset. Data is restored to the initial model value. */\n reset: []\n}>()\n\n// Internal state\n\n// const initialData = JSON.parse(JSON.stringify(unref(model.value) ?? {}))\n\n// Shallow reactive copy — mutations here don't affect the model until emitted\nconst data = shallowReactive<Record<string, unknown>>({ ...model.value })\n\nconst errors = shallowRef<Record<string, string | undefined>>({})\n\nconst fieldStates = shallowReactive<Record<string, FieldState>>({})\n\n// Keep data in sync when the model is updated externally\nwatch(model, val => Object.assign(data, val))\n\n// Counter — stored as raw boolean | undefined.\n// undefined = \"no opinion\": mergeProps in useComponentConfig skips it,\n// letting pluginConfig / defaults take over.\n// false = explicitly disabled: mergeProps propagates it, overriding any lower-priority true.\n\nconst counter = shallowRef<boolean | undefined>(\n props.counter !== undefined ? isTrue(props.counter) : undefined,\n)\nconst counterFormat = shallowRef<string | CounterFn | undefined>(props.counterFormat)\n\nwatch(() => props.counter, val => {\n counter.value = val !== undefined ? isTrue(val) : undefined\n})\nwatch(() => props.counterFormat, (val) => { counterFormat.value = val })\n\n// Field state helpers\n\nfunction ensureFieldState(path: string): FieldState {\n if (!fieldStates[path]) {\n fieldStates[path] = {\n value: getByPath(data, path),\n isDirty: false,\n isTouched: false,\n isValid: true,\n hasError: false,\n error: undefined,\n }\n }\n return fieldStates[path]\n}\n\n// FormContext implementation\n\nfunction setFieldValue(path: string, value: unknown): void {\n setByPath(data, path, value)\n const state = ensureFieldState(path)\n state.value = value\n model.value = { ...data }\n}\n\nfunction getFieldValue(path: string): unknown {\n return getByPath(data, path)\n}\n\nfunction setValues(values: Record<string, unknown>): void {\n Object.assign(data, values)\n model.value = { ...data }\n}\n\nfunction getFieldError(path: string): string | undefined {\n return errors.value[path]\n}\n\nfunction setFieldError(path: string, message: string | undefined): void {\n errors.value = { ...errors.value, [path]: message }\n const state = ensureFieldState(path)\n state.error = message\n state.isValid = !message\n state.hasError = !!message\n}\n\nfunction setErrors(newErrors: Record<string, string | undefined>): void {\n errors.value = { ...newErrors }\n for (const [path, message] of Object.entries(newErrors)) {\n const state = ensureFieldState(path)\n state.error = message\n state.isValid = !message\n state.hasError = !!message\n }\n}\n\nfunction clearErrors(path?: string): void {\n if (path != null) {\n const { [path]: _removed, ...rest } = errors.value\n errors.value = rest\n const state = fieldStates[path]\n if (state) {\n state.error = undefined\n state.isValid = true\n state.hasError = false\n }\n } else {\n errors.value = {}\n for (const state of Object.values(fieldStates)) {\n state.error = undefined\n state.isValid = true\n state.hasError = false\n }\n }\n}\n\nfunction getFieldState(path: string): FieldState {\n return ensureFieldState(path)\n}\n\nfunction setDirty(path: string, value = true): void {\n ensureFieldState(path).isDirty = value\n}\n\nfunction setTouched(path: string, value = true): void {\n ensureFieldState(path).isTouched = value\n}\n\nfunction validate(): boolean {\n let allValid = true\n for (const [, validateFn] of validators) {\n if (!validateFn()) allValid = false\n }\n return allValid\n}\n\n// Registered validate callbacks from child inputs (via useFormField)\nconst validators: Map<string, () => boolean> = new Map()\n\nfunction reset(): void {\n Object.assign(data, {})\n model.value = { ...data }\n clearErrors()\n for (const path of Object.keys(fieldStates)) {\n fieldStates[path] = {\n value: getByPath(data, path),\n isDirty: false,\n isTouched: false,\n isValid: true,\n hasError: false,\n error: undefined,\n }\n }\n emit('reset')\n}\n\n// Provide context\n\nconst formContext: FormContext = {\n errors,\n data,\n counter,\n counterFormat,\n setFieldValue,\n getFieldValue,\n setValues,\n getFieldError,\n setFieldError,\n setErrors,\n clearErrors,\n getFieldState,\n setDirty,\n setTouched,\n validate,\n reset,\n}\n\nprovide(FORM_CONTEXT_KEY, formContext)\ndefineExpose(formContext)\n\n// Submit handler\n\nfunction handleSubmit(): void {\n const isValid = validate()\n if (!isValid) return\n\n const serialized = props.serializer?.({ ...data }) ?? { ...data }\n emit('submit', serialized)\n}\n</script>\n\n<template>\n <form novalidate @submit.prevent=\"handleSubmit\" @reset.prevent=\"reset\">\n <slot />\n <slot\n v-if=\"errors['$']\"\n name=\"error\"\n :error=\"errors['$']\"\n >\n <p class=\"text-error text-sm mt-2\" role=\"alert\">{{ errors['$'] }}</p>\n </slot>\n </form>\n</template>\n","<script lang=\"ts\">\nimport type { CounterFn } from '@/types/utils.type'\nimport { isTrue } from '@/utils/is-true'\nimport { getByPath, setByPath } from '@/utils/path'\nimport { provide, shallowReactive, shallowRef, watch } from 'vue'\nimport type { FormContext } from './form.context'\nimport { FORM_CONTEXT_KEY } from './form.context'\nimport type { FormProps } from './form.props'\nimport type { FieldState } from './form.types'\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<FormProps>()\n\n/**\n * The form data object. All field values are stored under their name/path key.\n * Supports nested paths and arrays via dot-notation.\n */\nconst model = defineModel<Record<string, unknown>>({ required: true })\n\nconst emit = defineEmits<{\n /**\n * Fired on form submit after serialization.\n * The payload is the raw data (or serialized data if `serializer` is set).\n */\n submit: [data: Record<string, unknown>]\n /** Fired on form reset. Data is restored to the initial model value. */\n reset: []\n}>()\n\n// Internal state\n\n// const initialData = JSON.parse(JSON.stringify(unref(model.value) ?? {}))\n\n// Shallow reactive copy — mutations here don't affect the model until emitted\nconst data = shallowReactive<Record<string, unknown>>({ ...model.value })\n\nconst errors = shallowRef<Record<string, string | undefined>>({})\n\nconst fieldStates = shallowReactive<Record<string, FieldState>>({})\n\n// Keep data in sync when the model is updated externally\nwatch(model, val => Object.assign(data, val))\n\n// Counter — stored as raw boolean | undefined.\n// undefined = \"no opinion\": mergeProps in useComponentConfig skips it,\n// letting pluginConfig / defaults take over.\n// false = explicitly disabled: mergeProps propagates it, overriding any lower-priority true.\n\nconst counter = shallowRef<boolean | undefined>(\n props.counter !== undefined ? isTrue(props.counter) : undefined,\n)\nconst counterFormat = shallowRef<string | CounterFn | undefined>(props.counterFormat)\n\nwatch(() => props.counter, val => {\n counter.value = val !== undefined ? isTrue(val) : undefined\n})\nwatch(() => props.counterFormat, (val) => { counterFormat.value = val })\n\n// Field state helpers\n\nfunction ensureFieldState(path: string): FieldState {\n if (!fieldStates[path]) {\n fieldStates[path] = {\n value: getByPath(data, path),\n isDirty: false,\n isTouched: false,\n isValid: true,\n hasError: false,\n error: undefined,\n }\n }\n return fieldStates[path]\n}\n\n// FormContext implementation\n\nfunction setFieldValue(path: string, value: unknown): void {\n setByPath(data, path, value)\n const state = ensureFieldState(path)\n state.value = value\n model.value = { ...data }\n}\n\nfunction getFieldValue(path: string): unknown {\n return getByPath(data, path)\n}\n\nfunction setValues(values: Record<string, unknown>): void {\n Object.assign(data, values)\n model.value = { ...data }\n}\n\nfunction getFieldError(path: string): string | undefined {\n return errors.value[path]\n}\n\nfunction setFieldError(path: string, message: string | undefined): void {\n errors.value = { ...errors.value, [path]: message }\n const state = ensureFieldState(path)\n state.error = message\n state.isValid = !message\n state.hasError = !!message\n}\n\nfunction setErrors(newErrors: Record<string, string | undefined>): void {\n errors.value = { ...newErrors }\n for (const [path, message] of Object.entries(newErrors)) {\n const state = ensureFieldState(path)\n state.error = message\n state.isValid = !message\n state.hasError = !!message\n }\n}\n\nfunction clearErrors(path?: string): void {\n if (path != null) {\n const { [path]: _removed, ...rest } = errors.value\n errors.value = rest\n const state = fieldStates[path]\n if (state) {\n state.error = undefined\n state.isValid = true\n state.hasError = false\n }\n } else {\n errors.value = {}\n for (const state of Object.values(fieldStates)) {\n state.error = undefined\n state.isValid = true\n state.hasError = false\n }\n }\n}\n\nfunction getFieldState(path: string): FieldState {\n return ensureFieldState(path)\n}\n\nfunction setDirty(path: string, value = true): void {\n ensureFieldState(path).isDirty = value\n}\n\nfunction setTouched(path: string, value = true): void {\n ensureFieldState(path).isTouched = value\n}\n\nfunction validate(): boolean {\n let allValid = true\n for (const [, validateFn] of validators) {\n if (!validateFn()) allValid = false\n }\n return allValid\n}\n\n// Registered validate callbacks from child inputs (via useFormField)\nconst validators: Map<string, () => boolean> = new Map()\n\nfunction reset(): void {\n Object.assign(data, {})\n model.value = { ...data }\n clearErrors()\n for (const path of Object.keys(fieldStates)) {\n fieldStates[path] = {\n value: getByPath(data, path),\n isDirty: false,\n isTouched: false,\n isValid: true,\n hasError: false,\n error: undefined,\n }\n }\n emit('reset')\n}\n\n// Provide context\n\nconst formContext: FormContext = {\n errors,\n data,\n counter,\n counterFormat,\n setFieldValue,\n getFieldValue,\n setValues,\n getFieldError,\n setFieldError,\n setErrors,\n clearErrors,\n getFieldState,\n setDirty,\n setTouched,\n validate,\n reset,\n}\n\nprovide(FORM_CONTEXT_KEY, formContext)\ndefineExpose(formContext)\n\n// Submit handler\n\nfunction handleSubmit(): void {\n const isValid = validate()\n if (!isValid) return\n\n const serialized = props.serializer?.({ ...data }) ?? { ...data }\n emit('submit', serialized)\n}\n</script>\n\n<template>\n <form novalidate @submit.prevent=\"handleSubmit\" @reset.prevent=\"reset\">\n <slot />\n <slot\n v-if=\"errors['$']\"\n name=\"error\"\n :error=\"errors['$']\"\n >\n <p class=\"text-error text-sm mt-2\" role=\"alert\">{{ errors['$'] }}</p>\n </slot>\n </form>\n</template>\n","<script lang=\"ts\">\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, provide, shallowRef, watch } from 'vue'\nimport { FORM_CONTEXT_KEY } from '../form/form.context'\nimport type { FieldState } from '../form/form.types'\nimport type { FormFieldContext } from './form-field.context'\nimport { FORM_FIELD_CONTEXT_KEY } from './form-field.context'\n</script>\n\n<script setup lang=\"ts\">\nimport type { FormFieldProps } from './form-field.props'\n\nconst props = defineProps<FormFieldProps>()\n\n// Inject parent Form context (optional)\n\nconst formCtx = inject(FORM_CONTEXT_KEY, null)\n\n// Required state — pushed by child inputs via setRequired()\n\nconst required = shallowRef<boolean>(false)\n\n// Counter — stored as raw boolean | undefined, same logic as Form.\n// The input resolves the final value via mergeProps(defaults, pluginConfig, formCtx, fieldCtx, props).\n// FormField exposes its own raw prop value; the input picks up formCtx separately.\n\nconst counter = shallowRef<boolean | undefined>(\n props.counter !== undefined ? isTrue(props.counter) : undefined,\n)\nconst counterFormat = shallowRef<\n string | ((c: number, min?: number, max?: number) => string) | undefined\n>(props.counterFormat)\n\nwatch(() => props.counter, (val) => {\n counter.value = val !== undefined ? isTrue(val) : undefined\n})\nwatch(() => props.counterFormat, (val) => { counterFormat.value = val })\n\n// Computed field state from FormContext\n\nconst fieldValue = computed<unknown>(() => formCtx?.getFieldValue(props.name))\n\nconst fieldError = computed<string | undefined>(() => formCtx?.getFieldError(props.name))\n\nconst fieldState = computed<FieldState>(() =>\n formCtx?.getFieldState(props.name) ?? {\n value: undefined,\n isDirty: false,\n isTouched: false,\n isValid: true,\n hasError: false,\n error: undefined,\n },\n)\n\n// FormFieldContext implementation\n\nfunction setValue(value: unknown): void {\n formCtx?.setFieldValue(props.name, value)\n}\n\nfunction setRequired(value: boolean): void {\n required.value = value\n}\n\nfunction setDirty(value = true): void {\n formCtx?.setDirty(props.name, value)\n}\n\nfunction setTouched(value = true): void {\n formCtx?.setTouched(props.name, value)\n}\n\nfunction setError(message: string | undefined): void {\n formCtx?.setFieldError(props.name, message)\n}\n\nconst fieldContext: FormFieldContext = {\n name: props.name,\n required,\n value: fieldValue,\n error: fieldError,\n state: fieldState,\n counter,\n counterFormat,\n setValue,\n setRequired,\n setDirty,\n setTouched,\n setError,\n}\n\nprovide(FORM_FIELD_CONTEXT_KEY, fieldContext)\n</script>\n\n<template>\n <div class=\"form-control w-full\">\n <!-- Top label row -->\n <label v-if=\"label || $slots.label\" class=\"label\">\n <slot name=\"label\" :required=\"required\">\n <span class=\"label-text\">\n {{ label }}\n <slot name=\"required\" :required=\"required\">\n <span\n v-if=\"required\"\n class=\"text-error ml-0.5\"\n aria-hidden=\"true\"\n >*</span>\n </slot>\n </span>\n </slot>\n </label>\n\n <!-- Input slot -->\n <slot />\n\n <!-- Bottom label row: error/hint -->\n <label\n v-if=\"fieldError || hint || $slots.hint\"\n class=\"label\"\n >\n <span\n class=\"label-text-alt\"\n :class=\"{ 'text-error': fieldError }\"\n role=\"alert\"\n >\n <slot name=\"error\" :error=\"fieldError\">\n <slot name=\"hint\">{{ fieldError || hint }}</slot>\n </slot>\n </span>\n </label>\n </div>\n</template>","<script lang=\"ts\">\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, provide, shallowRef, watch } from 'vue'\nimport { FORM_CONTEXT_KEY } from '../form/form.context'\nimport type { FieldState } from '../form/form.types'\nimport type { FormFieldContext } from './form-field.context'\nimport { FORM_FIELD_CONTEXT_KEY } from './form-field.context'\n</script>\n\n<script setup lang=\"ts\">\nimport type { FormFieldProps } from './form-field.props'\n\nconst props = defineProps<FormFieldProps>()\n\n// Inject parent Form context (optional)\n\nconst formCtx = inject(FORM_CONTEXT_KEY, null)\n\n// Required state — pushed by child inputs via setRequired()\n\nconst required = shallowRef<boolean>(false)\n\n// Counter — stored as raw boolean | undefined, same logic as Form.\n// The input resolves the final value via mergeProps(defaults, pluginConfig, formCtx, fieldCtx, props).\n// FormField exposes its own raw prop value; the input picks up formCtx separately.\n\nconst counter = shallowRef<boolean | undefined>(\n props.counter !== undefined ? isTrue(props.counter) : undefined,\n)\nconst counterFormat = shallowRef<\n string | ((c: number, min?: number, max?: number) => string) | undefined\n>(props.counterFormat)\n\nwatch(() => props.counter, (val) => {\n counter.value = val !== undefined ? isTrue(val) : undefined\n})\nwatch(() => props.counterFormat, (val) => { counterFormat.value = val })\n\n// Computed field state from FormContext\n\nconst fieldValue = computed<unknown>(() => formCtx?.getFieldValue(props.name))\n\nconst fieldError = computed<string | undefined>(() => formCtx?.getFieldError(props.name))\n\nconst fieldState = computed<FieldState>(() =>\n formCtx?.getFieldState(props.name) ?? {\n value: undefined,\n isDirty: false,\n isTouched: false,\n isValid: true,\n hasError: false,\n error: undefined,\n },\n)\n\n// FormFieldContext implementation\n\nfunction setValue(value: unknown): void {\n formCtx?.setFieldValue(props.name, value)\n}\n\nfunction setRequired(value: boolean): void {\n required.value = value\n}\n\nfunction setDirty(value = true): void {\n formCtx?.setDirty(props.name, value)\n}\n\nfunction setTouched(value = true): void {\n formCtx?.setTouched(props.name, value)\n}\n\nfunction setError(message: string | undefined): void {\n formCtx?.setFieldError(props.name, message)\n}\n\nconst fieldContext: FormFieldContext = {\n name: props.name,\n required,\n value: fieldValue,\n error: fieldError,\n state: fieldState,\n counter,\n counterFormat,\n setValue,\n setRequired,\n setDirty,\n setTouched,\n setError,\n}\n\nprovide(FORM_FIELD_CONTEXT_KEY, fieldContext)\n</script>\n\n<template>\n <div class=\"form-control w-full\">\n <!-- Top label row -->\n <label v-if=\"label || $slots.label\" class=\"label\">\n <slot name=\"label\" :required=\"required\">\n <span class=\"label-text\">\n {{ label }}\n <slot name=\"required\" :required=\"required\">\n <span\n v-if=\"required\"\n class=\"text-error ml-0.5\"\n aria-hidden=\"true\"\n >*</span>\n </slot>\n </span>\n </slot>\n </label>\n\n <!-- Input slot -->\n <slot />\n\n <!-- Bottom label row: error/hint -->\n <label\n v-if=\"fieldError || hint || $slots.hint\"\n class=\"label\"\n >\n <span\n class=\"label-text-alt\"\n :class=\"{ 'text-error': fieldError }\"\n role=\"alert\"\n >\n <slot name=\"error\" :error=\"fieldError\">\n <slot name=\"hint\">{{ fieldError || hint }}</slot>\n </slot>\n </span>\n </label>\n </div>\n</template>","import { createComponentConfigKey } from '@/symbol'\n\nexport const INPUT_CONFIG = createComponentConfigKey('input')\n","<script lang=\"ts\">\nimport { FORM_CONTEXT_KEY } from '@/components/data/form/form.context'\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, useTemplateRef } from 'vue'\nimport { INPUT_CONFIG } from './input.context'\nimport type { InputProps } from './input.props'\nimport type { InputColor, InputSize, InputVariant } from './input.types'\n\nconst colors: ComponentClass<'input', InputColor> = {\n neutral: 'input-neutral',\n primary: 'input-primary',\n secondary: 'input-secondary',\n accent: 'input-accent',\n info: 'input-info',\n success: 'input-success',\n warning: 'input-warning',\n error: 'input-error',\n}\n\nconst sizes: ComponentClass<'input', InputSize> = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n xl: 'input-xl',\n}\n\nconst variants: ComponentClass<'input', InputVariant> = {\n bordered: 'input-bordered',\n ghost: 'input-ghost',\n}\n</script>\n\n<script setup lang=\"ts\">\n\nconst props = defineProps<InputProps>()\n\n/**\n * Bound value. Supports `.number` and `.trim` modifiers.\n * - `v-model.number` → coerces to number\n * - `v-model.trim` → trims whitespace on update\n */\nconst model = defineModel<string | number>()\n\n// ── Context injection ────────────────────────────────────────────────────────\n\nconst formCtx = inject(FORM_CONTEXT_KEY, null)\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null)\n\n// contextOverrides: Form/FormField counter values fed into mergeProps.\n// Priority: fieldCtx (own prop) → formCtx (own prop).\n// Both are raw boolean | undefined — undefined is skipped by mergeProps.\n// contextOverrides feeds Form/FormField counter values into the mergeProps chain.\n// Passed as a getter so useComponentConfig's computed stays reactive to context changes.\nconst contextOverrides = {\n get counter() { return fieldCtx?.counter.value ?? formCtx?.counter.value },\n get counterFormat() { return fieldCtx?.counterFormat.value ?? formCtx?.counterFormat.value },\n}\n\n// @ts-ignore - Type too complexe\nconst config = useComponentConfig(\n INPUT_CONFIG,\n props,\n { size: 'md', type: 'text', counter: false },\n contextOverrides,\n)\n\n// ── Element ref + form field ─────────────────────────────────────────────────\n\nconst inputEl = useTemplateRef('inputEl')\n\nconst { field, onBlur, clearError } = useFormField({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\n// When inside a FormField: field context owns the value.\n// Standalone: falls back to defineModel, then defaultValue.\nconst resolvedValue = computed(() =>\n field ? field.value.value : (model.value ?? props.defaultValue),\n)\n\nfunction handleUpdate(event: Event): void {\n const raw = (event.target as HTMLInputElement).value\n model.value = raw\n field?.setValue(raw)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => String(resolvedValue.value ?? '').length)\n\nconst showCounter = computed(() => isTrue(config.value.counter))\n\nconst formattedCounter = computed(() => {\n const fmt = config.value.counterFormat ?? '{current} / {max}'\n const current = currentLength.value\n const min = config.value.minLength\n const max = config.value.maxLength\n\n if (typeof fmt === 'function') return fmt(current, min, max)\n\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\n// ── Error display ────────────────────────────────────────────────────────────\n\n// Active error from FormField context (available in both standalone and form modes).\n// When inside FormField, the FormField owns the error text rendering.\n// When standalone, we render it in the bottom label row below.\nconst activeError = computed(() => field?.error.value)\n\n// Error color applied to the input element itself in both modes.\nconst hasError = computed(() => !!activeError.value)\n</script>\n\n<template>\n <div class=\"w-full\">\n <!-- Top label row — standalone use only (FormField owns label when present) -->\n <div v-if=\"!field && (label || $slots.label)\" class=\"label\">\n <span class=\"label-text\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n </div>\n\n <input\n ref=\"inputEl\"\n class=\"input w-full\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n getClass(variants, config.variant),\n { 'input-error': hasError },\n ]\"\n :type=\"config.type\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n :placeholder=\"placeholder\"\n :autocomplete=\"autocomplete\"\n :pattern=\"pattern\"\n :title=\"title\"\n :maxlength=\"config.maxLength\"\n :minlength=\"config.minLength\"\n @input=\"handleUpdate\"\n @blur=\"onBlur\"\n />\n\n <!-- Bottom label row — standalone use only -->\n <div\n v-if=\"!field && (activeError || hint || $slots.hint || showCounter)\"\n class=\"label\"\n >\n <span\n class=\"label-text-alt\"\n :class=\"{ 'text-error': activeError }\"\n >\n <slot name=\"hint\">{{ activeError || hint }}</slot>\n </span>\n <span v-if=\"showCounter\" class=\"label-text-alt\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n {{ formattedCounter }}\n </slot>\n </span>\n </div>\n\n <!-- Counter slot exposed for FormField's bottom row when inside a FormField -->\n <template v-if=\"field && showCounter\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n <!-- rendered by FormField in its own label row -->\n </slot>\n </template>\n </div>\n</template>","<script lang=\"ts\">\nimport { FORM_CONTEXT_KEY } from '@/components/data/form/form.context'\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, useTemplateRef } from 'vue'\nimport { INPUT_CONFIG } from './input.context'\nimport type { InputProps } from './input.props'\nimport type { InputColor, InputSize, InputVariant } from './input.types'\n\nconst colors: ComponentClass<'input', InputColor> = {\n neutral: 'input-neutral',\n primary: 'input-primary',\n secondary: 'input-secondary',\n accent: 'input-accent',\n info: 'input-info',\n success: 'input-success',\n warning: 'input-warning',\n error: 'input-error',\n}\n\nconst sizes: ComponentClass<'input', InputSize> = {\n xs: 'input-xs',\n sm: 'input-sm',\n md: 'input-md',\n lg: 'input-lg',\n xl: 'input-xl',\n}\n\nconst variants: ComponentClass<'input', InputVariant> = {\n bordered: 'input-bordered',\n ghost: 'input-ghost',\n}\n</script>\n\n<script setup lang=\"ts\">\n\nconst props = defineProps<InputProps>()\n\n/**\n * Bound value. Supports `.number` and `.trim` modifiers.\n * - `v-model.number` → coerces to number\n * - `v-model.trim` → trims whitespace on update\n */\nconst model = defineModel<string | number>()\n\n// ── Context injection ────────────────────────────────────────────────────────\n\nconst formCtx = inject(FORM_CONTEXT_KEY, null)\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null)\n\n// contextOverrides: Form/FormField counter values fed into mergeProps.\n// Priority: fieldCtx (own prop) → formCtx (own prop).\n// Both are raw boolean | undefined — undefined is skipped by mergeProps.\n// contextOverrides feeds Form/FormField counter values into the mergeProps chain.\n// Passed as a getter so useComponentConfig's computed stays reactive to context changes.\nconst contextOverrides = {\n get counter() { return fieldCtx?.counter.value ?? formCtx?.counter.value },\n get counterFormat() { return fieldCtx?.counterFormat.value ?? formCtx?.counterFormat.value },\n}\n\n// @ts-ignore - Type too complexe\nconst config = useComponentConfig(\n INPUT_CONFIG,\n props,\n { size: 'md', type: 'text', counter: false },\n contextOverrides,\n)\n\n// ── Element ref + form field ─────────────────────────────────────────────────\n\nconst inputEl = useTemplateRef('inputEl')\n\nconst { field, onBlur, clearError } = useFormField({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\n// When inside a FormField: field context owns the value.\n// Standalone: falls back to defineModel, then defaultValue.\nconst resolvedValue = computed(() =>\n field ? field.value.value : (model.value ?? props.defaultValue),\n)\n\nfunction handleUpdate(event: Event): void {\n const raw = (event.target as HTMLInputElement).value\n model.value = raw\n field?.setValue(raw)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => String(resolvedValue.value ?? '').length)\n\nconst showCounter = computed(() => isTrue(config.value.counter))\n\nconst formattedCounter = computed(() => {\n const fmt = config.value.counterFormat ?? '{current} / {max}'\n const current = currentLength.value\n const min = config.value.minLength\n const max = config.value.maxLength\n\n if (typeof fmt === 'function') return fmt(current, min, max)\n\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\n// ── Error display ────────────────────────────────────────────────────────────\n\n// Active error from FormField context (available in both standalone and form modes).\n// When inside FormField, the FormField owns the error text rendering.\n// When standalone, we render it in the bottom label row below.\nconst activeError = computed(() => field?.error.value)\n\n// Error color applied to the input element itself in both modes.\nconst hasError = computed(() => !!activeError.value)\n</script>\n\n<template>\n <div class=\"w-full\">\n <!-- Top label row — standalone use only (FormField owns label when present) -->\n <div v-if=\"!field && (label || $slots.label)\" class=\"label\">\n <span class=\"label-text\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n </div>\n\n <input\n ref=\"inputEl\"\n class=\"input w-full\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n getClass(variants, config.variant),\n { 'input-error': hasError },\n ]\"\n :type=\"config.type\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n :placeholder=\"placeholder\"\n :autocomplete=\"autocomplete\"\n :pattern=\"pattern\"\n :title=\"title\"\n :maxlength=\"config.maxLength\"\n :minlength=\"config.minLength\"\n @input=\"handleUpdate\"\n @blur=\"onBlur\"\n />\n\n <!-- Bottom label row — standalone use only -->\n <div\n v-if=\"!field && (activeError || hint || $slots.hint || showCounter)\"\n class=\"label\"\n >\n <span\n class=\"label-text-alt\"\n :class=\"{ 'text-error': activeError }\"\n >\n <slot name=\"hint\">{{ activeError || hint }}</slot>\n </span>\n <span v-if=\"showCounter\" class=\"label-text-alt\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n {{ formattedCounter }}\n </slot>\n </span>\n </div>\n\n <!-- Counter slot exposed for FormField's bottom row when inside a FormField -->\n <template v-if=\"field && showCounter\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n <!-- rendered by FormField in its own label row -->\n </slot>\n </template>\n </div>\n</template>","import { createComponentConfigKey } from '@/symbol'\n\nexport const RADIO_CONFIG = createComponentConfigKey('radio')\n","<script lang=\"ts\">\nimport type { FormFieldContext } from '@/components/data/form-field/form-field.context'\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, useId, useTemplateRef, watch } from 'vue'\nimport { RADIO_CONFIG } from './radio.context'\nimport type { RadioProps } from './radio.props'\nimport type { RadioColor, RadioSize } from './radio.types'\n\nconst colors: ComponentClass<'radio', RadioColor> = {\n neutral: 'radio-neutral',\n primary: 'radio-primary',\n secondary: 'radio-secondary',\n accent: 'radio-accent',\n info: 'radio-info',\n success: 'radio-success',\n warning: 'radio-warning',\n error: 'radio-error',\n}\n\nconst sizes: ComponentClass<'radio', RadioSize> = {\n xs: 'radio-xs',\n sm: 'radio-sm',\n md: 'radio-md',\n lg: 'radio-lg',\n xl: 'radio-xl',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<RadioProps>()\nconst model = defineModel<string | number | boolean>()\nconst inputEl = useTemplateRef('inputEl')\n\nconst config = useComponentConfig(RADIO_CONFIG, props, {\n size: 'md',\n})\n\nconst inputId = `radio-${useId()}`\n\n// Try to get name from FormField context\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null as FormFieldContext | null)\nconst resolvedName = computed(() => props.name ?? fieldCtx?.name ?? 'radio-group')\n\n// Bridge to form field context\nconst { field, onBlur } = useFormField({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// Resolved value: field context wins when inside FormField\nconst resolvedValue = computed(() =>\n field ? field.value.value : model.value\n)\n\n// Checked state\nconst isChecked = computed(() => resolvedValue.value === props.value)\n\n// Sync model with field context\nwatch(\n () => field?.value.value,\n (val) => {\n if (val !== undefined && model.value !== val) {\n model.value = val as string | number | boolean\n }\n }\n)\n\nfunction handleChange(): void {\n const value = props.value\n model.value = value\n field?.setValue(value)\n field?.setDirty(true)\n}\n\nfunction handleBlur(): void {\n onBlur()\n}\n</script>\n\n<template>\n <div class=\"flex items-center gap-3\">\n <input\n ref=\"inputEl\"\n :id=\"inputId\"\n type=\"radio\"\n class=\"radio bg-base-200\"\n :class=\"[getClass(colors, config.color), getClass(sizes, config.size)]\"\n :name=\"resolvedName\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :required=\"required\"\n @change=\"handleChange\"\n @blur=\"handleBlur\"\n />\n <label v-if=\"description || $slots.description\" :for=\"inputId\" class=\"text-sm text-base-content/70 cursor-pointer\">\n <slot name=\"description\">{{ description }}</slot>\n </label>\n </div>\n</template>\n","<script lang=\"ts\">\nimport type { FormFieldContext } from '@/components/data/form-field/form-field.context'\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, useId, useTemplateRef, watch } from 'vue'\nimport { RADIO_CONFIG } from './radio.context'\nimport type { RadioProps } from './radio.props'\nimport type { RadioColor, RadioSize } from './radio.types'\n\nconst colors: ComponentClass<'radio', RadioColor> = {\n neutral: 'radio-neutral',\n primary: 'radio-primary',\n secondary: 'radio-secondary',\n accent: 'radio-accent',\n info: 'radio-info',\n success: 'radio-success',\n warning: 'radio-warning',\n error: 'radio-error',\n}\n\nconst sizes: ComponentClass<'radio', RadioSize> = {\n xs: 'radio-xs',\n sm: 'radio-sm',\n md: 'radio-md',\n lg: 'radio-lg',\n xl: 'radio-xl',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<RadioProps>()\nconst model = defineModel<string | number | boolean>()\nconst inputEl = useTemplateRef('inputEl')\n\nconst config = useComponentConfig(RADIO_CONFIG, props, {\n size: 'md',\n})\n\nconst inputId = `radio-${useId()}`\n\n// Try to get name from FormField context\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null as FormFieldContext | null)\nconst resolvedName = computed(() => props.name ?? fieldCtx?.name ?? 'radio-group')\n\n// Bridge to form field context\nconst { field, onBlur } = useFormField({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// Resolved value: field context wins when inside FormField\nconst resolvedValue = computed(() =>\n field ? field.value.value : model.value\n)\n\n// Checked state\nconst isChecked = computed(() => resolvedValue.value === props.value)\n\n// Sync model with field context\nwatch(\n () => field?.value.value,\n (val) => {\n if (val !== undefined && model.value !== val) {\n model.value = val as string | number | boolean\n }\n }\n)\n\nfunction handleChange(): void {\n const value = props.value\n model.value = value\n field?.setValue(value)\n field?.setDirty(true)\n}\n\nfunction handleBlur(): void {\n onBlur()\n}\n</script>\n\n<template>\n <div class=\"flex items-center gap-3\">\n <input\n ref=\"inputEl\"\n :id=\"inputId\"\n type=\"radio\"\n class=\"radio bg-base-200\"\n :class=\"[getClass(colors, config.color), getClass(sizes, config.size)]\"\n :name=\"resolvedName\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :required=\"required\"\n @change=\"handleChange\"\n @blur=\"handleBlur\"\n />\n <label v-if=\"description || $slots.description\" :for=\"inputId\" class=\"text-sm text-base-content/70 cursor-pointer\">\n <slot name=\"description\">{{ description }}</slot>\n </label>\n </div>\n</template>\n","import { createComponentConfigKey } from '@/symbol'\n\nexport const RATING_CONFIG = createComponentConfigKey('rating')\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, useTemplateRef } from 'vue'\nimport { RATING_CONFIG } from './rating.context'\nimport type { RatingProps } from './rating.props'\nimport type { RatingColor, RatingMask, RatingSize } from './rating.types'\n\nconst colors: ComponentClass<'bg', RatingColor> = {\n neutral: 'bg-neutral',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n accent: 'bg-accent',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-error',\n}\n\nconst sizes: ComponentClass<'rating', RatingSize> = {\n xs: 'rating-xs',\n sm: 'rating-sm',\n md: 'rating-md',\n lg: 'rating-lg',\n xl: 'rating-xl',\n}\n\nconst masks: ComponentClass<'mask', RatingMask> = {\n 'hexagon-2': 'mask-hexagon-2',\n 'star-2': 'mask-star-2',\n 'triangle-2': 'mask-triangle-2',\n 'triangle-3': 'mask-triangle-3',\n 'triangle-4': 'mask-triangle-4',\n circle: 'mask-circle',\n decagon: 'mask-decagon',\n diamond: 'mask-diamond',\n heart: 'mask-heart',\n hexagon: 'mask-hexagon',\n pentagon: 'mask-pentagon',\n square: 'mask-square',\n squircle: 'mask-squircle',\n star: 'mask-star',\n triangle: 'mask-triangle',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<RatingProps>()\n\n/**\n * The current rating value (1-based star index).\n * In half mode, increments by 0.5 (e.g. 0.5, 1, 1.5, 2…).\n * A value of 0 means no star is selected.\n */\nconst model = defineModel<number>()\n\nconst config = useComponentConfig(RATING_CONFIG, props, {\n size: 'md',\n count: 5,\n half: false,\n clearable: true,\n mask: 'star',\n})\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\n// Rating uses a hidden input as the form field anchor for constraint validation\nconst hiddenEl = useTemplateRef('hiddenEl')\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<number>({\n required: computed(() => isTrue(props.required)),\n inputEl: hiddenEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() => field ? (fieldValue.value ?? 0) : (model.value ?? 0))\n\nfunction handleChange(value: number): void {\n model.value = value\n field?.setValue(value)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Star generation ──────────────────────────────────────────────────────────\n\ninterface StarInput {\n key: string\n value: number\n // full mode: 'mask-star' | half mode left half: 'mask-star-2 mask-half-1' | right half: 'mask-star-2 mask-half-2'\n maskClass: string\n}\n\nconst stars = computed<StarInput[]>(() => {\n const count = config.value.count ?? 5\n const half = isTrue(config.value.half)\n const result: StarInput[] = []\n const mask = getClass(masks, config.value.mask)\n\n for (let i = 1; i <= count; i++) {\n if (half) {\n result.push({\n key: `${i}-left`,\n value: i - 0.5,\n maskClass: `mask ${mask} mask-half-1`,\n })\n result.push({\n key: `${i}-right`,\n value: i,\n maskClass: `mask ${mask} mask-half-2`,\n })\n } else {\n result.push({\n key: String(i),\n value: i,\n maskClass: `mask ${mask}`,\n })\n }\n }\n\n return result\n})\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n</script>\n\n<template>\n <div\n class=\"rating\"\n :class=\"[\n getClass(sizes, config.size),\n { 'rating-half': isTrue(config.half) },\n { 'opacity-50 pointer-events-none': disabled },\n ]\"\n @blur.capture=\"onBlur\"\n >\n <!-- Hidden anchor input for constraint validation -->\n <input\n ref=\"hiddenEl\"\n type=\"radio\"\n class=\"hidden\"\n :required=\"isTrue(required)\"\n :checked=\"resolvedValue > 0\"\n />\n\n <!-- Clear affordance — hidden radio at index 0 -->\n <input\n v-if=\"isTrue(config.clearable)\"\n type=\"radio\"\n class=\"rating-hidden\"\n name=\"rating\"\n :checked=\"resolvedValue === 0\"\n @change=\"handleChange(0)\"\n />\n\n <!-- Star inputs -->\n <input\n v-for=\"star in stars\"\n :key=\"star.key\"\n type=\"radio\"\n name=\"rating\"\n :class=\"[\n star.maskClass,\n getClass(colors, config.color),\n { 'border-error': hasError },\n ]\"\n :checked=\"resolvedValue === star.value\"\n :disabled=\"disabled\"\n @change=\"handleChange(star.value)\"\n />\n </div>\n</template>","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, useTemplateRef } from 'vue'\nimport { RATING_CONFIG } from './rating.context'\nimport type { RatingProps } from './rating.props'\nimport type { RatingColor, RatingMask, RatingSize } from './rating.types'\n\nconst colors: ComponentClass<'bg', RatingColor> = {\n neutral: 'bg-neutral',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n accent: 'bg-accent',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-error',\n}\n\nconst sizes: ComponentClass<'rating', RatingSize> = {\n xs: 'rating-xs',\n sm: 'rating-sm',\n md: 'rating-md',\n lg: 'rating-lg',\n xl: 'rating-xl',\n}\n\nconst masks: ComponentClass<'mask', RatingMask> = {\n 'hexagon-2': 'mask-hexagon-2',\n 'star-2': 'mask-star-2',\n 'triangle-2': 'mask-triangle-2',\n 'triangle-3': 'mask-triangle-3',\n 'triangle-4': 'mask-triangle-4',\n circle: 'mask-circle',\n decagon: 'mask-decagon',\n diamond: 'mask-diamond',\n heart: 'mask-heart',\n hexagon: 'mask-hexagon',\n pentagon: 'mask-pentagon',\n square: 'mask-square',\n squircle: 'mask-squircle',\n star: 'mask-star',\n triangle: 'mask-triangle',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<RatingProps>()\n\n/**\n * The current rating value (1-based star index).\n * In half mode, increments by 0.5 (e.g. 0.5, 1, 1.5, 2…).\n * A value of 0 means no star is selected.\n */\nconst model = defineModel<number>()\n\nconst config = useComponentConfig(RATING_CONFIG, props, {\n size: 'md',\n count: 5,\n half: false,\n clearable: true,\n mask: 'star',\n})\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\n// Rating uses a hidden input as the form field anchor for constraint validation\nconst hiddenEl = useTemplateRef('hiddenEl')\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<number>({\n required: computed(() => isTrue(props.required)),\n inputEl: hiddenEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() => field ? (fieldValue.value ?? 0) : (model.value ?? 0))\n\nfunction handleChange(value: number): void {\n model.value = value\n field?.setValue(value)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Star generation ──────────────────────────────────────────────────────────\n\ninterface StarInput {\n key: string\n value: number\n // full mode: 'mask-star' | half mode left half: 'mask-star-2 mask-half-1' | right half: 'mask-star-2 mask-half-2'\n maskClass: string\n}\n\nconst stars = computed<StarInput[]>(() => {\n const count = config.value.count ?? 5\n const half = isTrue(config.value.half)\n const result: StarInput[] = []\n const mask = getClass(masks, config.value.mask)\n\n for (let i = 1; i <= count; i++) {\n if (half) {\n result.push({\n key: `${i}-left`,\n value: i - 0.5,\n maskClass: `mask ${mask} mask-half-1`,\n })\n result.push({\n key: `${i}-right`,\n value: i,\n maskClass: `mask ${mask} mask-half-2`,\n })\n } else {\n result.push({\n key: String(i),\n value: i,\n maskClass: `mask ${mask}`,\n })\n }\n }\n\n return result\n})\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n</script>\n\n<template>\n <div\n class=\"rating\"\n :class=\"[\n getClass(sizes, config.size),\n { 'rating-half': isTrue(config.half) },\n { 'opacity-50 pointer-events-none': disabled },\n ]\"\n @blur.capture=\"onBlur\"\n >\n <!-- Hidden anchor input for constraint validation -->\n <input\n ref=\"hiddenEl\"\n type=\"radio\"\n class=\"hidden\"\n :required=\"isTrue(required)\"\n :checked=\"resolvedValue > 0\"\n />\n\n <!-- Clear affordance — hidden radio at index 0 -->\n <input\n v-if=\"isTrue(config.clearable)\"\n type=\"radio\"\n class=\"rating-hidden\"\n name=\"rating\"\n :checked=\"resolvedValue === 0\"\n @change=\"handleChange(0)\"\n />\n\n <!-- Star inputs -->\n <input\n v-for=\"star in stars\"\n :key=\"star.key\"\n type=\"radio\"\n name=\"rating\"\n :class=\"[\n star.maskClass,\n getClass(colors, config.color),\n { 'border-error': hasError },\n ]\"\n :checked=\"resolvedValue === star.value\"\n :disabled=\"disabled\"\n @change=\"handleChange(star.value)\"\n />\n </div>\n</template>","import { computed, type Ref } from 'vue'\n\nexport type SelectCounterFormatter = (count: number, min?: number, max?: number) => string\n\nexport function useSelectCounter(\n selectedCount: Ref<number>,\n options: {\n multiple?: Ref<boolean | undefined>\n min?: Ref<number | undefined>\n max?: Ref<number | undefined>\n formatter?: Ref<SelectCounterFormatter | undefined>\n },\n) {\n const counterText = computed(() => {\n if (!options.multiple?.value) {\n return null\n }\n\n if (!options.min?.value && !options.max?.value) {\n return null\n }\n\n if (options.formatter?.value) {\n return options.formatter.value(selectedCount.value, options.min?.value, options.max?.value)\n }\n\n if (options.max?.value) {\n return `${selectedCount.value} / ${options.max.value}`\n }\n\n return `${selectedCount.value}`\n })\n\n const counterColor = computed(() => {\n if (options.max?.value && selectedCount.value > options.max.value) {\n return 'text-error'\n }\n\n if (options.min?.value && selectedCount.value < options.min.value) {\n return 'text-warning'\n }\n\n return 'opacity-40'\n })\n\n const isAtMax = computed(() => {\n if (!options.max?.value || !options.multiple?.value) {\n return false\n }\n\n return selectedCount.value >= options.max.value\n })\n\n return {\n counterText,\n counterColor,\n isAtMax,\n }\n}\n","import { createComponentConfigKey } from '@/symbol'\n\nexport const SELECT_CONFIG = createComponentConfigKey('select')\n","<script lang=\"ts\">\nimport { Badge } from '@/components/display/public'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport { useSelectCounter } from '@/composables/use-select-counter'\nimport { getClass } from '@/utils/build-class.util'\nimport { ChevronDownIcon, XIcon } from '@lucide/vue'\nimport { onClickOutside } from '@vueuse/core'\nimport { computed, shallowRef, useAttrs, useId, useTemplateRef } from 'vue'\nimport { SELECT_CONFIG } from './select.context'\nimport type { SelectProps } from './select.props'\nimport type { SelectColor, SelectOption, SelectSize, SelectVariant } from './select.types'\n\nconst selectColors: Record<SelectColor, `select-${SelectColor}`> = {\n neutral: 'select-neutral',\n primary: 'select-primary',\n secondary: 'select-secondary',\n accent: 'select-accent',\n info: 'select-info',\n success: 'select-success',\n warning: 'select-warning',\n error: 'select-error',\n}\n\nconst selectSizes: Record<SelectSize, `select-${SelectSize}`> = {\n xs: 'select-xs',\n sm: 'select-sm',\n md: 'select-md',\n lg: 'select-lg',\n xl: 'select-xl',\n}\n\nconst selectVariants: Record<SelectVariant, `select-${SelectVariant}`> = {\n bordered: 'select-bordered',\n ghost: 'select-ghost',\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T = any, M extends boolean = false\">\ntype ModelType = M extends true ? T[] : T | undefined\n\ndefineOptions({ inheritAttrs: false })\n\nconst emit = defineEmits<{\n clear: []\n}>()\n\nconst containerEl = useTemplateRef('containerEl')\nconst triggerEl = useTemplateRef('triggerEl')\n\nconst model = defineModel<ModelType>()\nconst props = defineProps<SelectProps<T, M>>()\n\n// @ts-expect-error - Ignored due to the genereic in script\nconst config = useComponentConfig(SELECT_CONFIG, props, {\n size: 'md',\n clearable: false,\n})\n\nconst anchorName = `--select-anchor-${useId()}`\nconst attrs = useAttrs()\nconst isOpen = shallowRef(false)\n\nconst { field, fieldValue, hasServerError, onBlur, clearError } = useFormField<ModelType>({\n required: computed(() => props.required ?? false),\n})\n\nonClickOutside(containerEl, () => {\n if (isOpen.value) {\n isOpen.value = false\n onBlur()\n }\n})\n\nconst value = computed(() => field ? fieldValue.value : model.value)\n\nconst minItems = computed(() => (attrs.min ? Number(attrs.min) : undefined))\nconst maxItems = computed(() => (attrs.max ? Number(attrs.max) : undefined))\n\nconst selectedCount = computed(() => {\n if (!props.multiple || !Array.isArray(value.value)) return 0\n return (value.value as T[]).length\n})\n\nconst { counterText, counterColor, isAtMax } = useSelectCounter(selectedCount, {\n multiple: computed(() => props.multiple),\n min: minItems,\n max: maxItems,\n formatter: computed(() => config.value.counterFormatter),\n})\n\nconst hasValue = computed(() => {\n if (props.multiple) {\n return Array.isArray(value.value) && (value.value as T[]).length > 0\n }\n return value.value !== undefined && value.value !== null && value.value !== ''\n})\n\nconst selectedOptions = computed(() => {\n if (!props.options) return []\n const current = value.value\n if (!current) return []\n if (props.multiple && Array.isArray(current)) {\n return props.options.filter(o => (current as T[]).some(v => isEqual(o.value, v)))\n }\n const found = props.options.find(o => isEqual(o.value, current as T))\n return found ? [found] : []\n})\n\nfunction isEqual(a: T, b: T): boolean {\n if (!props.equals) return a === b\n if (typeof props.equals === 'function') return (props.equals as (a: T, b: T) => boolean)(a, b)\n return (a as any)?.[props.equals] === (b as any)?.[props.equals]\n}\n\nfunction isOptionSelected(option: SelectOption<T>): boolean {\n const current = value.value\n if (props.multiple && Array.isArray(current)) {\n return (current as T[]).some(v => isEqual(v, option.value))\n }\n return isEqual(current as T, option.value)\n}\n\nfunction isOptionDisabled(option: SelectOption<T>): boolean {\n return isAtMax.value && !isOptionSelected(option)\n}\n\nfunction setValue(next: ModelType): void {\n model.value = next\n if (field) {\n field.setValue(next)\n field.setDirty(true)\n clearError()\n }\n}\n\nfunction select(option: SelectOption<T>): void {\n if (isOptionDisabled(option)) return\n\n if (props.multiple) {\n const current = (Array.isArray(value.value) ? value.value : []) as T[]\n const exists = current.some(v => isEqual(v, option.value))\n const next = exists\n ? current.filter(v => !isEqual(v, option.value))\n : [...current, option.value]\n setValue(next as ModelType)\n return\n }\n\n if (isOptionSelected(option)) {\n if (config.value.clearable) {\n setValue(undefined as ModelType)\n isOpen.value = false\n }\n return\n }\n\n setValue(option.value as ModelType)\n isOpen.value = false\n}\n\nfunction removeSelected(option: SelectOption<T>): void {\n if (!props.multiple) return\n const current = (Array.isArray(value.value) ? value.value : []) as T[]\n setValue(current.filter(v => !isEqual(v, option.value)) as ModelType)\n}\n\nfunction onClear(): void {\n setValue((props.multiple ? [] : undefined) as ModelType)\n emit('clear')\n}\n\nfunction open(): void {\n if (props.disabled) return\n isOpen.value = true\n}\n\nfunction close(): void {\n if (props.disabled) return\n isOpen.value = false\n}\n\nfunction toggle(): void {\n isOpen.value ? close() : open()\n}\n\ndefineExpose({\n $el: triggerEl,\n clear: onClear,\n open,\n close,\n toggle,\n})\n</script>\n\n<template>\n <div class=\"w-full flex flex-col gap-1\">\n <div ref=\"containerEl\" class=\"relative w-full anchor-trigger\" v-bind=\"$attrs\">\n <input type=\"hidden\" :name=\"field?.name ?? name\" :value=\"(model as any)\" />\n\n <button\n ref=\"triggerEl\"\n type=\"button\"\n class=\"select w-full text-left min-h-10 h-auto py-2 pr-10\"\n :class=\"[\n getClass(selectColors, config.color),\n getClass(selectSizes, config.size),\n getClass(selectVariants, config.variant),\n disabled && 'select-disabled',\n hasServerError && 'select-error',\n ]\"\n :tabindex=\"disabled ? '-1' : undefined\"\n :disabled=\"disabled\"\n @click=\"toggle()\"\n >\n <div v-if=\"multiple && selectedOptions.length > 0\" class=\"flex flex-wrap gap-1\">\n <slot\n v-for=\"opt in selectedOptions\"\n :key=\"String(opt.value)\"\n name=\"selected\"\n :option=\"opt\"\n :remove=\"() => removeSelected(opt)\"\n >\n <Badge color=\"primary\" size=\"sm\" class=\"gap-1 cursor-default\">\n {{ opt.label }}\n <button\n type=\"button\"\n class=\"hover:opacity-70\"\n @click.stop=\"removeSelected(opt)\"\n >\n <XIcon class=\"size-3\" />\n </button>\n </Badge>\n </slot>\n </div>\n\n <template v-else-if=\"!multiple && selectedOptions.length > 0\">\n <slot name=\"selected\" :option=\"selectedOptions[0]\" :remove=\"onClear\">\n <span>{{ selectedOptions[0]?.label }}</span>\n </slot>\n </template>\n\n <span v-else class=\"opacity-40\">\n {{ placeholder || $t('common.field.select.placeholder') }}\n </span>\n </button>\n\n <ChevronDownIcon\n class=\"absolute right-3 top-1/2 -translate-y-1/2 size-4 opacity-40 pointer-events-none transition-transform\"\n :class=\"isOpen && 'rotate-180'\"\n />\n\n <button\n v-if=\"config.clearable && hasValue\"\n type=\"button\"\n class=\"absolute right-8 top-1/2 -translate-y-1/2 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100\"\n @click=\"onClear\"\n >\n <XIcon class=\"size-3\" />\n </button>\n\n <Transition name=\"dropdown\">\n <div\n v-if=\"isOpen && options\"\n class=\"anchor-dropdown absolute z-50 w-full bg-base-100 border border-base-300 rounded-box shadow-lg overflow-hidden\"\n >\n <ul class=\"max-h-56 overflow-y-auto py-1\">\n <li\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n class=\"px-4 py-2 text-sm cursor-pointer hover:bg-base-200\"\n :class=\"[\n isOptionSelected(option) && 'bg-primary/10 text-primary',\n isOptionDisabled(option) && 'opacity-30 cursor-not-allowed pointer-events-none',\n ]\"\n @mousedown.prevent=\"select(option)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isOptionSelected(option)\">\n {{ option.label }}\n </slot>\n </li>\n\n <li v-if=\"options.length === 0\" class=\"px-4 py-3 text-sm opacity-40 text-center\">\n {{ $t('common.field.select.empty') }}\n </li>\n </ul>\n </div>\n </Transition>\n </div>\n\n <div v-if=\"multiple && counterText\" class=\"flex justify-end\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n </div>\n</template>\n\n<style scoped>\n.select {\n background-image: initial;\n background-position: initial;\n background-size: initial;\n background-repeat: initial;\n}\n\n.anchor-trigger {\n anchor-name: v-bind(anchorName);\n}\n\n.anchor-dropdown {\n position-anchor: v-bind(anchorName);\n position-area: block-end center;\n position-try-fallbacks: flip-block, flip-inline;\n position-try-order: most-height;\n left: anchor(left);\n right: anchor(right);\n margin-block-start: 4px;\n}\n\n.dropdown-enter-active,\n.dropdown-leave-active {\n transition: opacity 0.15s ease, transform 0.15s ease;\n}\n\n.dropdown-enter-from,\n.dropdown-leave-to {\n opacity: 0;\n transform: translateY(-4px);\n}\n</style>","<script lang=\"ts\">\nimport { Badge } from '@/components/display/public'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport { useSelectCounter } from '@/composables/use-select-counter'\nimport { getClass } from '@/utils/build-class.util'\nimport { ChevronDownIcon, XIcon } from '@lucide/vue'\nimport { onClickOutside } from '@vueuse/core'\nimport { computed, shallowRef, useAttrs, useId, useTemplateRef } from 'vue'\nimport { SELECT_CONFIG } from './select.context'\nimport type { SelectProps } from './select.props'\nimport type { SelectColor, SelectOption, SelectSize, SelectVariant } from './select.types'\n\nconst selectColors: Record<SelectColor, `select-${SelectColor}`> = {\n neutral: 'select-neutral',\n primary: 'select-primary',\n secondary: 'select-secondary',\n accent: 'select-accent',\n info: 'select-info',\n success: 'select-success',\n warning: 'select-warning',\n error: 'select-error',\n}\n\nconst selectSizes: Record<SelectSize, `select-${SelectSize}`> = {\n xs: 'select-xs',\n sm: 'select-sm',\n md: 'select-md',\n lg: 'select-lg',\n xl: 'select-xl',\n}\n\nconst selectVariants: Record<SelectVariant, `select-${SelectVariant}`> = {\n bordered: 'select-bordered',\n ghost: 'select-ghost',\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"T = any, M extends boolean = false\">\ntype ModelType = M extends true ? T[] : T | undefined\n\ndefineOptions({ inheritAttrs: false })\n\nconst emit = defineEmits<{\n clear: []\n}>()\n\nconst containerEl = useTemplateRef('containerEl')\nconst triggerEl = useTemplateRef('triggerEl')\n\nconst model = defineModel<ModelType>()\nconst props = defineProps<SelectProps<T, M>>()\n\n// @ts-expect-error - Ignored due to the genereic in script\nconst config = useComponentConfig(SELECT_CONFIG, props, {\n size: 'md',\n clearable: false,\n})\n\nconst anchorName = `--select-anchor-${useId()}`\nconst attrs = useAttrs()\nconst isOpen = shallowRef(false)\n\nconst { field, fieldValue, hasServerError, onBlur, clearError } = useFormField<ModelType>({\n required: computed(() => props.required ?? false),\n})\n\nonClickOutside(containerEl, () => {\n if (isOpen.value) {\n isOpen.value = false\n onBlur()\n }\n})\n\nconst value = computed(() => field ? fieldValue.value : model.value)\n\nconst minItems = computed(() => (attrs.min ? Number(attrs.min) : undefined))\nconst maxItems = computed(() => (attrs.max ? Number(attrs.max) : undefined))\n\nconst selectedCount = computed(() => {\n if (!props.multiple || !Array.isArray(value.value)) return 0\n return (value.value as T[]).length\n})\n\nconst { counterText, counterColor, isAtMax } = useSelectCounter(selectedCount, {\n multiple: computed(() => props.multiple),\n min: minItems,\n max: maxItems,\n formatter: computed(() => config.value.counterFormatter),\n})\n\nconst hasValue = computed(() => {\n if (props.multiple) {\n return Array.isArray(value.value) && (value.value as T[]).length > 0\n }\n return value.value !== undefined && value.value !== null && value.value !== ''\n})\n\nconst selectedOptions = computed(() => {\n if (!props.options) return []\n const current = value.value\n if (!current) return []\n if (props.multiple && Array.isArray(current)) {\n return props.options.filter(o => (current as T[]).some(v => isEqual(o.value, v)))\n }\n const found = props.options.find(o => isEqual(o.value, current as T))\n return found ? [found] : []\n})\n\nfunction isEqual(a: T, b: T): boolean {\n if (!props.equals) return a === b\n if (typeof props.equals === 'function') return (props.equals as (a: T, b: T) => boolean)(a, b)\n return (a as any)?.[props.equals] === (b as any)?.[props.equals]\n}\n\nfunction isOptionSelected(option: SelectOption<T>): boolean {\n const current = value.value\n if (props.multiple && Array.isArray(current)) {\n return (current as T[]).some(v => isEqual(v, option.value))\n }\n return isEqual(current as T, option.value)\n}\n\nfunction isOptionDisabled(option: SelectOption<T>): boolean {\n return isAtMax.value && !isOptionSelected(option)\n}\n\nfunction setValue(next: ModelType): void {\n model.value = next\n if (field) {\n field.setValue(next)\n field.setDirty(true)\n clearError()\n }\n}\n\nfunction select(option: SelectOption<T>): void {\n if (isOptionDisabled(option)) return\n\n if (props.multiple) {\n const current = (Array.isArray(value.value) ? value.value : []) as T[]\n const exists = current.some(v => isEqual(v, option.value))\n const next = exists\n ? current.filter(v => !isEqual(v, option.value))\n : [...current, option.value]\n setValue(next as ModelType)\n return\n }\n\n if (isOptionSelected(option)) {\n if (config.value.clearable) {\n setValue(undefined as ModelType)\n isOpen.value = false\n }\n return\n }\n\n setValue(option.value as ModelType)\n isOpen.value = false\n}\n\nfunction removeSelected(option: SelectOption<T>): void {\n if (!props.multiple) return\n const current = (Array.isArray(value.value) ? value.value : []) as T[]\n setValue(current.filter(v => !isEqual(v, option.value)) as ModelType)\n}\n\nfunction onClear(): void {\n setValue((props.multiple ? [] : undefined) as ModelType)\n emit('clear')\n}\n\nfunction open(): void {\n if (props.disabled) return\n isOpen.value = true\n}\n\nfunction close(): void {\n if (props.disabled) return\n isOpen.value = false\n}\n\nfunction toggle(): void {\n isOpen.value ? close() : open()\n}\n\ndefineExpose({\n $el: triggerEl,\n clear: onClear,\n open,\n close,\n toggle,\n})\n</script>\n\n<template>\n <div class=\"w-full flex flex-col gap-1\">\n <div ref=\"containerEl\" class=\"relative w-full anchor-trigger\" v-bind=\"$attrs\">\n <input type=\"hidden\" :name=\"field?.name ?? name\" :value=\"(model as any)\" />\n\n <button\n ref=\"triggerEl\"\n type=\"button\"\n class=\"select w-full text-left min-h-10 h-auto py-2 pr-10\"\n :class=\"[\n getClass(selectColors, config.color),\n getClass(selectSizes, config.size),\n getClass(selectVariants, config.variant),\n disabled && 'select-disabled',\n hasServerError && 'select-error',\n ]\"\n :tabindex=\"disabled ? '-1' : undefined\"\n :disabled=\"disabled\"\n @click=\"toggle()\"\n >\n <div v-if=\"multiple && selectedOptions.length > 0\" class=\"flex flex-wrap gap-1\">\n <slot\n v-for=\"opt in selectedOptions\"\n :key=\"String(opt.value)\"\n name=\"selected\"\n :option=\"opt\"\n :remove=\"() => removeSelected(opt)\"\n >\n <Badge color=\"primary\" size=\"sm\" class=\"gap-1 cursor-default\">\n {{ opt.label }}\n <button\n type=\"button\"\n class=\"hover:opacity-70\"\n @click.stop=\"removeSelected(opt)\"\n >\n <XIcon class=\"size-3\" />\n </button>\n </Badge>\n </slot>\n </div>\n\n <template v-else-if=\"!multiple && selectedOptions.length > 0\">\n <slot name=\"selected\" :option=\"selectedOptions[0]\" :remove=\"onClear\">\n <span>{{ selectedOptions[0]?.label }}</span>\n </slot>\n </template>\n\n <span v-else class=\"opacity-40\">\n {{ placeholder || $t('common.field.select.placeholder') }}\n </span>\n </button>\n\n <ChevronDownIcon\n class=\"absolute right-3 top-1/2 -translate-y-1/2 size-4 opacity-40 pointer-events-none transition-transform\"\n :class=\"isOpen && 'rotate-180'\"\n />\n\n <button\n v-if=\"config.clearable && hasValue\"\n type=\"button\"\n class=\"absolute right-8 top-1/2 -translate-y-1/2 btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100\"\n @click=\"onClear\"\n >\n <XIcon class=\"size-3\" />\n </button>\n\n <Transition name=\"dropdown\">\n <div\n v-if=\"isOpen && options\"\n class=\"anchor-dropdown absolute z-50 w-full bg-base-100 border border-base-300 rounded-box shadow-lg overflow-hidden\"\n >\n <ul class=\"max-h-56 overflow-y-auto py-1\">\n <li\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n class=\"px-4 py-2 text-sm cursor-pointer hover:bg-base-200\"\n :class=\"[\n isOptionSelected(option) && 'bg-primary/10 text-primary',\n isOptionDisabled(option) && 'opacity-30 cursor-not-allowed pointer-events-none',\n ]\"\n @mousedown.prevent=\"select(option)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isOptionSelected(option)\">\n {{ option.label }}\n </slot>\n </li>\n\n <li v-if=\"options.length === 0\" class=\"px-4 py-3 text-sm opacity-40 text-center\">\n {{ $t('common.field.select.empty') }}\n </li>\n </ul>\n </div>\n </Transition>\n </div>\n\n <div v-if=\"multiple && counterText\" class=\"flex justify-end\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n </div>\n</template>\n\n<style scoped>\n.select {\n background-image: initial;\n background-position: initial;\n background-size: initial;\n background-repeat: initial;\n}\n\n.anchor-trigger {\n anchor-name: v-bind(anchorName);\n}\n\n.anchor-dropdown {\n position-anchor: v-bind(anchorName);\n position-area: block-end center;\n position-try-fallbacks: flip-block, flip-inline;\n position-try-order: most-height;\n left: anchor(left);\n right: anchor(right);\n margin-block-start: 4px;\n}\n\n.dropdown-enter-active,\n.dropdown-leave-active {\n transition: opacity 0.15s ease, transform 0.15s ease;\n}\n\n.dropdown-enter-from,\n.dropdown-leave-to {\n opacity: 0;\n transform: translateY(-4px);\n}\n</style>","import { createComponentConfigKey } from '@/symbol'\n\nexport const SLIDER_CONFIG = createComponentConfigKey('slider')\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { getClass } from '@/utils/build-class.util'\nimport { useTemplateRefsList } from '@vueuse/core'\nimport { computed, onBeforeUnmount, ref, shallowRef, useTemplateRef, watch } from 'vue'\nimport { SLIDER_CONFIG } from './slider.context'\nimport type { SliderProps } from './slider.props'\nimport type { SliderColor, SliderSize } from './slider.types'\n\nconst colors: Record<SliderColor, string> = {\n neutral: 'slider--neutral',\n primary: 'slider--primary',\n secondary: 'slider--secondary',\n accent: 'slider--accent',\n info: 'slider--info',\n success: 'slider--success',\n warning: 'slider--warning',\n error: 'slider--error',\n}\n\nconst sizes: Record<SliderSize, string> = {\n xs: 'slider--xs',\n sm: 'slider--sm',\n md: 'slider--md',\n lg: 'slider--lg',\n xl: 'slider--xl',\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"R extends boolean = false\">\ntype ModelType = R extends true ? [number, number] : number\n\nconst props = defineProps<SliderProps<R>>()\nconst model = defineModel<ModelType>()\n\n// @ts-expect-error - Ignored due to the genereic in script\nconst config = useComponentConfig(SLIDER_CONFIG, props, {\n color: undefined,\n size: 'md',\n track: 'normal',\n min: 0,\n max: 100,\n step: 1,\n range: false,\n orientation: 'horizontal',\n showTooltip: 'hover',\n disableSwap: false,\n})\n\nconst emit = defineEmits<{\n input: [value: ModelType]\n change: [value: ModelType]\n}>()\n\nconst sliderRoot = useTemplateRef('sliderRoot')\nconst thumbRefs = useTemplateRefsList<HTMLElement>()\n\nconst isDragging = shallowRef(false)\nconst activeThumbIndex = shallowRef<number | null>(null)\nconst isHovering = shallowRef(false)\nconst hoverThumbIndex = shallowRef<number | null>(null)\n\n// Internal mechanical values (always in min-max range)\nconst mechanicalValues = ref<number[]>([])\n\n// Initialize mechanical values\nconst initMechanicalValues = () => {\n const defaultMin = props.min ?? 0\n const defaultMax = props.max ?? 100\n\n if (props.range || Array.isArray(model.value)) {\n const initial = model.value\n ? Array.isArray(model.value)\n ? model.value\n : [defaultMin, defaultMax]\n : [defaultMin, defaultMax]\n mechanicalValues.value = [\n Math.max(defaultMin, Math.min(defaultMax, initial[0])),\n Math.max(defaultMin, Math.min(defaultMax, initial[1])),\n ]\n } else {\n const value = model.value ?? defaultMin\n mechanicalValues.value = [Math.max(defaultMin, Math.min(defaultMax, value as number))]\n }\n}\n\ninitMechanicalValues()\n\n// Sync with prop changes (when not dragging)\nwatch(\n () => [model.value, props.range, props.min, props.max],\n () => {\n if (!isDragging.value) {\n initMechanicalValues()\n }\n },\n { deep: true },\n)\n\n// Computed properties\nconst isRange = computed(() => props.range || mechanicalValues.value.length > 1)\nconst displayThumbValues = computed(() => mechanicalValues.value)\n\n// Should we render the track?\nconst shouldRenderTrack = computed(() => config.value.track !== 'none')\n\n// Effective min/max/step with defaults\nconst effectiveMin = computed(() => config.value.min!)\nconst effectiveMax = computed(() => config.value.max!)\nconst effectiveStep = computed(() => config.value.step!)\n\n// Scaled min/max for ARIA\nconst scaledMin = computed(() => props.scale?.(effectiveMin.value) ?? effectiveMin.value)\nconst scaledMax = computed(() => props.scale?.(effectiveMax.value) ?? effectiveMax.value)\n\n// Get config values safely\nconst configDisableSwap = computed(() => props.disableSwap ?? false)\n\n// Calculate percentage from mechanical value\nconst getPercent = (mechanicalValue: number): number => {\n const range = effectiveMax.value - effectiveMin.value\n if (range === 0) return 0\n return ((mechanicalValue - effectiveMin.value) / range) * 100\n}\n\n// Get mechanical value from percentage\nconst getMechanicalValueFromPercent = (percent: number): number => {\n const range = effectiveMax.value - effectiveMin.value\n let mechanical = effectiveMin.value + (percent / 100) * range\n\n if (effectiveStep.value > 0) {\n const steps = Math.round((mechanical - effectiveMin.value) / effectiveStep.value)\n mechanical = effectiveMin.value + steps * effectiveStep.value\n }\n\n return Math.min(effectiveMax.value, Math.max(effectiveMin.value, mechanical))\n}\n\n// Track style based on track mode\nconst trackStyle = computed(() => {\n const percent0 = getPercent(displayThumbValues.value[0])\n const percent1 = isRange.value ? getPercent(displayThumbValues.value[1]) : 0\n\n const minPercent = Math.min(percent0, percent1)\n const maxPercent = Math.max(percent0, percent1)\n\n if (isRange.value) {\n if (config.value.track === 'inverted') {\n // Normal track for inverted mode will be hidden, we use separate elements\n return { display: 'none' }\n }\n // Normal: show track between thumbs\n if (props.orientation === 'vertical') {\n return {\n bottom: `${minPercent}%`,\n height: `${maxPercent - minPercent}%`,\n }\n }\n return {\n left: `${minPercent}%`,\n width: `${maxPercent - minPercent}%`,\n }\n }\n // Single thumb\n if (config.value.track === 'inverted') {\n if (props.orientation === 'vertical') {\n return {\n bottom: `${percent0}%`,\n height: `${100 - percent0}%`,\n }\n }\n return {\n left: `${percent0}%`,\n width: `${100 - percent0}%`,\n }\n }\n if (props.orientation === 'vertical') {\n return {\n bottom: '0%',\n height: `${percent0}%`,\n }\n }\n return {\n left: '0%',\n width: `${percent0}%`,\n }\n})\n\n// Inverted track styles for range mode\nconst invertedTrackStartStyle = computed(() => {\n if (!isRange.value || config.value.track !== 'inverted') return {}\n const minVal = Math.min(displayThumbValues.value[0], displayThumbValues.value[1])\n const minPercent = getPercent(minVal)\n if (props.orientation === 'vertical') {\n return {\n bottom: '0%',\n height: `${minPercent}%`,\n }\n }\n return {\n left: '0%',\n width: `${minPercent}%`,\n }\n})\n\nconst invertedTrackEndStyle = computed(() => {\n if (!isRange.value || config.value.track !== 'inverted') return {}\n const maxVal = Math.max(displayThumbValues.value[0], displayThumbValues.value[1])\n const maxPercent = getPercent(maxVal)\n if (props.orientation === 'vertical') {\n return {\n bottom: `${maxPercent}%`,\n height: `${100 - maxPercent}%`,\n }\n }\n return {\n left: `${maxPercent}%`,\n width: `${100 - maxPercent}%`,\n }\n})\n\n// Thumb style\nconst getThumbStyle = (thumbIndex: number) => {\n const percent = getPercent(displayThumbValues.value[thumbIndex])\n if (props.orientation === 'vertical') {\n return {\n bottom: `${percent}%`,\n left: '50%',\n transform: 'translateX(-50%)',\n }\n }\n return {\n left: `${percent}%`,\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }\n}\n\n// Tooltip style\nconst getTooltipStyle = (thumbIndex: number) => {\n const percent = getPercent(displayThumbValues.value[thumbIndex])\n if (props.orientation === 'vertical') {\n return {\n bottom: `${percent + 10}%`,\n left: '50%',\n transform: 'translateX(-50%)',\n }\n }\n return {\n left: `${percent}%`,\n top: '-32px',\n transform: 'translateX(-50%)',\n }\n}\n\n// Format value for display (applies scale if available)\nconst formatValueForDisplay = (mechanicalValue: number): string => {\n if (props.scale) {\n return String(props.scale(mechanicalValue))\n }\n return String(mechanicalValue)\n}\n\n// Get ARIA value (applies scale if available)\nconst getAriaValue = (thumbIndex: number): number => {\n if (props.scale) {\n return props.scale(displayThumbValues.value[thumbIndex])\n }\n return displayThumbValues.value[thumbIndex]\n}\n\n// Tooltip visibility\nconst shouldShowTooltip = (thumbIndex: number): boolean => {\n if (props.showTooltip === 'never') return false\n if (props.showTooltip === 'always') return true\n return (\n (isHovering.value && hoverThumbIndex.value === thumbIndex) ||\n (isDragging.value && activeThumbIndex.value === thumbIndex)\n )\n}\n\n// ARIA\nconst computedAriaLabel = computed(() => props.ariaLabel || 'Slider')\n\nconst getThumbAriaLabel = (thumbIndex: number): string => {\n if (isRange.value) {\n return thumbIndex === 0 ? `${computedAriaLabel.value} - Minimum` : `${computedAriaLabel.value} - Maximum`\n }\n return computedAriaLabel.value\n}\n\n// Value from position (returns mechanical value)\nfunction getMechanicalValueFromPosition(clientX: number, clientY: number): number {\n if (!sliderRoot.value) return effectiveMin.value\n\n const rect = sliderRoot.value.getBoundingClientRect()\n let percent: number\n\n if (props.orientation === 'vertical') {\n const y = clientY - rect.top\n percent = 1 - y / rect.height\n } else {\n const x = clientX - rect.left\n percent = x / rect.width\n }\n\n percent = Math.max(0, Math.min(1, percent))\n return getMechanicalValueFromPercent(percent * 100)\n}\n\n// Find closest thumb index\nfunction findClosestThumb(mechanicalValue: number): number {\n if (!isRange.value) return 0\n\n const dist0 = Math.abs(mechanicalValue - displayThumbValues.value[0])\n const dist1 = Math.abs(mechanicalValue - displayThumbValues.value[1])\n return dist0 < dist1 ? 0 : 1\n}\n\n// Update mechanical values with swap logic\nfunction updateMechanicalValue(newMechanicalValue: number, thumbIndex: number) {\n if (isRange.value) {\n const nextValues = [...displayThumbValues.value]\n\n if (configDisableSwap.value) {\n // Prevent crossing: clamp to other thumb\n if (thumbIndex === 0) {\n nextValues[0] = Math.min(newMechanicalValue, nextValues[1])\n } else {\n nextValues[1] = Math.max(newMechanicalValue, nextValues[0])\n }\n } else {\n // Allow swap: set the value directly\n nextValues[thumbIndex] = newMechanicalValue\n\n // Always keep values sorted: index 0 = min, index 1 = max\n if (nextValues[0] > nextValues[1]) {\n // Swap the values\n ;[nextValues[0], nextValues[1]] = [nextValues[1], nextValues[0]]\n // Swap active thumb index so user continues controlling the same visual thumb\n if (isDragging.value && activeThumbIndex.value !== null) {\n activeThumbIndex.value = activeThumbIndex.value === 0 ? 1 : 0\n }\n }\n }\n\n mechanicalValues.value = nextValues\n const scaledValues: [number, number] = [\n props.scale ? props.scale(nextValues[0]) : nextValues[0],\n props.scale ? props.scale(nextValues[1]) : nextValues[1],\n ]\n // @ts-expect-error\n model.value = scaledValues\n } else {\n mechanicalValues.value = [newMechanicalValue]\n const scaledValue = props.scale ? props.scale(newMechanicalValue) : newMechanicalValue\n // @ts-expect-error\n model.value = scaledValue\n }\n\n // @ts-expect-error\n emit('input', model.value)\n}\n\n// Handle rail click\nfunction handleRailClick(event: MouseEvent | TouchEvent) {\n if (props.disabled) return\n\n const clientX = 'touches' in event ? event.touches[0].clientX : event.clientX\n const clientY = 'touches' in event ? event.touches[0].clientY : event.clientY\n\n const clickValue = getMechanicalValueFromPosition(clientX, clientY)\n const thumbIndex = findClosestThumb(clickValue)\n\n updateMechanicalValue(clickValue, thumbIndex)\n\n if (event.type === 'mousedown' || ('touches' in event && event.touches.length > 0)) {\n isDragging.value = true\n activeThumbIndex.value = thumbIndex\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleEnd)\n window.addEventListener('touchmove', handleMove, { passive: false })\n window.addEventListener('touchend', handleEnd)\n }\n}\n\n// Handle thumb down\nfunction handleThumbDown(event: MouseEvent | TouchEvent, thumbIndex: number) {\n if (props.disabled) return\n\n event.preventDefault()\n event.stopPropagation()\n\n isDragging.value = true\n activeThumbIndex.value = thumbIndex\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleEnd)\n window.addEventListener('touchmove', handleMove, { passive: false })\n window.addEventListener('touchend', handleEnd)\n}\n\n// Handle move\nfunction handleMove(event: MouseEvent | TouchEvent) {\n if (!isDragging.value || activeThumbIndex.value === null) return\n\n const clientX = 'touches' in event ? event.touches[0].clientX : event.clientX\n const clientY = 'touches' in event ? event.touches[0].clientY : event.clientY\n\n const newValue = getMechanicalValueFromPosition(clientX, clientY)\n updateMechanicalValue(newValue, activeThumbIndex.value)\n}\n\n// Handle end\nfunction handleEnd() {\n if (!isDragging.value) return\n\n isDragging.value = false\n activeThumbIndex.value = null\n\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleEnd)\n window.removeEventListener('touchmove', handleMove)\n window.removeEventListener('touchend', handleEnd)\n\n // @ts-expect-error\n emit('change', model.value)\n}\n\n// Thumb hover/enter/leave\nfunction handleThumbEnter(thumbIndex: number) {\n isHovering.value = true\n hoverThumbIndex.value = thumbIndex\n}\n\nfunction handleThumbLeave() {\n isHovering.value = false\n hoverThumbIndex.value = null\n}\n\n// Focus handling\nfunction handleThumbFocus(_thumbIndex: number) {\n // No-op for now\n}\n\nfunction handleThumbBlur() {\n // @ts-expect-error\n emit('change', model.value)\n}\n\n// Container keydown\nfunction handleContainerKeydown(event: KeyboardEvent) {\n if (props.disabled) return\n if (event.key === 'Tab' && !isHovering.value) {\n event.preventDefault()\n thumbRefs.value[0]?.focus()\n }\n}\n\n// Thumb keyboard navigation\nfunction handleThumbKeydown(event: KeyboardEvent, thumbIndex: number) {\n if (props.disabled) return\n\n const currentValue = displayThumbValues.value[thumbIndex]\n let newValue: number\n\n const rangeSize = effectiveMax.value - effectiveMin.value\n const pageStep = rangeSize * 0.1\n const arrowStep = effectiveStep.value\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = currentValue + arrowStep\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = currentValue - arrowStep\n break\n case 'PageUp':\n newValue = currentValue + pageStep\n break\n case 'PageDown':\n newValue = currentValue - pageStep\n break\n case 'Home':\n newValue = effectiveMin.value\n break\n case 'End':\n newValue = effectiveMax.value\n break\n case 'Escape':\n isDragging.value = false\n activeThumbIndex.value = null\n // @ts-expect-error\n emit('change', model.value)\n return\n default:\n return\n }\n\n event.preventDefault()\n\n newValue = Math.min(effectiveMax.value, Math.max(effectiveMin.value, newValue))\n\n // Only prevent crossing if disableSwap is true\n if (isRange.value && configDisableSwap.value) {\n const otherValue = thumbIndex === 0 ? displayThumbValues.value[1] : displayThumbValues.value[0]\n if (thumbIndex === 0) {\n newValue = Math.min(newValue, otherValue)\n } else {\n newValue = Math.max(newValue, otherValue)\n }\n }\n\n updateMechanicalValue(newValue, thumbIndex)\n // @ts-expect-error\n emit('change', model.value)\n}\n\n// Cleanup event listeners\nonBeforeUnmount(() => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleEnd)\n window.removeEventListener('touchmove', handleMove)\n window.removeEventListener('touchend', handleEnd)\n})\n</script>\n\n<template>\n <div\n ref=\"sliderRoot\"\n class=\"slider-root\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n {\n 'slider-vertical': orientation === 'vertical',\n 'slider-horizontal': orientation === 'horizontal',\n 'slider-disabled': disabled,\n 'slider-range': isRange\n }\n ]\"\n role=\"group\"\n :aria-label=\"computedAriaLabel\"\n @mousedown=\"handleRailClick\"\n @touchstart.prevent=\"handleRailClick\"\n @keydown=\"handleContainerKeydown\"\n >\n <!-- Rail -->\n <div class=\"slider-rail\" ref=\"railRef\"></div>\n\n <!-- Track (conditionally rendered based on track prop) -->\n <div v-if=\"shouldRenderTrack\" class=\"slider-track\" :style=\"trackStyle\"></div>\n \n <!-- Inverted track for range mode - needs two elements -->\n <template v-if=\"isRange && config.track === 'inverted'\">\n <div class=\"slider-track slider-track--inverted-start\" :style=\"invertedTrackStartStyle\"></div>\n <div class=\"slider-track slider-track--inverted-end\" :style=\"invertedTrackEndStyle\"></div>\n </template>\n\n <!-- Thumbs -->\n <div\n v-for=\"(thumbValue, thumbIndex) in displayThumbValues\"\n :key=\"`thumb-${thumbIndex}`\"\n :ref=\"thumbRefs.set\"\n class=\"slider-thumb\"\n :class=\"{\n 'slider-thumb-active': isDragging && activeThumbIndex === thumbIndex,\n 'slider-thumb-hover': isHovering && hoverThumbIndex === thumbIndex\n }\"\n :style=\"getThumbStyle(thumbIndex)\"\n role=\"slider\"\n tabindex=\"0\"\n :aria-valuemin=\"scaledMin\"\n :aria-valuemax=\"scaledMax\"\n :aria-valuenow=\"getAriaValue(thumbIndex)\"\n :aria-label=\"getThumbAriaLabel(thumbIndex)\"\n :aria-orientation=\"orientation\"\n :aria-disabled=\"disabled || undefined\"\n @mousedown.stop=\"handleThumbDown($event, thumbIndex)\"\n @touchstart.stop.prevent=\"handleThumbDown($event, thumbIndex)\"\n @mouseenter=\"() => handleThumbEnter(thumbIndex)\"\n @mouseleave=\"() => handleThumbLeave()\"\n @keydown.stop=\"handleThumbKeydown($event, thumbIndex)\"\n @focus=\"() => handleThumbFocus(thumbIndex)\"\n @blur=\"handleThumbBlur\"\n >\n <!-- Tooltip -->\n <div\n v-if=\"shouldShowTooltip(thumbIndex)\"\n class=\"slider-value-label\"\n :class=\"{ 'slider-value-label-visible': isDragging || isHovering }\"\n :style=\"getTooltipStyle(thumbIndex)\"\n >\n {{ formatValueForDisplay(thumbValue) }}\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.slider-root {\n /* Defaults → base 200 */\n --slider-color: var(--color-base-content);\n --slider-track-h: 0.375rem;\n --slider-thumb-size: 1.25rem;\n\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: calc(var(--slider-thumb-size) + 0.5rem);\n cursor: pointer;\n touch-action: none;\n -webkit-tap-highlight-color: transparent;\n user-select: none;\n}\n\n/* Sizes */\n.slider-root.slider--xs {\n --slider-track-h: 0.2rem;\n --slider-thumb-size: 0.75rem;\n}\n.slider-root.slider--sm {\n --slider-track-h: 0.25rem;\n --slider-thumb-size: 1rem;\n}\n.slider-root.slider--md {\n --slider-track-h: 0.375rem;\n --slider-thumb-size: 1.25rem;\n}\n.slider-root.slider--lg {\n --slider-track-h: 0.5rem;\n --slider-thumb-size: 1.625rem;\n}\n.slider-root.slider--xl {\n --slider-track-h: 0.625rem;\n --slider-thumb-size: 2rem;\n}\n\n/* Colors */\n.slider-root.slider--neutral {\n --slider-color: var(--color-neutral);\n}\n.slider-root.slider--primary {\n --slider-color: var(--color-primary);\n}\n.slider-root.slider--secondary {\n --slider-color: var(--color-secondary);\n}\n.slider-root.slider--accent {\n --slider-color: var(--color-accent);\n}\n.slider-root.slider--info {\n --slider-color: var(--color-info);\n}\n.slider-root.slider--success {\n --slider-color: var(--color-success);\n}\n.slider-root.slider--warning {\n --slider-color: var(--color-warning);\n}\n.slider-root.slider--error {\n --slider-color: var(--color-error);\n}\n\n/* Orientation */\n.slider-horizontal {\n width: 100%;\n}\n\n.slider-vertical {\n width: var(--slider-thumb-size);\n height: 200px;\n flex-direction: column;\n align-items: center;\n}\n\n/* Disabled state */\n.slider-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Rail */\n.slider-rail {\n position: absolute;\n width: 100%;\n height: var(--slider-track-h);\n border-radius: 9999px;\n background-color: color-mix(in oklch, var(--slider-color) 20%, var(--color-base-200));\n pointer-events: none;\n}\n\n.slider-vertical .slider-rail {\n width: var(--slider-track-h);\n height: 100%;\n}\n\n/* Track */\n.slider-track {\n position: absolute;\n height: var(--slider-track-h);\n border-radius: 9999px;\n background-color: var(--slider-color);\n pointer-events: none;\n}\n\n.slider-vertical .slider-track {\n width: var(--slider-track-h);\n}\n\n/* Thumb */\n.slider-thumb {\n position: absolute;\n width: var(--slider-thumb-size);\n height: var(--slider-thumb-size);\n border-radius: 9999px;\n background-color: var(--color-base-100);\n border: 2px solid var(--slider-color);\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.15);\n cursor: pointer;\n z-index: 2;\n pointer-events: auto;\n user-select: none;\n -webkit-user-select: none;\n display: block !important;\n}\n\n.slider-thumb:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 6px 0 rgb(0 0 0 / 0.2);\n}\n\n.slider-thumb:active {\n transform: scale(0.95);\n}\n\n.slider-thumb:focus {\n outline: 2px solid var(--slider-color);\n outline-offset: 2px;\n}\n\n.slider-disabled .slider-thumb {\n cursor: not-allowed;\n pointer-events: none;\n transform: none;\n}\n\n/* Tooltip */\n.slider-value-label {\n position: absolute;\n background-color: var(--color-base-100);\n color: var(--color-base-content);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n z-index: 3;\n pointer-events: none;\n}\n\n.slider-value-label-visible {\n opacity: 1;\n visibility: visible;\n}\n</style>\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { getClass } from '@/utils/build-class.util'\nimport { useTemplateRefsList } from '@vueuse/core'\nimport { computed, onBeforeUnmount, ref, shallowRef, useTemplateRef, watch } from 'vue'\nimport { SLIDER_CONFIG } from './slider.context'\nimport type { SliderProps } from './slider.props'\nimport type { SliderColor, SliderSize } from './slider.types'\n\nconst colors: Record<SliderColor, string> = {\n neutral: 'slider--neutral',\n primary: 'slider--primary',\n secondary: 'slider--secondary',\n accent: 'slider--accent',\n info: 'slider--info',\n success: 'slider--success',\n warning: 'slider--warning',\n error: 'slider--error',\n}\n\nconst sizes: Record<SliderSize, string> = {\n xs: 'slider--xs',\n sm: 'slider--sm',\n md: 'slider--md',\n lg: 'slider--lg',\n xl: 'slider--xl',\n}\n</script>\n\n<script setup lang=\"ts\" generic=\"R extends boolean = false\">\ntype ModelType = R extends true ? [number, number] : number\n\nconst props = defineProps<SliderProps<R>>()\nconst model = defineModel<ModelType>()\n\n// @ts-expect-error - Ignored due to the genereic in script\nconst config = useComponentConfig(SLIDER_CONFIG, props, {\n color: undefined,\n size: 'md',\n track: 'normal',\n min: 0,\n max: 100,\n step: 1,\n range: false,\n orientation: 'horizontal',\n showTooltip: 'hover',\n disableSwap: false,\n})\n\nconst emit = defineEmits<{\n input: [value: ModelType]\n change: [value: ModelType]\n}>()\n\nconst sliderRoot = useTemplateRef('sliderRoot')\nconst thumbRefs = useTemplateRefsList<HTMLElement>()\n\nconst isDragging = shallowRef(false)\nconst activeThumbIndex = shallowRef<number | null>(null)\nconst isHovering = shallowRef(false)\nconst hoverThumbIndex = shallowRef<number | null>(null)\n\n// Internal mechanical values (always in min-max range)\nconst mechanicalValues = ref<number[]>([])\n\n// Initialize mechanical values\nconst initMechanicalValues = () => {\n const defaultMin = props.min ?? 0\n const defaultMax = props.max ?? 100\n\n if (props.range || Array.isArray(model.value)) {\n const initial = model.value\n ? Array.isArray(model.value)\n ? model.value\n : [defaultMin, defaultMax]\n : [defaultMin, defaultMax]\n mechanicalValues.value = [\n Math.max(defaultMin, Math.min(defaultMax, initial[0])),\n Math.max(defaultMin, Math.min(defaultMax, initial[1])),\n ]\n } else {\n const value = model.value ?? defaultMin\n mechanicalValues.value = [Math.max(defaultMin, Math.min(defaultMax, value as number))]\n }\n}\n\ninitMechanicalValues()\n\n// Sync with prop changes (when not dragging)\nwatch(\n () => [model.value, props.range, props.min, props.max],\n () => {\n if (!isDragging.value) {\n initMechanicalValues()\n }\n },\n { deep: true },\n)\n\n// Computed properties\nconst isRange = computed(() => props.range || mechanicalValues.value.length > 1)\nconst displayThumbValues = computed(() => mechanicalValues.value)\n\n// Should we render the track?\nconst shouldRenderTrack = computed(() => config.value.track !== 'none')\n\n// Effective min/max/step with defaults\nconst effectiveMin = computed(() => config.value.min!)\nconst effectiveMax = computed(() => config.value.max!)\nconst effectiveStep = computed(() => config.value.step!)\n\n// Scaled min/max for ARIA\nconst scaledMin = computed(() => props.scale?.(effectiveMin.value) ?? effectiveMin.value)\nconst scaledMax = computed(() => props.scale?.(effectiveMax.value) ?? effectiveMax.value)\n\n// Get config values safely\nconst configDisableSwap = computed(() => props.disableSwap ?? false)\n\n// Calculate percentage from mechanical value\nconst getPercent = (mechanicalValue: number): number => {\n const range = effectiveMax.value - effectiveMin.value\n if (range === 0) return 0\n return ((mechanicalValue - effectiveMin.value) / range) * 100\n}\n\n// Get mechanical value from percentage\nconst getMechanicalValueFromPercent = (percent: number): number => {\n const range = effectiveMax.value - effectiveMin.value\n let mechanical = effectiveMin.value + (percent / 100) * range\n\n if (effectiveStep.value > 0) {\n const steps = Math.round((mechanical - effectiveMin.value) / effectiveStep.value)\n mechanical = effectiveMin.value + steps * effectiveStep.value\n }\n\n return Math.min(effectiveMax.value, Math.max(effectiveMin.value, mechanical))\n}\n\n// Track style based on track mode\nconst trackStyle = computed(() => {\n const percent0 = getPercent(displayThumbValues.value[0])\n const percent1 = isRange.value ? getPercent(displayThumbValues.value[1]) : 0\n\n const minPercent = Math.min(percent0, percent1)\n const maxPercent = Math.max(percent0, percent1)\n\n if (isRange.value) {\n if (config.value.track === 'inverted') {\n // Normal track for inverted mode will be hidden, we use separate elements\n return { display: 'none' }\n }\n // Normal: show track between thumbs\n if (props.orientation === 'vertical') {\n return {\n bottom: `${minPercent}%`,\n height: `${maxPercent - minPercent}%`,\n }\n }\n return {\n left: `${minPercent}%`,\n width: `${maxPercent - minPercent}%`,\n }\n }\n // Single thumb\n if (config.value.track === 'inverted') {\n if (props.orientation === 'vertical') {\n return {\n bottom: `${percent0}%`,\n height: `${100 - percent0}%`,\n }\n }\n return {\n left: `${percent0}%`,\n width: `${100 - percent0}%`,\n }\n }\n if (props.orientation === 'vertical') {\n return {\n bottom: '0%',\n height: `${percent0}%`,\n }\n }\n return {\n left: '0%',\n width: `${percent0}%`,\n }\n})\n\n// Inverted track styles for range mode\nconst invertedTrackStartStyle = computed(() => {\n if (!isRange.value || config.value.track !== 'inverted') return {}\n const minVal = Math.min(displayThumbValues.value[0], displayThumbValues.value[1])\n const minPercent = getPercent(minVal)\n if (props.orientation === 'vertical') {\n return {\n bottom: '0%',\n height: `${minPercent}%`,\n }\n }\n return {\n left: '0%',\n width: `${minPercent}%`,\n }\n})\n\nconst invertedTrackEndStyle = computed(() => {\n if (!isRange.value || config.value.track !== 'inverted') return {}\n const maxVal = Math.max(displayThumbValues.value[0], displayThumbValues.value[1])\n const maxPercent = getPercent(maxVal)\n if (props.orientation === 'vertical') {\n return {\n bottom: `${maxPercent}%`,\n height: `${100 - maxPercent}%`,\n }\n }\n return {\n left: `${maxPercent}%`,\n width: `${100 - maxPercent}%`,\n }\n})\n\n// Thumb style\nconst getThumbStyle = (thumbIndex: number) => {\n const percent = getPercent(displayThumbValues.value[thumbIndex])\n if (props.orientation === 'vertical') {\n return {\n bottom: `${percent}%`,\n left: '50%',\n transform: 'translateX(-50%)',\n }\n }\n return {\n left: `${percent}%`,\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }\n}\n\n// Tooltip style\nconst getTooltipStyle = (thumbIndex: number) => {\n const percent = getPercent(displayThumbValues.value[thumbIndex])\n if (props.orientation === 'vertical') {\n return {\n bottom: `${percent + 10}%`,\n left: '50%',\n transform: 'translateX(-50%)',\n }\n }\n return {\n left: `${percent}%`,\n top: '-32px',\n transform: 'translateX(-50%)',\n }\n}\n\n// Format value for display (applies scale if available)\nconst formatValueForDisplay = (mechanicalValue: number): string => {\n if (props.scale) {\n return String(props.scale(mechanicalValue))\n }\n return String(mechanicalValue)\n}\n\n// Get ARIA value (applies scale if available)\nconst getAriaValue = (thumbIndex: number): number => {\n if (props.scale) {\n return props.scale(displayThumbValues.value[thumbIndex])\n }\n return displayThumbValues.value[thumbIndex]\n}\n\n// Tooltip visibility\nconst shouldShowTooltip = (thumbIndex: number): boolean => {\n if (props.showTooltip === 'never') return false\n if (props.showTooltip === 'always') return true\n return (\n (isHovering.value && hoverThumbIndex.value === thumbIndex) ||\n (isDragging.value && activeThumbIndex.value === thumbIndex)\n )\n}\n\n// ARIA\nconst computedAriaLabel = computed(() => props.ariaLabel || 'Slider')\n\nconst getThumbAriaLabel = (thumbIndex: number): string => {\n if (isRange.value) {\n return thumbIndex === 0 ? `${computedAriaLabel.value} - Minimum` : `${computedAriaLabel.value} - Maximum`\n }\n return computedAriaLabel.value\n}\n\n// Value from position (returns mechanical value)\nfunction getMechanicalValueFromPosition(clientX: number, clientY: number): number {\n if (!sliderRoot.value) return effectiveMin.value\n\n const rect = sliderRoot.value.getBoundingClientRect()\n let percent: number\n\n if (props.orientation === 'vertical') {\n const y = clientY - rect.top\n percent = 1 - y / rect.height\n } else {\n const x = clientX - rect.left\n percent = x / rect.width\n }\n\n percent = Math.max(0, Math.min(1, percent))\n return getMechanicalValueFromPercent(percent * 100)\n}\n\n// Find closest thumb index\nfunction findClosestThumb(mechanicalValue: number): number {\n if (!isRange.value) return 0\n\n const dist0 = Math.abs(mechanicalValue - displayThumbValues.value[0])\n const dist1 = Math.abs(mechanicalValue - displayThumbValues.value[1])\n return dist0 < dist1 ? 0 : 1\n}\n\n// Update mechanical values with swap logic\nfunction updateMechanicalValue(newMechanicalValue: number, thumbIndex: number) {\n if (isRange.value) {\n const nextValues = [...displayThumbValues.value]\n\n if (configDisableSwap.value) {\n // Prevent crossing: clamp to other thumb\n if (thumbIndex === 0) {\n nextValues[0] = Math.min(newMechanicalValue, nextValues[1])\n } else {\n nextValues[1] = Math.max(newMechanicalValue, nextValues[0])\n }\n } else {\n // Allow swap: set the value directly\n nextValues[thumbIndex] = newMechanicalValue\n\n // Always keep values sorted: index 0 = min, index 1 = max\n if (nextValues[0] > nextValues[1]) {\n // Swap the values\n ;[nextValues[0], nextValues[1]] = [nextValues[1], nextValues[0]]\n // Swap active thumb index so user continues controlling the same visual thumb\n if (isDragging.value && activeThumbIndex.value !== null) {\n activeThumbIndex.value = activeThumbIndex.value === 0 ? 1 : 0\n }\n }\n }\n\n mechanicalValues.value = nextValues\n const scaledValues: [number, number] = [\n props.scale ? props.scale(nextValues[0]) : nextValues[0],\n props.scale ? props.scale(nextValues[1]) : nextValues[1],\n ]\n // @ts-expect-error\n model.value = scaledValues\n } else {\n mechanicalValues.value = [newMechanicalValue]\n const scaledValue = props.scale ? props.scale(newMechanicalValue) : newMechanicalValue\n // @ts-expect-error\n model.value = scaledValue\n }\n\n // @ts-expect-error\n emit('input', model.value)\n}\n\n// Handle rail click\nfunction handleRailClick(event: MouseEvent | TouchEvent) {\n if (props.disabled) return\n\n const clientX = 'touches' in event ? event.touches[0].clientX : event.clientX\n const clientY = 'touches' in event ? event.touches[0].clientY : event.clientY\n\n const clickValue = getMechanicalValueFromPosition(clientX, clientY)\n const thumbIndex = findClosestThumb(clickValue)\n\n updateMechanicalValue(clickValue, thumbIndex)\n\n if (event.type === 'mousedown' || ('touches' in event && event.touches.length > 0)) {\n isDragging.value = true\n activeThumbIndex.value = thumbIndex\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleEnd)\n window.addEventListener('touchmove', handleMove, { passive: false })\n window.addEventListener('touchend', handleEnd)\n }\n}\n\n// Handle thumb down\nfunction handleThumbDown(event: MouseEvent | TouchEvent, thumbIndex: number) {\n if (props.disabled) return\n\n event.preventDefault()\n event.stopPropagation()\n\n isDragging.value = true\n activeThumbIndex.value = thumbIndex\n\n window.addEventListener('mousemove', handleMove)\n window.addEventListener('mouseup', handleEnd)\n window.addEventListener('touchmove', handleMove, { passive: false })\n window.addEventListener('touchend', handleEnd)\n}\n\n// Handle move\nfunction handleMove(event: MouseEvent | TouchEvent) {\n if (!isDragging.value || activeThumbIndex.value === null) return\n\n const clientX = 'touches' in event ? event.touches[0].clientX : event.clientX\n const clientY = 'touches' in event ? event.touches[0].clientY : event.clientY\n\n const newValue = getMechanicalValueFromPosition(clientX, clientY)\n updateMechanicalValue(newValue, activeThumbIndex.value)\n}\n\n// Handle end\nfunction handleEnd() {\n if (!isDragging.value) return\n\n isDragging.value = false\n activeThumbIndex.value = null\n\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleEnd)\n window.removeEventListener('touchmove', handleMove)\n window.removeEventListener('touchend', handleEnd)\n\n // @ts-expect-error\n emit('change', model.value)\n}\n\n// Thumb hover/enter/leave\nfunction handleThumbEnter(thumbIndex: number) {\n isHovering.value = true\n hoverThumbIndex.value = thumbIndex\n}\n\nfunction handleThumbLeave() {\n isHovering.value = false\n hoverThumbIndex.value = null\n}\n\n// Focus handling\nfunction handleThumbFocus(_thumbIndex: number) {\n // No-op for now\n}\n\nfunction handleThumbBlur() {\n // @ts-expect-error\n emit('change', model.value)\n}\n\n// Container keydown\nfunction handleContainerKeydown(event: KeyboardEvent) {\n if (props.disabled) return\n if (event.key === 'Tab' && !isHovering.value) {\n event.preventDefault()\n thumbRefs.value[0]?.focus()\n }\n}\n\n// Thumb keyboard navigation\nfunction handleThumbKeydown(event: KeyboardEvent, thumbIndex: number) {\n if (props.disabled) return\n\n const currentValue = displayThumbValues.value[thumbIndex]\n let newValue: number\n\n const rangeSize = effectiveMax.value - effectiveMin.value\n const pageStep = rangeSize * 0.1\n const arrowStep = effectiveStep.value\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = currentValue + arrowStep\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = currentValue - arrowStep\n break\n case 'PageUp':\n newValue = currentValue + pageStep\n break\n case 'PageDown':\n newValue = currentValue - pageStep\n break\n case 'Home':\n newValue = effectiveMin.value\n break\n case 'End':\n newValue = effectiveMax.value\n break\n case 'Escape':\n isDragging.value = false\n activeThumbIndex.value = null\n // @ts-expect-error\n emit('change', model.value)\n return\n default:\n return\n }\n\n event.preventDefault()\n\n newValue = Math.min(effectiveMax.value, Math.max(effectiveMin.value, newValue))\n\n // Only prevent crossing if disableSwap is true\n if (isRange.value && configDisableSwap.value) {\n const otherValue = thumbIndex === 0 ? displayThumbValues.value[1] : displayThumbValues.value[0]\n if (thumbIndex === 0) {\n newValue = Math.min(newValue, otherValue)\n } else {\n newValue = Math.max(newValue, otherValue)\n }\n }\n\n updateMechanicalValue(newValue, thumbIndex)\n // @ts-expect-error\n emit('change', model.value)\n}\n\n// Cleanup event listeners\nonBeforeUnmount(() => {\n window.removeEventListener('mousemove', handleMove)\n window.removeEventListener('mouseup', handleEnd)\n window.removeEventListener('touchmove', handleMove)\n window.removeEventListener('touchend', handleEnd)\n})\n</script>\n\n<template>\n <div\n ref=\"sliderRoot\"\n class=\"slider-root\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n {\n 'slider-vertical': orientation === 'vertical',\n 'slider-horizontal': orientation === 'horizontal',\n 'slider-disabled': disabled,\n 'slider-range': isRange\n }\n ]\"\n role=\"group\"\n :aria-label=\"computedAriaLabel\"\n @mousedown=\"handleRailClick\"\n @touchstart.prevent=\"handleRailClick\"\n @keydown=\"handleContainerKeydown\"\n >\n <!-- Rail -->\n <div class=\"slider-rail\" ref=\"railRef\"></div>\n\n <!-- Track (conditionally rendered based on track prop) -->\n <div v-if=\"shouldRenderTrack\" class=\"slider-track\" :style=\"trackStyle\"></div>\n \n <!-- Inverted track for range mode - needs two elements -->\n <template v-if=\"isRange && config.track === 'inverted'\">\n <div class=\"slider-track slider-track--inverted-start\" :style=\"invertedTrackStartStyle\"></div>\n <div class=\"slider-track slider-track--inverted-end\" :style=\"invertedTrackEndStyle\"></div>\n </template>\n\n <!-- Thumbs -->\n <div\n v-for=\"(thumbValue, thumbIndex) in displayThumbValues\"\n :key=\"`thumb-${thumbIndex}`\"\n :ref=\"thumbRefs.set\"\n class=\"slider-thumb\"\n :class=\"{\n 'slider-thumb-active': isDragging && activeThumbIndex === thumbIndex,\n 'slider-thumb-hover': isHovering && hoverThumbIndex === thumbIndex\n }\"\n :style=\"getThumbStyle(thumbIndex)\"\n role=\"slider\"\n tabindex=\"0\"\n :aria-valuemin=\"scaledMin\"\n :aria-valuemax=\"scaledMax\"\n :aria-valuenow=\"getAriaValue(thumbIndex)\"\n :aria-label=\"getThumbAriaLabel(thumbIndex)\"\n :aria-orientation=\"orientation\"\n :aria-disabled=\"disabled || undefined\"\n @mousedown.stop=\"handleThumbDown($event, thumbIndex)\"\n @touchstart.stop.prevent=\"handleThumbDown($event, thumbIndex)\"\n @mouseenter=\"() => handleThumbEnter(thumbIndex)\"\n @mouseleave=\"() => handleThumbLeave()\"\n @keydown.stop=\"handleThumbKeydown($event, thumbIndex)\"\n @focus=\"() => handleThumbFocus(thumbIndex)\"\n @blur=\"handleThumbBlur\"\n >\n <!-- Tooltip -->\n <div\n v-if=\"shouldShowTooltip(thumbIndex)\"\n class=\"slider-value-label\"\n :class=\"{ 'slider-value-label-visible': isDragging || isHovering }\"\n :style=\"getTooltipStyle(thumbIndex)\"\n >\n {{ formatValueForDisplay(thumbValue) }}\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.slider-root {\n /* Defaults → base 200 */\n --slider-color: var(--color-base-content);\n --slider-track-h: 0.375rem;\n --slider-thumb-size: 1.25rem;\n\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n height: calc(var(--slider-thumb-size) + 0.5rem);\n cursor: pointer;\n touch-action: none;\n -webkit-tap-highlight-color: transparent;\n user-select: none;\n}\n\n/* Sizes */\n.slider-root.slider--xs {\n --slider-track-h: 0.2rem;\n --slider-thumb-size: 0.75rem;\n}\n.slider-root.slider--sm {\n --slider-track-h: 0.25rem;\n --slider-thumb-size: 1rem;\n}\n.slider-root.slider--md {\n --slider-track-h: 0.375rem;\n --slider-thumb-size: 1.25rem;\n}\n.slider-root.slider--lg {\n --slider-track-h: 0.5rem;\n --slider-thumb-size: 1.625rem;\n}\n.slider-root.slider--xl {\n --slider-track-h: 0.625rem;\n --slider-thumb-size: 2rem;\n}\n\n/* Colors */\n.slider-root.slider--neutral {\n --slider-color: var(--color-neutral);\n}\n.slider-root.slider--primary {\n --slider-color: var(--color-primary);\n}\n.slider-root.slider--secondary {\n --slider-color: var(--color-secondary);\n}\n.slider-root.slider--accent {\n --slider-color: var(--color-accent);\n}\n.slider-root.slider--info {\n --slider-color: var(--color-info);\n}\n.slider-root.slider--success {\n --slider-color: var(--color-success);\n}\n.slider-root.slider--warning {\n --slider-color: var(--color-warning);\n}\n.slider-root.slider--error {\n --slider-color: var(--color-error);\n}\n\n/* Orientation */\n.slider-horizontal {\n width: 100%;\n}\n\n.slider-vertical {\n width: var(--slider-thumb-size);\n height: 200px;\n flex-direction: column;\n align-items: center;\n}\n\n/* Disabled state */\n.slider-disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Rail */\n.slider-rail {\n position: absolute;\n width: 100%;\n height: var(--slider-track-h);\n border-radius: 9999px;\n background-color: color-mix(in oklch, var(--slider-color) 20%, var(--color-base-200));\n pointer-events: none;\n}\n\n.slider-vertical .slider-rail {\n width: var(--slider-track-h);\n height: 100%;\n}\n\n/* Track */\n.slider-track {\n position: absolute;\n height: var(--slider-track-h);\n border-radius: 9999px;\n background-color: var(--slider-color);\n pointer-events: none;\n}\n\n.slider-vertical .slider-track {\n width: var(--slider-track-h);\n}\n\n/* Thumb */\n.slider-thumb {\n position: absolute;\n width: var(--slider-thumb-size);\n height: var(--slider-thumb-size);\n border-radius: 9999px;\n background-color: var(--color-base-100);\n border: 2px solid var(--slider-color);\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.15);\n cursor: pointer;\n z-index: 2;\n pointer-events: auto;\n user-select: none;\n -webkit-user-select: none;\n display: block !important;\n}\n\n.slider-thumb:hover {\n transform: scale(1.1);\n box-shadow: 0 2px 6px 0 rgb(0 0 0 / 0.2);\n}\n\n.slider-thumb:active {\n transform: scale(0.95);\n}\n\n.slider-thumb:focus {\n outline: 2px solid var(--slider-color);\n outline-offset: 2px;\n}\n\n.slider-disabled .slider-thumb {\n cursor: not-allowed;\n pointer-events: none;\n transform: none;\n}\n\n/* Tooltip */\n.slider-value-label {\n position: absolute;\n background-color: var(--color-base-100);\n color: var(--color-base-content);\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n z-index: 3;\n pointer-events: none;\n}\n\n.slider-value-label-visible {\n opacity: 1;\n visibility: visible;\n}\n</style>\n","import { createComponentConfigKey } from '@/symbol'\n\nexport const TEXTAREA_CONFIG = createComponentConfigKey('textarea')\n","<script lang=\"ts\">\nimport { FORM_CONTEXT_KEY } from '@/components/data/form/form.context'\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, useTemplateRef } from 'vue'\nimport { TEXTAREA_CONFIG } from './textarea.context'\nimport type { TextareaProps } from './textarea.props'\nimport type { TextareaColor, TextareaSize, TextareaVariant } from './textarea.types'\n\nconst colors: ComponentClass<'textarea', TextareaColor> = {\n neutral: 'textarea-neutral',\n primary: 'textarea-primary',\n secondary: 'textarea-secondary',\n accent: 'textarea-accent',\n info: 'textarea-info',\n success: 'textarea-success',\n warning: 'textarea-warning',\n error: 'textarea-error',\n}\n\nconst sizes: ComponentClass<'textarea', TextareaSize> = {\n xs: 'textarea-xs',\n sm: 'textarea-sm',\n md: 'textarea-md',\n lg: 'textarea-lg',\n xl: 'textarea-xl',\n}\n\nconst variants: ComponentClass<'textarea', TextareaVariant> = {\n bordered: 'textarea-bordered',\n ghost: 'textarea-ghost',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<TextareaProps>()\n\n/**\n * The current text content of the textarea.\n * Supports the `.trim` modifier:\n * - `v-model.trim` → trims leading and trailing whitespace on update\n */\nconst model = defineModel<string>()\n\n// ── Context injection ────────────────────────────────────────────────────────\n\nconst formCtx = inject(FORM_CONTEXT_KEY, null)\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null)\n\nconst contextOverrides = {\n get counter() { return fieldCtx?.counter.value ?? formCtx?.counter.value },\n get counterFormat() { return fieldCtx?.counterFormat.value ?? formCtx?.counterFormat.value },\n}\n\nconst config = useComponentConfig(\n TEXTAREA_CONFIG,\n props,\n { size: 'md', rows: 4, autoGrow: false, counter: false },\n contextOverrides,\n)\n\n// ── Element ref + form field ─────────────────────────────────────────────────\n\nconst textareaEl = useTemplateRef('textareaEl')\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<string>({\n required: computed(() => isTrue(props.required)),\n inputEl: textareaEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() => field ? fieldValue.value : model.value)\n\nfunction handleUpdate(event: Event): void {\n const raw = (event.target as HTMLTextAreaElement).value\n model.value = raw\n field?.setValue(raw)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => (resolvedValue.value ?? '').length)\n\nconst showCounter = computed(() => isTrue(config.value.counter))\n\nconst formattedCounter = computed(() => {\n const fmt = config.value.counterFormat ?? '{current} / {max}'\n const current = currentLength.value\n const min = config.value.minLength\n const max = config.value.maxLength\n\n if (typeof fmt === 'function') return fmt(current, min, max)\n\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\n// ── Error display ────────────────────────────────────────────────────────────\n\nconst activeError = computed(() => field?.error.value)\n\nconst hasError = computed(() => !!activeError.value)\n</script>\n\n<template>\n <div class=\"w-full\">\n <!-- Top label row — standalone use only -->\n <div v-if=\"!field && (label || $slots.label)\" class=\"label\">\n <span class=\"label-text\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n </div>\n\n <textarea\n ref=\"textareaEl\"\n class=\"textarea w-full\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n getClass(variants, config.variant),\n { 'textarea-error': hasError },\n { 'field-sizing-content': isTrue(config.autoGrow) },\n ]\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n :placeholder=\"placeholder\"\n :rows=\"isTrue(config.autoGrow) ? undefined : config.rows\"\n :maxlength=\"config.maxLength\"\n :minlength=\"config.minLength\"\n @input=\"handleUpdate\"\n @blur=\"onBlur\"\n />\n\n <!-- Bottom label row — standalone use only -->\n <div\n v-if=\"!field && (activeError || hint || $slots.hint || showCounter)\"\n class=\"label\"\n >\n <span\n class=\"label-text-alt\"\n :class=\"{ 'text-error': activeError }\"\n >\n <slot name=\"hint\">{{ activeError || hint }}</slot>\n </span>\n <span v-if=\"showCounter\" class=\"label-text-alt\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n {{ formattedCounter }}\n </slot>\n </span>\n </div>\n\n <!-- Counter slot exposed for FormField's bottom row when inside a FormField -->\n <template v-if=\"field && showCounter\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n <!-- rendered by FormField in its own label row -->\n </slot>\n </template>\n </div>\n</template>\n","<script lang=\"ts\">\nimport { FORM_CONTEXT_KEY } from '@/components/data/form/form.context'\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, inject, useTemplateRef } from 'vue'\nimport { TEXTAREA_CONFIG } from './textarea.context'\nimport type { TextareaProps } from './textarea.props'\nimport type { TextareaColor, TextareaSize, TextareaVariant } from './textarea.types'\n\nconst colors: ComponentClass<'textarea', TextareaColor> = {\n neutral: 'textarea-neutral',\n primary: 'textarea-primary',\n secondary: 'textarea-secondary',\n accent: 'textarea-accent',\n info: 'textarea-info',\n success: 'textarea-success',\n warning: 'textarea-warning',\n error: 'textarea-error',\n}\n\nconst sizes: ComponentClass<'textarea', TextareaSize> = {\n xs: 'textarea-xs',\n sm: 'textarea-sm',\n md: 'textarea-md',\n lg: 'textarea-lg',\n xl: 'textarea-xl',\n}\n\nconst variants: ComponentClass<'textarea', TextareaVariant> = {\n bordered: 'textarea-bordered',\n ghost: 'textarea-ghost',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<TextareaProps>()\n\n/**\n * The current text content of the textarea.\n * Supports the `.trim` modifier:\n * - `v-model.trim` → trims leading and trailing whitespace on update\n */\nconst model = defineModel<string>()\n\n// ── Context injection ────────────────────────────────────────────────────────\n\nconst formCtx = inject(FORM_CONTEXT_KEY, null)\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null)\n\nconst contextOverrides = {\n get counter() { return fieldCtx?.counter.value ?? formCtx?.counter.value },\n get counterFormat() { return fieldCtx?.counterFormat.value ?? formCtx?.counterFormat.value },\n}\n\nconst config = useComponentConfig(\n TEXTAREA_CONFIG,\n props,\n { size: 'md', rows: 4, autoGrow: false, counter: false },\n contextOverrides,\n)\n\n// ── Element ref + form field ─────────────────────────────────────────────────\n\nconst textareaEl = useTemplateRef('textareaEl')\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<string>({\n required: computed(() => isTrue(props.required)),\n inputEl: textareaEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() => field ? fieldValue.value : model.value)\n\nfunction handleUpdate(event: Event): void {\n const raw = (event.target as HTMLTextAreaElement).value\n model.value = raw\n field?.setValue(raw)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => (resolvedValue.value ?? '').length)\n\nconst showCounter = computed(() => isTrue(config.value.counter))\n\nconst formattedCounter = computed(() => {\n const fmt = config.value.counterFormat ?? '{current} / {max}'\n const current = currentLength.value\n const min = config.value.minLength\n const max = config.value.maxLength\n\n if (typeof fmt === 'function') return fmt(current, min, max)\n\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\n// ── Error display ────────────────────────────────────────────────────────────\n\nconst activeError = computed(() => field?.error.value)\n\nconst hasError = computed(() => !!activeError.value)\n</script>\n\n<template>\n <div class=\"w-full\">\n <!-- Top label row — standalone use only -->\n <div v-if=\"!field && (label || $slots.label)\" class=\"label\">\n <span class=\"label-text\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n </div>\n\n <textarea\n ref=\"textareaEl\"\n class=\"textarea w-full\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n getClass(variants, config.variant),\n { 'textarea-error': hasError },\n { 'field-sizing-content': isTrue(config.autoGrow) },\n ]\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n :placeholder=\"placeholder\"\n :rows=\"isTrue(config.autoGrow) ? undefined : config.rows\"\n :maxlength=\"config.maxLength\"\n :minlength=\"config.minLength\"\n @input=\"handleUpdate\"\n @blur=\"onBlur\"\n />\n\n <!-- Bottom label row — standalone use only -->\n <div\n v-if=\"!field && (activeError || hint || $slots.hint || showCounter)\"\n class=\"label\"\n >\n <span\n class=\"label-text-alt\"\n :class=\"{ 'text-error': activeError }\"\n >\n <slot name=\"hint\">{{ activeError || hint }}</slot>\n </span>\n <span v-if=\"showCounter\" class=\"label-text-alt\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n {{ formattedCounter }}\n </slot>\n </span>\n </div>\n\n <!-- Counter slot exposed for FormField's bottom row when inside a FormField -->\n <template v-if=\"field && showCounter\">\n <slot\n name=\"counter\"\n :current=\"currentLength\"\n :min=\"config.minLength\"\n :max=\"config.maxLength\"\n >\n <!-- rendered by FormField in its own label row -->\n </slot>\n </template>\n </div>\n</template>\n","import { createComponentConfigKey } from '@/symbol'\n\nexport const TOGGLE_CONFIG = createComponentConfigKey('toggle')\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, useSlots, useTemplateRef } from 'vue'\nimport { TOGGLE_CONFIG } from './toggle.context'\nimport type { ToggleProps } from './toggle.props'\nimport type { ToggleColor, ToggleSize } from './toggle.types'\n\nconst colors: ComponentClass<'toggle', ToggleColor> = {\n neutral: 'toggle-neutral',\n primary: 'toggle-primary',\n secondary: 'toggle-secondary',\n accent: 'toggle-accent',\n info: 'toggle-info',\n success: 'toggle-success',\n warning: 'toggle-warning',\n error: 'toggle-error',\n}\n\nconst sizes: ComponentClass<'toggle', ToggleSize> = {\n xs: 'toggle-xs',\n sm: 'toggle-sm',\n md: 'toggle-md',\n lg: 'toggle-lg',\n xl: 'toggle-xl',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<ToggleProps>()\n\n/**\n * Whether the toggle is on or off.\n * Use `v-model` to bind to a boolean reactive value.\n */\nconst model = defineModel<boolean>()\n\nconst config = useComponentConfig(TOGGLE_CONFIG, props, { size: 'md' })\n\nconst inputEl = useTemplateRef('inputEl')\n\nconst slots = useSlots()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() => field ? fieldValue.value : model.value)\n\nfunction handleChange(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked\n model.value = checked\n field?.setValue(checked)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\n// ── Description presence ─────────────────────────────────────────────────────\n\nconst hasDescription = computed(() => !!(props.description || slots.description))\n</script>\n\n<template>\n <!-- Bare toggle — no description -->\n <input\n v-if=\"!hasDescription\"\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"toggle\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n\n <!-- Toggle with description -->\n <label v-else class=\"flex cursor-pointer items-center gap-2\">\n <input\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"toggle\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"label-text text-base-content/60\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </label>\n</template>\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\nimport type { ComponentClass } from '@/types/utils.type'\nimport { getClass } from '@/utils/build-class.util'\nimport { isTrue } from '@/utils/is-true'\nimport { computed, useSlots, useTemplateRef } from 'vue'\nimport { TOGGLE_CONFIG } from './toggle.context'\nimport type { ToggleProps } from './toggle.props'\nimport type { ToggleColor, ToggleSize } from './toggle.types'\n\nconst colors: ComponentClass<'toggle', ToggleColor> = {\n neutral: 'toggle-neutral',\n primary: 'toggle-primary',\n secondary: 'toggle-secondary',\n accent: 'toggle-accent',\n info: 'toggle-info',\n success: 'toggle-success',\n warning: 'toggle-warning',\n error: 'toggle-error',\n}\n\nconst sizes: ComponentClass<'toggle', ToggleSize> = {\n xs: 'toggle-xs',\n sm: 'toggle-sm',\n md: 'toggle-md',\n lg: 'toggle-lg',\n xl: 'toggle-xl',\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps<ToggleProps>()\n\n/**\n * Whether the toggle is on or off.\n * Use `v-model` to bind to a boolean reactive value.\n */\nconst model = defineModel<boolean>()\n\nconst config = useComponentConfig(TOGGLE_CONFIG, props, { size: 'md' })\n\nconst inputEl = useTemplateRef('inputEl')\n\nconst slots = useSlots()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => isTrue(props.required)),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() => field ? fieldValue.value : model.value)\n\nfunction handleChange(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked\n model.value = checked\n field?.setValue(checked)\n field?.setDirty(true)\n clearError()\n}\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\n// ── Description presence ─────────────────────────────────────────────────────\n\nconst hasDescription = computed(() => !!(props.description || slots.description))\n</script>\n\n<template>\n <!-- Bare toggle — no description -->\n <input\n v-if=\"!hasDescription\"\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"toggle\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n\n <!-- Toggle with description -->\n <label v-else class=\"flex cursor-pointer items-center gap-2\">\n <input\n ref=\"inputEl\"\n type=\"checkbox\"\n class=\"toggle\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"isTrue(required)\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"label-text text-base-content/60\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n </label>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type { CheckboxProps } from './checkbox/checkbox.props';
|
|
2
|
+
export * from './checkbox/checkbox.types';
|
|
3
|
+
export type { FormProps } from './form/form.props';
|
|
4
|
+
export * from './form/form.types';
|
|
5
|
+
export type { FormFieldProps } from './form-field/form-field.props';
|
|
6
|
+
export * from './form-field/form-field.types';
|
|
7
|
+
export type { InputProps } from './input/input.props';
|
|
8
|
+
export * from './input/input.types';
|
|
9
|
+
export type { RadioProps } from './radio/radio.props';
|
|
10
|
+
export * from './radio/radio.types';
|
|
11
|
+
export type { RatingProps } from './rating/rating.props';
|
|
12
|
+
export * from './rating/rating.types';
|
|
13
|
+
export type { SelectProps } from './select/select.props';
|
|
14
|
+
export * from './select/select.types';
|
|
15
|
+
export type { SliderProps } from './slider/slider.props';
|
|
16
|
+
export * from './slider/slider.types';
|
|
17
|
+
export type { TextareaProps } from './textarea/textarea.props';
|
|
18
|
+
export * from './textarea/textarea.types';
|
|
19
|
+
export type { ToggleProps } from './toggle/toggle.props';
|
|
20
|
+
export * from './toggle/toggle.types';
|
|
21
|
+
//# sourceMappingURL=public.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.types.d.ts","sourceRoot":"","sources":["../../../src/components/data/public.types.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,cAAc,2BAA2B,CAAA;AAEzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,cAAc,mBAAmB,CAAA;AAEjC,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACnE,cAAc,+BAA+B,CAAA;AAE7C,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,cAAc,qBAAqB,CAAA;AAEnC,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,cAAc,qBAAqB,CAAA;AAEnC,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,uBAAuB,CAAA;AAErC,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,uBAAuB,CAAA;AAErC,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,uBAAuB,CAAA;AAErC,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,cAAc,2BAA2B,CAAA;AAEzC,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACxD,cAAc,uBAAuB,CAAA"}
|