@poppy-ui/vue 0.0.0-dev.36.93ba5b2

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.
Files changed (853) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/ClassWrapper-BNZO3mhP.cjs +2 -0
  4. package/dist/ClassWrapper-BNZO3mhP.cjs.map +1 -0
  5. package/dist/ClassWrapper-DdnnHfAj.js +24 -0
  6. package/dist/ClassWrapper-DdnnHfAj.js.map +1 -0
  7. package/dist/Toast-DuytECg8.cjs +2 -0
  8. package/dist/Toast-DuytECg8.cjs.map +1 -0
  9. package/dist/Toast-fSQWLl0R.js +63 -0
  10. package/dist/Toast-fSQWLl0R.js.map +1 -0
  11. package/dist/_plugin-vue_export-helper-B3ysoDQm.js +8 -0
  12. package/dist/_plugin-vue_export-helper-BTmtiIyf.cjs +1 -0
  13. package/dist/build-class.util-Cp-ZBFgO.js +1730 -0
  14. package/dist/build-class.util-Cp-ZBFgO.js.map +1 -0
  15. package/dist/build-class.util-Lo1-M_t1.cjs +2 -0
  16. package/dist/build-class.util-Lo1-M_t1.cjs.map +1 -0
  17. package/dist/components/ClassWrapper.d.ts +27 -0
  18. package/dist/components/ClassWrapper.d.ts.map +1 -0
  19. package/dist/components/actions/button/Button.d.ts +21 -0
  20. package/dist/components/actions/button/Button.d.ts.map +1 -0
  21. package/dist/components/actions/button/button.context.d.ts +2 -0
  22. package/dist/components/actions/button/button.context.d.ts.map +1 -0
  23. package/dist/components/actions/button/button.props.d.ts +58 -0
  24. package/dist/components/actions/button/button.props.d.ts.map +1 -0
  25. package/dist/components/actions/button/button.types.d.ts +7 -0
  26. package/dist/components/actions/button/button.types.d.ts.map +1 -0
  27. package/dist/components/actions/dropdown/Dropdown.d.ts +25 -0
  28. package/dist/components/actions/dropdown/Dropdown.d.ts.map +1 -0
  29. package/dist/components/actions/dropdown/dropdown.context.d.ts +2 -0
  30. package/dist/components/actions/dropdown/dropdown.context.d.ts.map +1 -0
  31. package/dist/components/actions/dropdown/dropdown.props.d.ts +60 -0
  32. package/dist/components/actions/dropdown/dropdown.props.d.ts.map +1 -0
  33. package/dist/components/actions/dropdown/dropdown.types.d.ts +4 -0
  34. package/dist/components/actions/dropdown/dropdown.types.d.ts.map +1 -0
  35. package/dist/components/actions/fab/Fab.d.ts +16 -0
  36. package/dist/components/actions/fab/Fab.d.ts.map +1 -0
  37. package/dist/components/actions/fab/fab.context.d.ts +2 -0
  38. package/dist/components/actions/fab/fab.context.d.ts.map +1 -0
  39. package/dist/components/actions/fab/fab.props.d.ts +11 -0
  40. package/dist/components/actions/fab/fab.props.d.ts.map +1 -0
  41. package/dist/components/actions/fab/fab.types.d.ts +2 -0
  42. package/dist/components/actions/fab/fab.types.d.ts.map +1 -0
  43. package/dist/components/actions/modal/Modal.d.ts +42 -0
  44. package/dist/components/actions/modal/Modal.d.ts.map +1 -0
  45. package/dist/components/actions/modal/modal.context.d.ts +2 -0
  46. package/dist/components/actions/modal/modal.context.d.ts.map +1 -0
  47. package/dist/components/actions/modal/modal.props.d.ts +31 -0
  48. package/dist/components/actions/modal/modal.props.d.ts.map +1 -0
  49. package/dist/components/actions/modal/modal.types.d.ts +2 -0
  50. package/dist/components/actions/modal/modal.types.d.ts.map +1 -0
  51. package/dist/components/actions/public.d.ts +6 -0
  52. package/dist/components/actions/public.d.ts.map +1 -0
  53. package/dist/components/actions/public.es.js +323 -0
  54. package/dist/components/actions/public.es.js.map +1 -0
  55. package/dist/components/actions/public.types.d.ts +11 -0
  56. package/dist/components/actions/public.types.d.ts.map +1 -0
  57. package/dist/components/actions/public.umd.js +2 -0
  58. package/dist/components/actions/public.umd.js.map +1 -0
  59. package/dist/components/actions/swap/Swap.d.ts +36 -0
  60. package/dist/components/actions/swap/Swap.d.ts.map +1 -0
  61. package/dist/components/actions/swap/swap.context.d.ts +2 -0
  62. package/dist/components/actions/swap/swap.context.d.ts.map +1 -0
  63. package/dist/components/actions/swap/swap.props.d.ts +18 -0
  64. package/dist/components/actions/swap/swap.props.d.ts.map +1 -0
  65. package/dist/components/actions/swap/swap.types.d.ts +2 -0
  66. package/dist/components/actions/swap/swap.types.d.ts.map +1 -0
  67. package/dist/components/app/PoppyApp.d.ts +14 -0
  68. package/dist/components/app/PoppyApp.d.ts.map +1 -0
  69. package/dist/components/app/public.d.ts +2 -0
  70. package/dist/components/app/public.d.ts.map +1 -0
  71. package/dist/components/app/public.es.js +42 -0
  72. package/dist/components/app/public.es.js.map +1 -0
  73. package/dist/components/app/public.umd.js +2 -0
  74. package/dist/components/app/public.umd.js.map +1 -0
  75. package/dist/components/data/checkbox/Checkbox.d.ts +25 -0
  76. package/dist/components/data/checkbox/Checkbox.d.ts.map +1 -0
  77. package/dist/components/data/checkbox/checkbox.context.d.ts +2 -0
  78. package/dist/components/data/checkbox/checkbox.context.d.ts.map +1 -0
  79. package/dist/components/data/checkbox/checkbox.props.d.ts +44 -0
  80. package/dist/components/data/checkbox/checkbox.props.d.ts.map +1 -0
  81. package/dist/components/data/checkbox/checkbox.types.d.ts +4 -0
  82. package/dist/components/data/checkbox/checkbox.types.d.ts.map +1 -0
  83. package/dist/components/data/field-set/FieldSet.d.ts +21 -0
  84. package/dist/components/data/field-set/FieldSet.d.ts.map +1 -0
  85. package/dist/components/data/field-set/field-set.props.d.ts +20 -0
  86. package/dist/components/data/field-set/field-set.props.d.ts.map +1 -0
  87. package/dist/components/data/form/Form.d.ts +37 -0
  88. package/dist/components/data/form/Form.d.ts.map +1 -0
  89. package/dist/components/data/form/form.context.d.ts +57 -0
  90. package/dist/components/data/form/form.context.d.ts.map +1 -0
  91. package/dist/components/data/form/form.props.d.ts +28 -0
  92. package/dist/components/data/form/form.props.d.ts.map +1 -0
  93. package/dist/components/data/form/form.types.d.ts +25 -0
  94. package/dist/components/data/form/form.types.d.ts.map +1 -0
  95. package/dist/components/data/form-field/FormField.d.ts +28 -0
  96. package/dist/components/data/form-field/FormField.d.ts.map +1 -0
  97. package/dist/components/data/form-field/form-field.context.d.ts +53 -0
  98. package/dist/components/data/form-field/form-field.context.d.ts.map +1 -0
  99. package/dist/components/data/form-field/form-field.props.d.ts +37 -0
  100. package/dist/components/data/form-field/form-field.props.d.ts.map +1 -0
  101. package/dist/components/data/form-field/form-field.types.d.ts +2 -0
  102. package/dist/components/data/form-field/form-field.types.d.ts.map +1 -0
  103. package/dist/components/data/input/Input.d.ts +31 -0
  104. package/dist/components/data/input/Input.d.ts.map +1 -0
  105. package/dist/components/data/input/input.context.d.ts +2 -0
  106. package/dist/components/data/input/input.context.d.ts.map +1 -0
  107. package/dist/components/data/input/input.props.d.ts +78 -0
  108. package/dist/components/data/input/input.props.d.ts.map +1 -0
  109. package/dist/components/data/input/input.types.d.ts +6 -0
  110. package/dist/components/data/input/input.types.d.ts.map +1 -0
  111. package/dist/components/data/public.d.ts +13 -0
  112. package/dist/components/data/public.d.ts.map +1 -0
  113. package/dist/components/data/public.es.js +1816 -0
  114. package/dist/components/data/public.es.js.map +1 -0
  115. package/dist/components/data/public.types.d.ts +21 -0
  116. package/dist/components/data/public.types.d.ts.map +1 -0
  117. package/dist/components/data/public.umd.js +2 -0
  118. package/dist/components/data/public.umd.js.map +1 -0
  119. package/dist/components/data/radio/Radio.d.ts +25 -0
  120. package/dist/components/data/radio/Radio.d.ts.map +1 -0
  121. package/dist/components/data/radio/radio.context.d.ts +2 -0
  122. package/dist/components/data/radio/radio.context.d.ts.map +1 -0
  123. package/dist/components/data/radio/radio.props.d.ts +47 -0
  124. package/dist/components/data/radio/radio.props.d.ts.map +1 -0
  125. package/dist/components/data/radio/radio.types.d.ts +4 -0
  126. package/dist/components/data/radio/radio.types.d.ts.map +1 -0
  127. package/dist/components/data/radio-group/RadioGroup.d.ts +28 -0
  128. package/dist/components/data/radio-group/RadioGroup.d.ts.map +1 -0
  129. package/dist/components/data/radio-group/radio-group.context.d.ts +13 -0
  130. package/dist/components/data/radio-group/radio-group.context.d.ts.map +1 -0
  131. package/dist/components/data/radio-group/radio-group.props.d.ts +12 -0
  132. package/dist/components/data/radio-group/radio-group.props.d.ts.map +1 -0
  133. package/dist/components/data/rating/Rating.d.ts +26 -0
  134. package/dist/components/data/rating/Rating.d.ts.map +1 -0
  135. package/dist/components/data/rating/rating.context.d.ts +2 -0
  136. package/dist/components/data/rating/rating.context.d.ts.map +1 -0
  137. package/dist/components/data/rating/rating.props.d.ts +44 -0
  138. package/dist/components/data/rating/rating.props.d.ts.map +1 -0
  139. package/dist/components/data/rating/rating.types.d.ts +6 -0
  140. package/dist/components/data/rating/rating.types.d.ts.map +1 -0
  141. package/dist/components/data/select/Select.d.ts +79 -0
  142. package/dist/components/data/select/Select.d.ts.map +1 -0
  143. package/dist/components/data/select/select.context.d.ts +2 -0
  144. package/dist/components/data/select/select.context.d.ts.map +1 -0
  145. package/dist/components/data/select/select.props.d.ts +99 -0
  146. package/dist/components/data/select/select.props.d.ts.map +1 -0
  147. package/dist/components/data/select/select.types.d.ts +20 -0
  148. package/dist/components/data/select/select.types.d.ts.map +1 -0
  149. package/dist/components/data/slider/Slider.d.ts +29 -0
  150. package/dist/components/data/slider/Slider.d.ts.map +1 -0
  151. package/dist/components/data/slider/slider.context.d.ts +2 -0
  152. package/dist/components/data/slider/slider.context.d.ts.map +1 -0
  153. package/dist/components/data/slider/slider.props.d.ts +70 -0
  154. package/dist/components/data/slider/slider.props.d.ts.map +1 -0
  155. package/dist/components/data/slider/slider.types.d.ts +7 -0
  156. package/dist/components/data/slider/slider.types.d.ts.map +1 -0
  157. package/dist/components/data/textarea/Textarea.d.ts +22 -0
  158. package/dist/components/data/textarea/Textarea.d.ts.map +1 -0
  159. package/dist/components/data/textarea/textarea.context.d.ts +2 -0
  160. package/dist/components/data/textarea/textarea.context.d.ts.map +1 -0
  161. package/dist/components/data/textarea/textarea.props.d.ts +64 -0
  162. package/dist/components/data/textarea/textarea.props.d.ts.map +1 -0
  163. package/dist/components/data/textarea/textarea.types.d.ts +5 -0
  164. package/dist/components/data/textarea/textarea.types.d.ts.map +1 -0
  165. package/dist/components/data/toggle/Toggle.d.ts +31 -0
  166. package/dist/components/data/toggle/Toggle.d.ts.map +1 -0
  167. package/dist/components/data/toggle/toggle.context.d.ts +2 -0
  168. package/dist/components/data/toggle/toggle.context.d.ts.map +1 -0
  169. package/dist/components/data/toggle/toggle.props.d.ts +38 -0
  170. package/dist/components/data/toggle/toggle.props.d.ts.map +1 -0
  171. package/dist/components/data/toggle/toggle.types.d.ts +4 -0
  172. package/dist/components/data/toggle/toggle.types.d.ts.map +1 -0
  173. package/dist/components/display/accordion/Accordion.d.ts +42 -0
  174. package/dist/components/display/accordion/Accordion.d.ts.map +1 -0
  175. package/dist/components/display/accordion/AccordionItem.d.ts +35 -0
  176. package/dist/components/display/accordion/AccordionItem.d.ts.map +1 -0
  177. package/dist/components/display/accordion/accordion-item.context.d.ts +2 -0
  178. package/dist/components/display/accordion/accordion-item.context.d.ts.map +1 -0
  179. package/dist/components/display/accordion/accordion-item.props.d.ts +19 -0
  180. package/dist/components/display/accordion/accordion-item.props.d.ts.map +1 -0
  181. package/dist/components/display/accordion/accordion-item.types.d.ts +2 -0
  182. package/dist/components/display/accordion/accordion-item.types.d.ts.map +1 -0
  183. package/dist/components/display/accordion/accordion.context.d.ts +9 -0
  184. package/dist/components/display/accordion/accordion.context.d.ts.map +1 -0
  185. package/dist/components/display/accordion/accordion.props.d.ts +15 -0
  186. package/dist/components/display/accordion/accordion.props.d.ts.map +1 -0
  187. package/dist/components/display/avatar/Avatar.d.ts +14 -0
  188. package/dist/components/display/avatar/Avatar.d.ts.map +1 -0
  189. package/dist/components/display/avatar/avatar.context.d.ts +2 -0
  190. package/dist/components/display/avatar/avatar.context.d.ts.map +1 -0
  191. package/dist/components/display/avatar/avatar.props.d.ts +45 -0
  192. package/dist/components/display/avatar/avatar.props.d.ts.map +1 -0
  193. package/dist/components/display/avatar/avatar.types.d.ts +5 -0
  194. package/dist/components/display/avatar/avatar.types.d.ts.map +1 -0
  195. package/dist/components/display/badge/Badge.d.ts +12 -0
  196. package/dist/components/display/badge/Badge.d.ts.map +1 -0
  197. package/dist/components/display/badge/badge.context.d.ts +2 -0
  198. package/dist/components/display/badge/badge.context.d.ts.map +1 -0
  199. package/dist/components/display/badge/badge.props.d.ts +20 -0
  200. package/dist/components/display/badge/badge.props.d.ts.map +1 -0
  201. package/dist/components/display/badge/badge.types.d.ts +5 -0
  202. package/dist/components/display/badge/badge.types.d.ts.map +1 -0
  203. package/dist/components/display/card/Card.d.ts +12 -0
  204. package/dist/components/display/card/Card.d.ts.map +1 -0
  205. package/dist/components/display/card/CardActions.d.ts +12 -0
  206. package/dist/components/display/card/CardActions.d.ts.map +1 -0
  207. package/dist/components/display/card/CardBody.d.ts +14 -0
  208. package/dist/components/display/card/CardBody.d.ts.map +1 -0
  209. package/dist/components/display/card/CardTitle.d.ts +14 -0
  210. package/dist/components/display/card/CardTitle.d.ts.map +1 -0
  211. package/dist/components/display/card/card-actions.context.d.ts +2 -0
  212. package/dist/components/display/card/card-actions.context.d.ts.map +1 -0
  213. package/dist/components/display/card/card-actions.props.d.ts +15 -0
  214. package/dist/components/display/card/card-actions.props.d.ts.map +1 -0
  215. package/dist/components/display/card/card-actions.types.d.ts +2 -0
  216. package/dist/components/display/card/card-actions.types.d.ts.map +1 -0
  217. package/dist/components/display/card/card.context.d.ts +2 -0
  218. package/dist/components/display/card/card.context.d.ts.map +1 -0
  219. package/dist/components/display/card/card.props.d.ts +30 -0
  220. package/dist/components/display/card/card.props.d.ts.map +1 -0
  221. package/dist/components/display/card/card.types.d.ts +4 -0
  222. package/dist/components/display/card/card.types.d.ts.map +1 -0
  223. package/dist/components/display/carousel/Carousel.d.ts +16 -0
  224. package/dist/components/display/carousel/Carousel.d.ts.map +1 -0
  225. package/dist/components/display/carousel/carousel.context.d.ts +2 -0
  226. package/dist/components/display/carousel/carousel.context.d.ts.map +1 -0
  227. package/dist/components/display/carousel/carousel.props.d.ts +52 -0
  228. package/dist/components/display/carousel/carousel.props.d.ts.map +1 -0
  229. package/dist/components/display/carousel/carousel.types.d.ts +3 -0
  230. package/dist/components/display/carousel/carousel.types.d.ts.map +1 -0
  231. package/dist/components/display/chat/Chat.d.ts +20 -0
  232. package/dist/components/display/chat/Chat.d.ts.map +1 -0
  233. package/dist/components/display/chat/chat.context.d.ts +2 -0
  234. package/dist/components/display/chat/chat.context.d.ts.map +1 -0
  235. package/dist/components/display/chat/chat.props.d.ts +18 -0
  236. package/dist/components/display/chat/chat.props.d.ts.map +1 -0
  237. package/dist/components/display/chat/chat.types.d.ts +3 -0
  238. package/dist/components/display/chat/chat.types.d.ts.map +1 -0
  239. package/dist/components/display/countdown/Countdown.d.ts +38 -0
  240. package/dist/components/display/countdown/Countdown.d.ts.map +1 -0
  241. package/dist/components/display/countdown/countdown.context.d.ts +2 -0
  242. package/dist/components/display/countdown/countdown.context.d.ts.map +1 -0
  243. package/dist/components/display/countdown/countdown.props.d.ts +25 -0
  244. package/dist/components/display/countdown/countdown.props.d.ts.map +1 -0
  245. package/dist/components/display/countdown/countdown.types.d.ts +23 -0
  246. package/dist/components/display/countdown/countdown.types.d.ts.map +1 -0
  247. package/dist/components/display/diff/Diff.d.ts +16 -0
  248. package/dist/components/display/diff/Diff.d.ts.map +1 -0
  249. package/dist/components/display/hover-3d/Hover3d.d.ts +12 -0
  250. package/dist/components/display/hover-3d/Hover3d.d.ts.map +1 -0
  251. package/dist/components/display/hover-3d/hover-3d.props.d.ts +9 -0
  252. package/dist/components/display/hover-3d/hover-3d.props.d.ts.map +1 -0
  253. package/dist/components/display/hover-gallery/HoverGallery.d.ts +14 -0
  254. package/dist/components/display/hover-gallery/HoverGallery.d.ts.map +1 -0
  255. package/dist/components/display/kbd/Kbd.d.ts +12 -0
  256. package/dist/components/display/kbd/Kbd.d.ts.map +1 -0
  257. package/dist/components/display/kbd/kbd.context.d.ts +2 -0
  258. package/dist/components/display/kbd/kbd.context.d.ts.map +1 -0
  259. package/dist/components/display/kbd/kbd.props.d.ts +12 -0
  260. package/dist/components/display/kbd/kbd.props.d.ts.map +1 -0
  261. package/dist/components/display/kbd/kbd.types.d.ts +3 -0
  262. package/dist/components/display/kbd/kbd.types.d.ts.map +1 -0
  263. package/dist/components/display/list/List.d.ts +17 -0
  264. package/dist/components/display/list/List.d.ts.map +1 -0
  265. package/dist/components/display/list/ListItem.d.ts +22 -0
  266. package/dist/components/display/list/ListItem.d.ts.map +1 -0
  267. package/dist/components/display/list/list-item.props.d.ts +17 -0
  268. package/dist/components/display/list/list-item.props.d.ts.map +1 -0
  269. package/dist/components/display/list/list.props.d.ts +8 -0
  270. package/dist/components/display/list/list.props.d.ts.map +1 -0
  271. package/dist/components/display/public.d.ts +21 -0
  272. package/dist/components/display/public.d.ts.map +1 -0
  273. package/dist/components/display/public.es.js +2 -0
  274. package/dist/components/display/public.types.d.ts +28 -0
  275. package/dist/components/display/public.types.d.ts.map +1 -0
  276. package/dist/components/display/public.umd.js +1 -0
  277. package/dist/components/display/stat/Stat.d.ts +22 -0
  278. package/dist/components/display/stat/Stat.d.ts.map +1 -0
  279. package/dist/components/display/stat/Stats.d.ts +12 -0
  280. package/dist/components/display/stat/Stats.d.ts.map +1 -0
  281. package/dist/components/display/stat/stat.context.d.ts +2 -0
  282. package/dist/components/display/stat/stat.context.d.ts.map +1 -0
  283. package/dist/components/display/stat/stat.props.d.ts +42 -0
  284. package/dist/components/display/stat/stat.props.d.ts.map +1 -0
  285. package/dist/components/display/stat/stat.types.d.ts +2 -0
  286. package/dist/components/display/stat/stat.types.d.ts.map +1 -0
  287. package/dist/components/display/stat/stats.context.d.ts +2 -0
  288. package/dist/components/display/stat/stats.context.d.ts.map +1 -0
  289. package/dist/components/display/stat/stats.props.d.ts +11 -0
  290. package/dist/components/display/stat/stats.props.d.ts.map +1 -0
  291. package/dist/components/display/stat/stats.types.d.ts +2 -0
  292. package/dist/components/display/stat/stats.types.d.ts.map +1 -0
  293. package/dist/components/display/status/Status.d.ts +5 -0
  294. package/dist/components/display/status/Status.d.ts.map +1 -0
  295. package/dist/components/display/status/status.context.d.ts +2 -0
  296. package/dist/components/display/status/status.context.d.ts.map +1 -0
  297. package/dist/components/display/status/status.props.d.ts +27 -0
  298. package/dist/components/display/status/status.props.d.ts.map +1 -0
  299. package/dist/components/display/status/status.types.d.ts +5 -0
  300. package/dist/components/display/status/status.types.d.ts.map +1 -0
  301. package/dist/components/feedback/alert/Alert.d.ts +14 -0
  302. package/dist/components/feedback/alert/Alert.d.ts.map +1 -0
  303. package/dist/components/feedback/alert/alert.context.d.ts +2 -0
  304. package/dist/components/feedback/alert/alert.context.d.ts.map +1 -0
  305. package/dist/components/feedback/alert/alert.props.d.ts +27 -0
  306. package/dist/components/feedback/alert/alert.props.d.ts.map +1 -0
  307. package/dist/components/feedback/alert/alert.types.d.ts +4 -0
  308. package/dist/components/feedback/alert/alert.types.d.ts.map +1 -0
  309. package/dist/components/feedback/loading/Loading.d.ts +5 -0
  310. package/dist/components/feedback/loading/Loading.d.ts.map +1 -0
  311. package/dist/components/feedback/loading/loading.context.d.ts +2 -0
  312. package/dist/components/feedback/loading/loading.context.d.ts.map +1 -0
  313. package/dist/components/feedback/loading/loading.props.d.ts +23 -0
  314. package/dist/components/feedback/loading/loading.props.d.ts.map +1 -0
  315. package/dist/components/feedback/loading/loading.types.d.ts +5 -0
  316. package/dist/components/feedback/loading/loading.types.d.ts.map +1 -0
  317. package/dist/components/feedback/progress/Progress.d.ts +5 -0
  318. package/dist/components/feedback/progress/Progress.d.ts.map +1 -0
  319. package/dist/components/feedback/progress/progress.context.d.ts +2 -0
  320. package/dist/components/feedback/progress/progress.context.d.ts.map +1 -0
  321. package/dist/components/feedback/progress/progress.props.d.ts +28 -0
  322. package/dist/components/feedback/progress/progress.props.d.ts.map +1 -0
  323. package/dist/components/feedback/progress/progress.types.d.ts +2 -0
  324. package/dist/components/feedback/progress/progress.types.d.ts.map +1 -0
  325. package/dist/components/feedback/public.d.ts +6 -0
  326. package/dist/components/feedback/public.d.ts.map +1 -0
  327. package/dist/components/feedback/public.es.js +128 -0
  328. package/dist/components/feedback/public.es.js.map +1 -0
  329. package/dist/components/feedback/public.types.d.ts +13 -0
  330. package/dist/components/feedback/public.types.d.ts.map +1 -0
  331. package/dist/components/feedback/public.umd.js +2 -0
  332. package/dist/components/feedback/public.umd.js.map +1 -0
  333. package/dist/components/feedback/radial-progress/radial-progress.context.d.ts +2 -0
  334. package/dist/components/feedback/radial-progress/radial-progress.context.d.ts.map +1 -0
  335. package/dist/components/feedback/radial-progress/radial-progress.props.d.ts +32 -0
  336. package/dist/components/feedback/radial-progress/radial-progress.props.d.ts.map +1 -0
  337. package/dist/components/feedback/radial-progress/radial-progress.types.d.ts +2 -0
  338. package/dist/components/feedback/radial-progress/radial-progress.types.d.ts.map +1 -0
  339. package/dist/components/feedback/toast/Toast.d.ts +12 -0
  340. package/dist/components/feedback/toast/Toast.d.ts.map +1 -0
  341. package/dist/components/feedback/toast/toast.context.d.ts +9 -0
  342. package/dist/components/feedback/toast/toast.context.d.ts.map +1 -0
  343. package/dist/components/feedback/toast/toast.props.d.ts +31 -0
  344. package/dist/components/feedback/toast/toast.props.d.ts.map +1 -0
  345. package/dist/components/feedback/toast/toast.types.d.ts +5 -0
  346. package/dist/components/feedback/toast/toast.types.d.ts.map +1 -0
  347. package/dist/components/feedback/tooltip/Tooltip.d.ts +14 -0
  348. package/dist/components/feedback/tooltip/Tooltip.d.ts.map +1 -0
  349. package/dist/components/feedback/tooltip/tooltip.context.d.ts +2 -0
  350. package/dist/components/feedback/tooltip/tooltip.context.d.ts.map +1 -0
  351. package/dist/components/feedback/tooltip/tooltip.props.d.ts +39 -0
  352. package/dist/components/feedback/tooltip/tooltip.props.d.ts.map +1 -0
  353. package/dist/components/feedback/tooltip/tooltip.types.d.ts +3 -0
  354. package/dist/components/feedback/tooltip/tooltip.types.d.ts.map +1 -0
  355. package/dist/components/layout/divider/Divider.d.ts +12 -0
  356. package/dist/components/layout/divider/Divider.d.ts.map +1 -0
  357. package/dist/components/layout/divider/divider.context.d.ts +2 -0
  358. package/dist/components/layout/divider/divider.context.d.ts.map +1 -0
  359. package/dist/components/layout/divider/divider.props.d.ts +26 -0
  360. package/dist/components/layout/divider/divider.props.d.ts.map +1 -0
  361. package/dist/components/layout/divider/divider.types.d.ts +4 -0
  362. package/dist/components/layout/divider/divider.types.d.ts.map +1 -0
  363. package/dist/components/layout/drawer/Drawer.d.ts +39 -0
  364. package/dist/components/layout/drawer/Drawer.d.ts.map +1 -0
  365. package/dist/components/layout/drawer/drawer.context.d.ts +2 -0
  366. package/dist/components/layout/drawer/drawer.context.d.ts.map +1 -0
  367. package/dist/components/layout/drawer/drawer.props.d.ts +27 -0
  368. package/dist/components/layout/drawer/drawer.props.d.ts.map +1 -0
  369. package/dist/components/layout/drawer/drawer.types.d.ts +6 -0
  370. package/dist/components/layout/drawer/drawer.types.d.ts.map +1 -0
  371. package/dist/components/layout/indicator/Indicator.d.ts +14 -0
  372. package/dist/components/layout/indicator/Indicator.d.ts.map +1 -0
  373. package/dist/components/layout/indicator/indicator.context.d.ts +2 -0
  374. package/dist/components/layout/indicator/indicator.context.d.ts.map +1 -0
  375. package/dist/components/layout/indicator/indicator.props.d.ts +28 -0
  376. package/dist/components/layout/indicator/indicator.props.d.ts.map +1 -0
  377. package/dist/components/layout/indicator/indicator.types.d.ts +3 -0
  378. package/dist/components/layout/indicator/indicator.types.d.ts.map +1 -0
  379. package/dist/components/layout/join/Join.d.ts +12 -0
  380. package/dist/components/layout/join/Join.d.ts.map +1 -0
  381. package/dist/components/layout/join/join.context.d.ts +2 -0
  382. package/dist/components/layout/join/join.context.d.ts.map +1 -0
  383. package/dist/components/layout/join/join.props.d.ts +14 -0
  384. package/dist/components/layout/join/join.props.d.ts.map +1 -0
  385. package/dist/components/layout/join/join.types.d.ts +2 -0
  386. package/dist/components/layout/join/join.types.d.ts.map +1 -0
  387. package/dist/components/layout/mask/Mask.d.ts +12 -0
  388. package/dist/components/layout/mask/Mask.d.ts.map +1 -0
  389. package/dist/components/layout/mask/mask.context.d.ts +2 -0
  390. package/dist/components/layout/mask/mask.context.d.ts.map +1 -0
  391. package/dist/components/layout/mask/mask.props.d.ts +37 -0
  392. package/dist/components/layout/mask/mask.props.d.ts.map +1 -0
  393. package/dist/components/layout/mask/mask.types.d.ts +3 -0
  394. package/dist/components/layout/mask/mask.types.d.ts.map +1 -0
  395. package/dist/components/layout/public.d.ts +7 -0
  396. package/dist/components/layout/public.d.ts.map +1 -0
  397. package/dist/components/layout/public.es.js +206 -0
  398. package/dist/components/layout/public.es.js.map +1 -0
  399. package/dist/components/layout/public.types.d.ts +13 -0
  400. package/dist/components/layout/public.types.d.ts.map +1 -0
  401. package/dist/components/layout/public.umd.js +2 -0
  402. package/dist/components/layout/public.umd.js.map +1 -0
  403. package/dist/components/layout/stack/Stack.d.ts +12 -0
  404. package/dist/components/layout/stack/Stack.d.ts.map +1 -0
  405. package/dist/components/layout/stack/stack.context.d.ts +2 -0
  406. package/dist/components/layout/stack/stack.context.d.ts.map +1 -0
  407. package/dist/components/layout/stack/stack.props.d.ts +12 -0
  408. package/dist/components/layout/stack/stack.props.d.ts.map +1 -0
  409. package/dist/components/layout/stack/stack.types.d.ts +2 -0
  410. package/dist/components/layout/stack/stack.types.d.ts.map +1 -0
  411. package/dist/components/media/img/Img.d.ts +15 -0
  412. package/dist/components/media/img/Img.d.ts.map +1 -0
  413. package/dist/components/media/img/img.context.d.ts +2 -0
  414. package/dist/components/media/img/img.context.d.ts.map +1 -0
  415. package/dist/components/media/img/img.props.d.ts +76 -0
  416. package/dist/components/media/img/img.props.d.ts.map +1 -0
  417. package/dist/components/media/img/img.types.d.ts +33 -0
  418. package/dist/components/media/img/img.types.d.ts.map +1 -0
  419. package/dist/components/media/public.d.ts +2 -0
  420. package/dist/components/media/public.d.ts.map +1 -0
  421. package/dist/components/media/public.es.js +143 -0
  422. package/dist/components/media/public.es.js.map +1 -0
  423. package/dist/components/media/public.types.d.ts +3 -0
  424. package/dist/components/media/public.types.d.ts.map +1 -0
  425. package/dist/components/media/public.umd.js +2 -0
  426. package/dist/components/media/public.umd.js.map +1 -0
  427. package/dist/components/navigation/breadcrumbs/Breadcrumbs.d.ts +5 -0
  428. package/dist/components/navigation/breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  429. package/dist/components/navigation/breadcrumbs/breadcrumbs.context.d.ts +2 -0
  430. package/dist/components/navigation/breadcrumbs/breadcrumbs.context.d.ts.map +1 -0
  431. package/dist/components/navigation/breadcrumbs/breadcrumbs.props.d.ts +17 -0
  432. package/dist/components/navigation/breadcrumbs/breadcrumbs.props.d.ts.map +1 -0
  433. package/dist/components/navigation/breadcrumbs/breadcrumbs.types.d.ts +11 -0
  434. package/dist/components/navigation/breadcrumbs/breadcrumbs.types.d.ts.map +1 -0
  435. package/dist/components/navigation/dock/Dock.d.ts +12 -0
  436. package/dist/components/navigation/dock/Dock.d.ts.map +1 -0
  437. package/dist/components/navigation/dock/DockItem.d.ts +5 -0
  438. package/dist/components/navigation/dock/DockItem.d.ts.map +1 -0
  439. package/dist/components/navigation/dock/dock.context.d.ts +3 -0
  440. package/dist/components/navigation/dock/dock.context.d.ts.map +1 -0
  441. package/dist/components/navigation/dock/dock.props.d.ts +30 -0
  442. package/dist/components/navigation/dock/dock.props.d.ts.map +1 -0
  443. package/dist/components/navigation/dock/dock.types.d.ts +3 -0
  444. package/dist/components/navigation/dock/dock.types.d.ts.map +1 -0
  445. package/dist/components/navigation/link/Link.d.ts +12 -0
  446. package/dist/components/navigation/link/Link.d.ts.map +1 -0
  447. package/dist/components/navigation/link/link.context.d.ts +2 -0
  448. package/dist/components/navigation/link/link.context.d.ts.map +1 -0
  449. package/dist/components/navigation/link/link.props.d.ts +21 -0
  450. package/dist/components/navigation/link/link.props.d.ts.map +1 -0
  451. package/dist/components/navigation/link/link.types.d.ts +2 -0
  452. package/dist/components/navigation/link/link.types.d.ts.map +1 -0
  453. package/dist/components/navigation/menu/Menu.d.ts +12 -0
  454. package/dist/components/navigation/menu/Menu.d.ts.map +1 -0
  455. package/dist/components/navigation/menu/MenuItem.d.ts +36 -0
  456. package/dist/components/navigation/menu/MenuItem.d.ts.map +1 -0
  457. package/dist/components/navigation/menu/menu.context.d.ts +3 -0
  458. package/dist/components/navigation/menu/menu.context.d.ts.map +1 -0
  459. package/dist/components/navigation/menu/menu.props.d.ts +61 -0
  460. package/dist/components/navigation/menu/menu.props.d.ts.map +1 -0
  461. package/dist/components/navigation/menu/menu.types.d.ts +4 -0
  462. package/dist/components/navigation/menu/menu.types.d.ts.map +1 -0
  463. package/dist/components/navigation/navbar/Navbar.d.ts +4 -0
  464. package/dist/components/navigation/navbar/Navbar.d.ts.map +1 -0
  465. package/dist/components/navigation/public.d.ts +10 -0
  466. package/dist/components/navigation/public.d.ts.map +1 -0
  467. package/dist/components/navigation/public.es.js +2 -0
  468. package/dist/components/navigation/public.types.d.ts +11 -0
  469. package/dist/components/navigation/public.types.d.ts.map +1 -0
  470. package/dist/components/navigation/public.umd.js +1 -0
  471. package/dist/components/navigation/tab/Tab.d.ts +19 -0
  472. package/dist/components/navigation/tab/Tab.d.ts.map +1 -0
  473. package/dist/components/navigation/tab/Tabs.d.ts +20 -0
  474. package/dist/components/navigation/tab/Tabs.d.ts.map +1 -0
  475. package/dist/components/navigation/tab/tab.context.d.ts +10 -0
  476. package/dist/components/navigation/tab/tab.context.d.ts.map +1 -0
  477. package/dist/components/navigation/tab/tab.props.d.ts +59 -0
  478. package/dist/components/navigation/tab/tab.props.d.ts.map +1 -0
  479. package/dist/components/navigation/tab/tab.types.d.ts +5 -0
  480. package/dist/components/navigation/tab/tab.types.d.ts.map +1 -0
  481. package/dist/composables/public.d.ts +6 -0
  482. package/dist/composables/public.d.ts.map +1 -0
  483. package/dist/composables/public.es.js +39 -0
  484. package/dist/composables/public.es.js.map +1 -0
  485. package/dist/composables/public.umd.js +2 -0
  486. package/dist/composables/public.umd.js.map +1 -0
  487. package/dist/composables/use-component-config.d.ts +27 -0
  488. package/dist/composables/use-component-config.d.ts.map +1 -0
  489. package/dist/composables/use-config.d.ts +2 -0
  490. package/dist/composables/use-config.d.ts.map +1 -0
  491. package/dist/composables/use-form-field.d.ts +24 -0
  492. package/dist/composables/use-form-field.d.ts.map +1 -0
  493. package/dist/composables/use-select-counter.d.ts +13 -0
  494. package/dist/composables/use-select-counter.d.ts.map +1 -0
  495. package/dist/composables/use-toast.d.ts +36 -0
  496. package/dist/composables/use-toast.d.ts.map +1 -0
  497. package/dist/config/config.type.d.ts +96 -0
  498. package/dist/config/config.type.d.ts.map +1 -0
  499. package/dist/config/public.d.ts +3 -0
  500. package/dist/config/public.d.ts.map +1 -0
  501. package/dist/config/public.es.js +2 -0
  502. package/dist/config/public.types.d.ts +2 -0
  503. package/dist/config/public.types.d.ts.map +1 -0
  504. package/dist/config/public.umd.js +1 -0
  505. package/dist/config/size.context.d.ts +4 -0
  506. package/dist/config/size.context.d.ts.map +1 -0
  507. package/dist/config/symbol.d.ts +4 -0
  508. package/dist/config/symbol.d.ts.map +1 -0
  509. package/dist/plugin-vue.d.ts +33 -0
  510. package/dist/plugin-vue.d.ts.map +1 -0
  511. package/dist/public-1PFjXgZ6.cjs +2 -0
  512. package/dist/public-1PFjXgZ6.cjs.map +1 -0
  513. package/dist/public-D_MhbTxP.cjs +2 -0
  514. package/dist/public-D_MhbTxP.cjs.map +1 -0
  515. package/dist/public-Dqelew6J.js +615 -0
  516. package/dist/public-Dqelew6J.js.map +1 -0
  517. package/dist/public-H9TCdoJr.js +296 -0
  518. package/dist/public-H9TCdoJr.js.map +1 -0
  519. package/dist/public.d.ts +12 -0
  520. package/dist/public.d.ts.map +1 -0
  521. package/dist/public.es.js +15 -0
  522. package/dist/public.es.js.map +1 -0
  523. package/dist/public.umd.js +2 -0
  524. package/dist/public.umd.js.map +1 -0
  525. package/dist/style.css +2 -0
  526. package/dist/symbol-Cleu4XHu.cjs +2 -0
  527. package/dist/symbol-Cleu4XHu.cjs.map +1 -0
  528. package/dist/symbol-CziS7Pho.js +13 -0
  529. package/dist/symbol-CziS7Pho.js.map +1 -0
  530. package/dist/toast.context-BNg0Zn09.cjs +2 -0
  531. package/dist/toast.context-BNg0Zn09.cjs.map +1 -0
  532. package/dist/toast.context-CTPY2imu.js +7 -0
  533. package/dist/toast.context-CTPY2imu.js.map +1 -0
  534. package/dist/types/public.d.ts +3 -0
  535. package/dist/types/public.d.ts.map +1 -0
  536. package/dist/types/public.es.js +0 -0
  537. package/dist/types/public.umd.js +1 -0
  538. package/dist/types/size.type.d.ts +2 -0
  539. package/dist/types/size.type.d.ts.map +1 -0
  540. package/dist/types/utils.type.d.ts +5 -0
  541. package/dist/types/utils.type.d.ts.map +1 -0
  542. package/dist/use-component-config-C-IlXF0W.cjs +2 -0
  543. package/dist/use-component-config-C-IlXF0W.cjs.map +1 -0
  544. package/dist/use-component-config-CaJQbJOW.js +20 -0
  545. package/dist/use-component-config-CaJQbJOW.js.map +1 -0
  546. package/dist/use-select-counter-CgQha-_T.cjs +2 -0
  547. package/dist/use-select-counter-CgQha-_T.cjs.map +1 -0
  548. package/dist/use-select-counter-D_-Qwz61.js +72 -0
  549. package/dist/use-select-counter-D_-Qwz61.js.map +1 -0
  550. package/dist/utils/build-class.util.d.ts +4 -0
  551. package/dist/utils/build-class.util.d.ts.map +1 -0
  552. package/dist/utils/get-validation-message.d.ts +22 -0
  553. package/dist/utils/get-validation-message.d.ts.map +1 -0
  554. package/dist/utils/path.d.ts +20 -0
  555. package/dist/utils/path.d.ts.map +1 -0
  556. package/dist/utils/props.util.d.ts +2 -0
  557. package/dist/utils/props.util.d.ts.map +1 -0
  558. package/dist/utils/public.d.ts +2 -0
  559. package/dist/utils/public.d.ts.map +1 -0
  560. package/package.json +138 -0
  561. package/src/components/ClassWrapper.vue +42 -0
  562. package/src/components/actions/button/Button.story.vue +184 -0
  563. package/src/components/actions/button/Button.vue +110 -0
  564. package/src/components/actions/button/button.context.ts +3 -0
  565. package/src/components/actions/button/button.props.ts +56 -0
  566. package/src/components/actions/button/button.types.ts +7 -0
  567. package/src/components/actions/dropdown/Dropdown.story.vue +360 -0
  568. package/src/components/actions/dropdown/Dropdown.vue +218 -0
  569. package/src/components/actions/dropdown/dropdown.context.ts +3 -0
  570. package/src/components/actions/dropdown/dropdown.props.ts +59 -0
  571. package/src/components/actions/dropdown/dropdown.types.ts +4 -0
  572. package/src/components/actions/fab/Fab.story.vue +227 -0
  573. package/src/components/actions/fab/Fab.vue +33 -0
  574. package/src/components/actions/fab/fab.context.ts +3 -0
  575. package/src/components/actions/fab/fab.props.ts +11 -0
  576. package/src/components/actions/fab/fab.types.ts +1 -0
  577. package/src/components/actions/modal/Modal.story.vue +285 -0
  578. package/src/components/actions/modal/Modal.vue +106 -0
  579. package/src/components/actions/modal/modal.context.ts +3 -0
  580. package/src/components/actions/modal/modal.props.ts +29 -0
  581. package/src/components/actions/modal/modal.types.ts +1 -0
  582. package/src/components/actions/public.ts +5 -0
  583. package/src/components/actions/public.types.ts +15 -0
  584. package/src/components/actions/swap/Swap.story.vue +302 -0
  585. package/src/components/actions/swap/Swap.vue +59 -0
  586. package/src/components/actions/swap/swap.context.ts +3 -0
  587. package/src/components/actions/swap/swap.props.ts +17 -0
  588. package/src/components/actions/swap/swap.types.ts +1 -0
  589. package/src/components/app/PoppyApp.vue +48 -0
  590. package/src/components/app/public.ts +1 -0
  591. package/src/components/data/checkbox/Checkbox.story.vue +206 -0
  592. package/src/components/data/checkbox/Checkbox.vue +139 -0
  593. package/src/components/data/checkbox/checkbox.context.ts +3 -0
  594. package/src/components/data/checkbox/checkbox.props.ts +42 -0
  595. package/src/components/data/checkbox/checkbox.types.ts +5 -0
  596. package/src/components/data/field-set/FieldSet.story.vue +163 -0
  597. package/src/components/data/field-set/FieldSet.vue +22 -0
  598. package/src/components/data/field-set/field-set.props.ts +21 -0
  599. package/src/components/data/form/Form.story.vue +144 -0
  600. package/src/components/data/form/Form.vue +235 -0
  601. package/src/components/data/form/form.context.ts +82 -0
  602. package/src/components/data/form/form.props.ts +30 -0
  603. package/src/components/data/form/form.types.ts +25 -0
  604. package/src/components/data/form-field/FormField.vue +176 -0
  605. package/src/components/data/form-field/form-field.context.ts +71 -0
  606. package/src/components/data/form-field/form-field.props.ts +42 -0
  607. package/src/components/data/form-field/form-field.types.ts +1 -0
  608. package/src/components/data/input/Input.story.vue +276 -0
  609. package/src/components/data/input/Input.vue +233 -0
  610. package/src/components/data/input/input.context.ts +3 -0
  611. package/src/components/data/input/input.props.ts +87 -0
  612. package/src/components/data/input/input.types.ts +10 -0
  613. package/src/components/data/public.ts +12 -0
  614. package/src/components/data/public.types.ts +30 -0
  615. package/src/components/data/radio/Radio.story.vue +228 -0
  616. package/src/components/data/radio/Radio.vue +152 -0
  617. package/src/components/data/radio/radio.context.ts +3 -0
  618. package/src/components/data/radio/radio.props.ts +53 -0
  619. package/src/components/data/radio/radio.types.ts +5 -0
  620. package/src/components/data/radio-group/RadioGroup.story.vue +155 -0
  621. package/src/components/data/radio-group/RadioGroup.vue +65 -0
  622. package/src/components/data/radio-group/radio-group.context.ts +14 -0
  623. package/src/components/data/radio-group/radio-group.props.ts +12 -0
  624. package/src/components/data/rating/Rating.story.vue +150 -0
  625. package/src/components/data/rating/Rating.vue +190 -0
  626. package/src/components/data/rating/rating.context.ts +3 -0
  627. package/src/components/data/rating/rating.props.ts +43 -0
  628. package/src/components/data/rating/rating.types.ts +8 -0
  629. package/src/components/data/select/Select.story.vue +317 -0
  630. package/src/components/data/select/Select.vue +747 -0
  631. package/src/components/data/select/select.context.ts +3 -0
  632. package/src/components/data/select/select.props.ts +110 -0
  633. package/src/components/data/select/select.types.ts +24 -0
  634. package/src/components/data/slider/Slider.story.vue +276 -0
  635. package/src/components/data/slider/Slider.vue +802 -0
  636. package/src/components/data/slider/slider.context.ts +3 -0
  637. package/src/components/data/slider/slider.props.ts +69 -0
  638. package/src/components/data/slider/slider.types.ts +11 -0
  639. package/src/components/data/textarea/Textarea.story.vue +222 -0
  640. package/src/components/data/textarea/Textarea.vue +168 -0
  641. package/src/components/data/textarea/textarea.context.ts +3 -0
  642. package/src/components/data/textarea/textarea.props.ts +71 -0
  643. package/src/components/data/textarea/textarea.types.ts +7 -0
  644. package/src/components/data/toggle/Toggle.story.vue +195 -0
  645. package/src/components/data/toggle/Toggle.vue +136 -0
  646. package/src/components/data/toggle/toggle.context.ts +3 -0
  647. package/src/components/data/toggle/toggle.props.ts +40 -0
  648. package/src/components/data/toggle/toggle.types.ts +5 -0
  649. package/src/components/display/accordion/Accordion.story.vue +482 -0
  650. package/src/components/display/accordion/Accordion.vue +112 -0
  651. package/src/components/display/accordion/AccordionItem.vue +111 -0
  652. package/src/components/display/accordion/accordion-item.context.ts +3 -0
  653. package/src/components/display/accordion/accordion-item.props.ts +20 -0
  654. package/src/components/display/accordion/accordion-item.types.ts +1 -0
  655. package/src/components/display/accordion/accordion.context.ts +10 -0
  656. package/src/components/display/accordion/accordion.props.ts +16 -0
  657. package/src/components/display/avatar/Avatar.story.vue +341 -0
  658. package/src/components/display/avatar/Avatar.vue +57 -0
  659. package/src/components/display/avatar/avatar.context.ts +3 -0
  660. package/src/components/display/avatar/avatar.props.ts +44 -0
  661. package/src/components/display/avatar/avatar.types.ts +5 -0
  662. package/src/components/display/badge/Badge.story.vue +156 -0
  663. package/src/components/display/badge/Badge.vue +51 -0
  664. package/src/components/display/badge/badge.context.ts +3 -0
  665. package/src/components/display/badge/badge.props.ts +22 -0
  666. package/src/components/display/badge/badge.types.ts +5 -0
  667. package/src/components/display/card/Card.story.vue +312 -0
  668. package/src/components/display/card/Card.vue +40 -0
  669. package/src/components/display/card/CardActions.vue +30 -0
  670. package/src/components/display/card/CardBody.vue +5 -0
  671. package/src/components/display/card/CardTitle.vue +5 -0
  672. package/src/components/display/card/card-actions.context.ts +3 -0
  673. package/src/components/display/card/card-actions.props.ts +15 -0
  674. package/src/components/display/card/card-actions.types.ts +1 -0
  675. package/src/components/display/card/card.context.ts +3 -0
  676. package/src/components/display/card/card.props.ts +29 -0
  677. package/src/components/display/card/card.types.ts +4 -0
  678. package/src/components/display/carousel/Carousel.story.vue +216 -0
  679. package/src/components/display/carousel/Carousel.vue +156 -0
  680. package/src/components/display/carousel/carousel.context.ts +3 -0
  681. package/src/components/display/carousel/carousel.props.ts +51 -0
  682. package/src/components/display/carousel/carousel.types.ts +2 -0
  683. package/src/components/display/chat/Chat.story.vue +251 -0
  684. package/src/components/display/chat/Chat.vue +56 -0
  685. package/src/components/display/chat/chat.context.ts +3 -0
  686. package/src/components/display/chat/chat.props.ts +19 -0
  687. package/src/components/display/chat/chat.types.ts +2 -0
  688. package/src/components/display/countdown/Countdown.story.vue +285 -0
  689. package/src/components/display/countdown/Countdown.vue +114 -0
  690. package/src/components/display/countdown/countdown.context.ts +3 -0
  691. package/src/components/display/countdown/countdown.props.ts +26 -0
  692. package/src/components/display/countdown/countdown.types.ts +24 -0
  693. package/src/components/display/diff/Diff.story.vue +118 -0
  694. package/src/components/display/diff/Diff.vue +13 -0
  695. package/src/components/display/hover-3d/Hover3d.story.vue +154 -0
  696. package/src/components/display/hover-3d/Hover3d.vue +37 -0
  697. package/src/components/display/hover-3d/hover-3d.props.ts +9 -0
  698. package/src/components/display/hover-gallery/HoverGallery.story.vue +121 -0
  699. package/src/components/display/hover-gallery/HoverGallery.vue +5 -0
  700. package/src/components/display/kbd/Kbd.story.vue +214 -0
  701. package/src/components/display/kbd/Kbd.vue +32 -0
  702. package/src/components/display/kbd/kbd.context.ts +3 -0
  703. package/src/components/display/kbd/kbd.props.ts +12 -0
  704. package/src/components/display/kbd/kbd.types.ts +3 -0
  705. package/src/components/display/list/List.story.vue +381 -0
  706. package/src/components/display/list/List.vue +14 -0
  707. package/src/components/display/list/ListItem.vue +53 -0
  708. package/src/components/display/list/list-item.props.ts +19 -0
  709. package/src/components/display/list/list.props.ts +7 -0
  710. package/src/components/display/public.ts +20 -0
  711. package/src/components/display/public.types.ts +40 -0
  712. package/src/components/display/stat/Stat.story.vue +181 -0
  713. package/src/components/display/stat/Stat.vue +43 -0
  714. package/src/components/display/stat/Stats.vue +29 -0
  715. package/src/components/display/stat/stat.context.ts +3 -0
  716. package/src/components/display/stat/stat.props.ts +50 -0
  717. package/src/components/display/stat/stat.types.ts +1 -0
  718. package/src/components/display/stat/stats.context.ts +3 -0
  719. package/src/components/display/stat/stats.props.ts +11 -0
  720. package/src/components/display/stat/stats.types.ts +1 -0
  721. package/src/components/display/status/Status.story.vue +195 -0
  722. package/src/components/display/status/Status.vue +70 -0
  723. package/src/components/display/status/status.context.ts +3 -0
  724. package/src/components/display/status/status.props.ts +30 -0
  725. package/src/components/display/status/status.types.ts +5 -0
  726. package/src/components/feedback/alert/Alert.story.vue +243 -0
  727. package/src/components/feedback/alert/Alert.vue +46 -0
  728. package/src/components/feedback/alert/alert.context.ts +3 -0
  729. package/src/components/feedback/alert/alert.props.ts +29 -0
  730. package/src/components/feedback/alert/alert.types.ts +3 -0
  731. package/src/components/feedback/loading/Loading.story.vue +156 -0
  732. package/src/components/feedback/loading/Loading.vue +55 -0
  733. package/src/components/feedback/loading/loading.context.ts +3 -0
  734. package/src/components/feedback/loading/loading.props.ts +25 -0
  735. package/src/components/feedback/loading/loading.types.ts +5 -0
  736. package/src/components/feedback/progress/Progress.story.vue +96 -0
  737. package/src/components/feedback/progress/Progress.vue +36 -0
  738. package/src/components/feedback/progress/progress.context.ts +3 -0
  739. package/src/components/feedback/progress/progress.props.ts +27 -0
  740. package/src/components/feedback/progress/progress.types.ts +1 -0
  741. package/src/components/feedback/public.ts +5 -0
  742. package/src/components/feedback/public.types.ts +18 -0
  743. package/src/components/feedback/radial-progress/RadialProgress.story.vue +118 -0
  744. package/src/components/feedback/radial-progress/RadialProgress.vue +46 -0
  745. package/src/components/feedback/radial-progress/radial-progress.context.ts +3 -0
  746. package/src/components/feedback/radial-progress/radial-progress.props.ts +35 -0
  747. package/src/components/feedback/radial-progress/radial-progress.types.ts +9 -0
  748. package/src/components/feedback/toast/Toast.story.vue +356 -0
  749. package/src/components/feedback/toast/Toast.vue +40 -0
  750. package/src/components/feedback/toast/toast.context.ts +12 -0
  751. package/src/components/feedback/toast/toast.props.ts +33 -0
  752. package/src/components/feedback/toast/toast.types.ts +5 -0
  753. package/src/components/feedback/tooltip/Tooltip.story.vue +256 -0
  754. package/src/components/feedback/tooltip/Tooltip.vue +123 -0
  755. package/src/components/feedback/tooltip/tooltip.context.ts +3 -0
  756. package/src/components/feedback/tooltip/tooltip.props.ts +44 -0
  757. package/src/components/feedback/tooltip/tooltip.types.ts +2 -0
  758. package/src/components/layout/divider/Divider.story.vue +217 -0
  759. package/src/components/layout/divider/Divider.vue +48 -0
  760. package/src/components/layout/divider/divider.context.ts +3 -0
  761. package/src/components/layout/divider/divider.props.ts +28 -0
  762. package/src/components/layout/divider/divider.types.ts +3 -0
  763. package/src/components/layout/drawer/Drawer.story.vue +301 -0
  764. package/src/components/layout/drawer/Drawer.vue +88 -0
  765. package/src/components/layout/drawer/drawer.context.ts +3 -0
  766. package/src/components/layout/drawer/drawer.props.ts +25 -0
  767. package/src/components/layout/drawer/drawer.types.ts +6 -0
  768. package/src/components/layout/indicator/Indicator.story.vue +264 -0
  769. package/src/components/layout/indicator/Indicator.vue +43 -0
  770. package/src/components/layout/indicator/indicator.context.ts +3 -0
  771. package/src/components/layout/indicator/indicator.props.ts +27 -0
  772. package/src/components/layout/indicator/indicator.types.ts +2 -0
  773. package/src/components/layout/join/Join.story.vue +147 -0
  774. package/src/components/layout/join/Join.vue +32 -0
  775. package/src/components/layout/join/join.context.ts +3 -0
  776. package/src/components/layout/join/join.props.ts +14 -0
  777. package/src/components/layout/join/join.types.ts +1 -0
  778. package/src/components/layout/mask/Mask.story.vue +181 -0
  779. package/src/components/layout/mask/Mask.vue +49 -0
  780. package/src/components/layout/mask/mask.context.ts +3 -0
  781. package/src/components/layout/mask/mask.props.ts +36 -0
  782. package/src/components/layout/mask/mask.types.ts +18 -0
  783. package/src/components/layout/public.ts +6 -0
  784. package/src/components/layout/public.types.ts +18 -0
  785. package/src/components/layout/stack/Stack.story.vue +170 -0
  786. package/src/components/layout/stack/Stack.vue +29 -0
  787. package/src/components/layout/stack/stack.context.ts +3 -0
  788. package/src/components/layout/stack/stack.props.ts +12 -0
  789. package/src/components/layout/stack/stack.types.ts +1 -0
  790. package/src/components/media/img/Img.story.vue +214 -0
  791. package/src/components/media/img/Img.vue +189 -0
  792. package/src/components/media/img/img.context.ts +3 -0
  793. package/src/components/media/img/img.props.ts +88 -0
  794. package/src/components/media/img/img.types.ts +35 -0
  795. package/src/components/media/public.ts +1 -0
  796. package/src/components/media/public.types.ts +3 -0
  797. package/src/components/navigation/breadcrumbs/Breadcrumbs.story.vue +94 -0
  798. package/src/components/navigation/breadcrumbs/Breadcrumbs.vue +53 -0
  799. package/src/components/navigation/breadcrumbs/breadcrumbs.context.ts +3 -0
  800. package/src/components/navigation/breadcrumbs/breadcrumbs.props.ts +18 -0
  801. package/src/components/navigation/breadcrumbs/breadcrumbs.types.ts +13 -0
  802. package/src/components/navigation/dock/Dock.story.vue +109 -0
  803. package/src/components/navigation/dock/Dock.vue +32 -0
  804. package/src/components/navigation/dock/DockItem.vue +50 -0
  805. package/src/components/navigation/dock/dock.context.ts +4 -0
  806. package/src/components/navigation/dock/dock.props.ts +34 -0
  807. package/src/components/navigation/dock/dock.types.ts +3 -0
  808. package/src/components/navigation/link/Link.story.vue +129 -0
  809. package/src/components/navigation/link/Link.vue +57 -0
  810. package/src/components/navigation/link/link.context.ts +3 -0
  811. package/src/components/navigation/link/link.props.ts +20 -0
  812. package/src/components/navigation/link/link.types.ts +1 -0
  813. package/src/components/navigation/menu/Menu.story.vue +284 -0
  814. package/src/components/navigation/menu/Menu.vue +41 -0
  815. package/src/components/navigation/menu/MenuItem.vue +106 -0
  816. package/src/components/navigation/menu/menu.context.ts +4 -0
  817. package/src/components/navigation/menu/menu.props.ts +59 -0
  818. package/src/components/navigation/menu/menu.types.ts +4 -0
  819. package/src/components/navigation/navbar/Navbar.story.vue +154 -0
  820. package/src/components/navigation/navbar/Navbar.vue +8 -0
  821. package/src/components/navigation/public.ts +9 -0
  822. package/src/components/navigation/public.types.ts +15 -0
  823. package/src/components/navigation/tab/Tab.story.vue +186 -0
  824. package/src/components/navigation/tab/Tab.vue +106 -0
  825. package/src/components/navigation/tab/Tabs.vue +76 -0
  826. package/src/components/navigation/tab/tab.context.ts +13 -0
  827. package/src/components/navigation/tab/tab.props.ts +57 -0
  828. package/src/components/navigation/tab/tab.types.ts +5 -0
  829. package/src/composables/public.ts +5 -0
  830. package/src/composables/use-component-config.ts +44 -0
  831. package/src/composables/use-config.ts +6 -0
  832. package/src/composables/use-form-field.ts +99 -0
  833. package/src/composables/use-select-counter.ts +58 -0
  834. package/src/composables/use-toast.ts +47 -0
  835. package/src/config/config.type.ts +109 -0
  836. package/src/config/public.ts +2 -0
  837. package/src/config/public.types.ts +1 -0
  838. package/src/config/size.context.ts +4 -0
  839. package/src/config/symbol.ts +15 -0
  840. package/src/histoire.css +8 -0
  841. package/src/plugin-vue.ts +54 -0
  842. package/src/public.ts +12 -0
  843. package/src/stories/Configuration.story.md +55 -0
  844. package/src/types/public.ts +2 -0
  845. package/src/types/size.type.ts +1 -0
  846. package/src/types/utils.type.ts +5 -0
  847. package/src/utils/build-class.util.ts +38 -0
  848. package/src/utils/get-validation-message.ts +61 -0
  849. package/src/utils/path.ts +102 -0
  850. package/src/utils/props.util.ts +11 -0
  851. package/src/utils/public.ts +1 -0
  852. package/src/vite-env.d.ts +11 -0
  853. package/src/vue.d.ts +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.es.js","names":["$slots","$slots","$attrs","$attrs","$t","$attrs"],"sources":["../../../src/components/data/checkbox/checkbox.context.ts","../../../src/components/data/checkbox/Checkbox.vue","../../../src/components/data/checkbox/Checkbox.vue","../../../src/components/data/field-set/FieldSet.vue","../../../src/components/data/field-set/FieldSet.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-group/radio-group.context.ts","../../../src/components/data/radio/radio.context.ts","../../../src/components/data/radio/Radio.vue","../../../src/components/data/radio/Radio.vue","../../../src/components/data/radio-group/RadioGroup.vue","../../../src/components/data/radio-group/RadioGroup.vue","../../../src/components/data/rating/rating.context.ts","../../../src/components/data/rating/Rating.vue","../../../src/components/data/rating/Rating.vue","../../../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 '@/config/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 { 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')\nconst slots = useSlots()\n\n// ── Indeterminate — must be set imperatively on the DOM node ─────────────────\n\nwatchEffect(() => {\n if (inputEl.value) {\n inputEl.value.indeterminate = !!props.indeterminate\n }\n})\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => !!props.required),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() =>\n field ? fieldValue.value : model.value,\n)\n\nfunction handleChange(event: Event): void {\n if (props.readonly) {\n event.preventDefault()\n return\n }\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 / description ──────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\nconst hasDescription = computed(() => !!(props.description || slots.description))\nconst hasHint = computed(() => !!(props.hint || slots.hint))\nconst hasLabel = computed(() => hasDescription.value || hasHint.value)\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- Checkbox with description / hint label to the right -->\n <label\n v-if=\"hasLabel\"\n class=\"flex cursor-pointer items-start gap-2\"\n :class=\"{ 'opacity-60 pointer-events-none': disabled || readonly }\"\n >\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 { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"flex flex-col gap-0.5\">\n <span v-if=\"hasDescription\" class=\"label-text leading-snug\">\n <slot name=\"description\">{{ description }}</slot>\n <span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </span>\n <span v-if=\"hasHint\" class=\"label-text text-xs text-base-content/60 leading-snug\">\n <slot name=\"hint\">{{ hint }}</slot>\n </span>\n </span>\n </label>\n\n <!-- Bare checkbox — no label -->\n <input\n v-else\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 { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\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 { 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')\nconst slots = useSlots()\n\n// ── Indeterminate — must be set imperatively on the DOM node ─────────────────\n\nwatchEffect(() => {\n if (inputEl.value) {\n inputEl.value.indeterminate = !!props.indeterminate\n }\n})\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => !!props.required),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() =>\n field ? fieldValue.value : model.value,\n)\n\nfunction handleChange(event: Event): void {\n if (props.readonly) {\n event.preventDefault()\n return\n }\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 / description ──────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\nconst hasDescription = computed(() => !!(props.description || slots.description))\nconst hasHint = computed(() => !!(props.hint || slots.hint))\nconst hasLabel = computed(() => hasDescription.value || hasHint.value)\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- Checkbox with description / hint label to the right -->\n <label\n v-if=\"hasLabel\"\n class=\"flex cursor-pointer items-start gap-2\"\n :class=\"{ 'opacity-60 pointer-events-none': disabled || readonly }\"\n >\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 { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"flex flex-col gap-0.5\">\n <span v-if=\"hasDescription\" class=\"label-text leading-snug\">\n <slot name=\"description\">{{ description }}</slot>\n <span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </span>\n <span v-if=\"hasHint\" class=\"label-text text-xs text-base-content/60 leading-snug\">\n <slot name=\"hint\">{{ hint }}</slot>\n </span>\n </span>\n </label>\n\n <!-- Bare checkbox — no label -->\n <input\n v-else\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 { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport type { FieldSetProps } from './field-set.props'\n\ndefineProps<FieldSetProps>()\n</script>\n\n<template>\n <fieldset\n class=\"fieldset w-full\"\n :class=\"[\n bordered && 'border border-base-300 rounded-box p-4',\n background && 'bg-base-200',\n ]\"\n >\n <legend v-if=\"legend || $slots.legend\" class=\"fieldset-legend\">\n <slot name=\"legend\">{{ legend }}</slot>\n </legend>\n <slot name=\"header\" />\n <slot />\n <slot name=\"footer\" />\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\nimport type { FieldSetProps } from './field-set.props'\n\ndefineProps<FieldSetProps>()\n</script>\n\n<template>\n <fieldset\n class=\"fieldset w-full\"\n :class=\"[\n bordered && 'border border-base-300 rounded-box p-4',\n background && 'bg-base-200',\n ]\"\n >\n <legend v-if=\"legend || $slots.legend\" class=\"fieldset-legend\">\n <slot name=\"legend\">{{ legend }}</slot>\n </legend>\n <slot name=\"header\" />\n <slot />\n <slot name=\"footer\" />\n </fieldset>\n</template>\n","/**\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 /** Registers a field validator (called on form submit). Key must be unique per input instance. */\n registerValidator: (key: symbol, fn: () => boolean) => void\n\n /** Removes a previously registered field validator. */\n unregisterValidator: (key: symbol) => void\n}\n\nexport const FORM_CONTEXT_KEY: InjectionKey<FormContext> = Symbol('FormContext')\n","<script lang=\"ts\">\nimport type { CounterFn } from '@/types/utils.type'\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\nconst initialData: Record<string, unknown> = JSON.parse(JSON.stringify(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 ? props.counter : undefined,\n)\nconst counterFormat = shallowRef<string | CounterFn | undefined>(props.counterFormat)\n\nwatch(() => props.counter, val => {\n counter.value = val !== undefined ? 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\n// Registered validate callbacks from child inputs (via useFormField)\nconst validators: Map<symbol, () => boolean> = new Map()\n\nfunction registerValidator(key: symbol, fn: () => boolean): void {\n validators.set(key, fn)\n}\n\nfunction unregisterValidator(key: symbol): void {\n validators.delete(key)\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\nfunction reset(): void {\n // Clear all current keys, then restore snapshot taken at component creation\n for (const key of Object.keys(data)) {\n delete data[key]\n }\n Object.assign(data, JSON.parse(JSON.stringify(initialData)))\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 registerValidator,\n unregisterValidator,\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 { 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\nconst initialData: Record<string, unknown> = JSON.parse(JSON.stringify(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 ? props.counter : undefined,\n)\nconst counterFormat = shallowRef<string | CounterFn | undefined>(props.counterFormat)\n\nwatch(() => props.counter, val => {\n counter.value = val !== undefined ? 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\n// Registered validate callbacks from child inputs (via useFormField)\nconst validators: Map<symbol, () => boolean> = new Map()\n\nfunction registerValidator(key: symbol, fn: () => boolean): void {\n validators.set(key, fn)\n}\n\nfunction unregisterValidator(key: symbol): void {\n validators.delete(key)\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\nfunction reset(): void {\n // Clear all current keys, then restore snapshot taken at component creation\n for (const key of Object.keys(data)) {\n delete data[key]\n }\n Object.assign(data, JSON.parse(JSON.stringify(initialData)))\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 registerValidator,\n unregisterValidator,\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 { 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 config — same lazy-undefined logic as Form.\n\nconst counter = shallowRef<boolean | undefined>(\n props.counter !== undefined ? 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 ? val : undefined\n})\nwatch(() => props.counterFormat, (val) => { counterFormat.value = val })\n\n// Counter display — pushed up by child inputs\n\nconst counterText = shallowRef('')\nconst counterColor = shallowRef('')\n\nfunction setCounterText(text: string, colorClass: string): void {\n counterText.value = text\n counterColor.value = colorClass\n}\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\nfunction registerValidator(key: symbol, fn: () => boolean): void {\n formCtx?.registerValidator(key, fn)\n}\n\nfunction unregisterValidator(key: symbol): void {\n formCtx?.unregisterValidator(key)\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 counterText,\n counterColor,\n setValue,\n setRequired,\n setDirty,\n setTouched,\n setError,\n setCounterText,\n registerValidator,\n unregisterValidator,\n} satisfies FormFieldContext\n\nprovide(FORM_FIELD_CONTEXT_KEY, fieldContext)\n\n// Bottom row visibility\n\nconst showBottom = computed(() =>\n !!(fieldError.value || props.hint || counterText.value),\n)\n</script>\n\n<template>\n <fieldset class=\"fieldset w-full\">\n <!-- Floating label mode: label floats over the input -->\n <template v-if=\"floating\">\n <label class=\"floating-label\">\n <span v-if=\"label || $slots.label\">\n <slot name=\"label\" :required=\"required\">\n {{ label }}<span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </slot>\n </span>\n <slot />\n </label>\n </template>\n\n <!-- Default mode: legend above the field -->\n <template v-else>\n <legend v-if=\"label || $slots.label\" class=\"fieldset-legend\">\n <slot name=\"label\" :required=\"required\">\n {{ label }}<span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </slot>\n </legend>\n <slot />\n </template>\n\n <!-- Bottom row: error/hint left, counter right -->\n <div v-if=\"showBottom\" class=\"flex items-center justify-between gap-2 mt-1\">\n <Transition name=\"field-message\" mode=\"out-in\">\n <p v-if=\"fieldError\" key=\"error\" class=\"label text-error text-xs\" role=\"alert\">\n <slot name=\"error\" :error=\"fieldError\">{{ fieldError }}</slot>\n </p>\n <p v-else-if=\"hint\" key=\"hint\" class=\"label text-xs\">\n <slot name=\"hint\">{{ hint }}</slot>\n </p>\n <span v-else key=\"empty\" />\n </Transition>\n <span\n v-if=\"counterText\"\n class=\"label text-xs shrink-0\"\n :class=\"counterColor\"\n >{{ counterText }}</span>\n </div>\n </fieldset>\n</template>\n\n<style scoped>\n.field-message-enter-active,\n.field-message-leave-active {\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.field-message-enter-from,\n.field-message-leave-to {\n opacity: 0;\n transform: translateY(-4px);\n}\n</style>","<script lang=\"ts\">\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 config — same lazy-undefined logic as Form.\n\nconst counter = shallowRef<boolean | undefined>(\n props.counter !== undefined ? 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 ? val : undefined\n})\nwatch(() => props.counterFormat, (val) => { counterFormat.value = val })\n\n// Counter display — pushed up by child inputs\n\nconst counterText = shallowRef('')\nconst counterColor = shallowRef('')\n\nfunction setCounterText(text: string, colorClass: string): void {\n counterText.value = text\n counterColor.value = colorClass\n}\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\nfunction registerValidator(key: symbol, fn: () => boolean): void {\n formCtx?.registerValidator(key, fn)\n}\n\nfunction unregisterValidator(key: symbol): void {\n formCtx?.unregisterValidator(key)\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 counterText,\n counterColor,\n setValue,\n setRequired,\n setDirty,\n setTouched,\n setError,\n setCounterText,\n registerValidator,\n unregisterValidator,\n} satisfies FormFieldContext\n\nprovide(FORM_FIELD_CONTEXT_KEY, fieldContext)\n\n// Bottom row visibility\n\nconst showBottom = computed(() =>\n !!(fieldError.value || props.hint || counterText.value),\n)\n</script>\n\n<template>\n <fieldset class=\"fieldset w-full\">\n <!-- Floating label mode: label floats over the input -->\n <template v-if=\"floating\">\n <label class=\"floating-label\">\n <span v-if=\"label || $slots.label\">\n <slot name=\"label\" :required=\"required\">\n {{ label }}<span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </slot>\n </span>\n <slot />\n </label>\n </template>\n\n <!-- Default mode: legend above the field -->\n <template v-else>\n <legend v-if=\"label || $slots.label\" class=\"fieldset-legend\">\n <slot name=\"label\" :required=\"required\">\n {{ label }}<span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </slot>\n </legend>\n <slot />\n </template>\n\n <!-- Bottom row: error/hint left, counter right -->\n <div v-if=\"showBottom\" class=\"flex items-center justify-between gap-2 mt-1\">\n <Transition name=\"field-message\" mode=\"out-in\">\n <p v-if=\"fieldError\" key=\"error\" class=\"label text-error text-xs\" role=\"alert\">\n <slot name=\"error\" :error=\"fieldError\">{{ fieldError }}</slot>\n </p>\n <p v-else-if=\"hint\" key=\"hint\" class=\"label text-xs\">\n <slot name=\"hint\">{{ hint }}</slot>\n </p>\n <span v-else key=\"empty\" />\n </Transition>\n <span\n v-if=\"counterText\"\n class=\"label text-xs shrink-0\"\n :class=\"counterColor\"\n >{{ counterText }}</span>\n </div>\n </fieldset>\n</template>\n\n<style scoped>\n.field-message-enter-active,\n.field-message-leave-active {\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.field-message-enter-from,\n.field-message-leave-to {\n opacity: 0;\n transform: translateY(-4px);\n}\n</style>","import { createComponentConfigKey } from '@/config/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 { XIcon } from '@lucide/vue'\nimport { computed, inject, useAttrs, useSlots, useTemplateRef, watchEffect } 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\">\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps<InputProps>()\n\n/**\n * Bound value. Supports `.number` and `.trim` modifiers.\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\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 complex\nconst config = useComponentConfig(INPUT_CONFIG, props, { size: 'md', type: 'text', counter: false }, contextOverrides)\n\n// ── Element ref + slots ──────────────────────────────────────────────────────\n\nconst inputEl = useTemplateRef('inputEl')\nconst attrs = useAttrs()\nconst slots = useSlots()\n\nconst hasAddon = computed(() => !!slots.start || !!slots.end || props.clearable)\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, onBlur, clearError } = useFormField({\n required: computed(() => !!props.required),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\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\nfunction onClear(): void {\n model.value = undefined as any\n field?.setValue(undefined)\n clearError()\n inputEl.value?.focus()\n}\n\n// ── Implicit validator ───────────────────────────────────────────────────────\n\nconst hasConstraints = computed(() =>\n !!props.required\n || !!attrs.pattern\n || attrs.minlength != null\n || attrs.maxlength != null\n || attrs.min != null\n || attrs.max != null,\n)\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => String(resolvedValue.value ?? '').length)\nconst showCounter = computed(() => config.value.counter)\n\nconst counterText = computed<string>(() => {\n if (!showCounter.value) return ''\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 if (typeof fmt === 'function') return fmt(current, min, max)\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\nconst counterColor = computed<string>(() => {\n const max = config.value.maxLength\n const min = config.value.minLength\n const current = currentLength.value\n if (max != null && current > max) return 'text-error'\n if (min != null && current < min) return 'text-warning'\n return ''\n})\n\n// Push counter text up to FormField so it renders on the same row as error/hint\nwatchEffect(() => {\n if (!field) return\n field.setCounterText(\n showCounter.value ? counterText.value : '',\n showCounter.value ? counterColor.value : '',\n )\n})\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\n// ── Shared input class ───────────────────────────────────────────────────────\n\nconst inputClass = computed(() => [\n getClass(colors, config.value.color),\n getClass(sizes, config.value.size),\n getClass(variants, config.value.variant),\n { 'input-error': hasError.value },\n { validator: hasConstraints.value },\n])\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- ── With addon (slots / clearable) ── -->\n <template v-if=\"hasAddon\">\n <label class=\"input w-full\" :class=\"inputClass\">\n <slot name=\"start\" />\n <input\n ref=\"inputEl\"\n v-bind=\"$attrs\"\n class=\"grow\"\n :type=\"config.type\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"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 <button\n v-if=\"clearable && resolvedValue != null && resolvedValue !== ''\"\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100\"\n tabindex=\"-1\"\n @click.stop=\"onClear\"\n >\n <XIcon class=\"size-3\" />\n </button>\n <slot name=\"end\" />\n </label>\n\n <!-- Standalone counter (no FormField) -->\n <div v-if=\"!field && showCounter\" class=\"flex justify-end mt-1\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n </template>\n\n <!-- ── Bare input ── -->\n <template v-else>\n <input\n ref=\"inputEl\"\n v-bind=\"$attrs\"\n class=\"input w-full\"\n :class=\"inputClass\"\n :type=\"config.type\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"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 <!-- Standalone counter (no FormField) -->\n <div v-if=\"!field && showCounter\" class=\"flex justify-end mt-1\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n </template>\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 { XIcon } from '@lucide/vue'\nimport { computed, inject, useAttrs, useSlots, useTemplateRef, watchEffect } 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\">\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps<InputProps>()\n\n/**\n * Bound value. Supports `.number` and `.trim` modifiers.\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\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 complex\nconst config = useComponentConfig(INPUT_CONFIG, props, { size: 'md', type: 'text', counter: false }, contextOverrides)\n\n// ── Element ref + slots ──────────────────────────────────────────────────────\n\nconst inputEl = useTemplateRef('inputEl')\nconst attrs = useAttrs()\nconst slots = useSlots()\n\nconst hasAddon = computed(() => !!slots.start || !!slots.end || props.clearable)\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, onBlur, clearError } = useFormField({\n required: computed(() => !!props.required),\n inputEl,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\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\nfunction onClear(): void {\n model.value = undefined as any\n field?.setValue(undefined)\n clearError()\n inputEl.value?.focus()\n}\n\n// ── Implicit validator ───────────────────────────────────────────────────────\n\nconst hasConstraints = computed(() =>\n !!props.required\n || !!attrs.pattern\n || attrs.minlength != null\n || attrs.maxlength != null\n || attrs.min != null\n || attrs.max != null,\n)\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => String(resolvedValue.value ?? '').length)\nconst showCounter = computed(() => config.value.counter)\n\nconst counterText = computed<string>(() => {\n if (!showCounter.value) return ''\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 if (typeof fmt === 'function') return fmt(current, min, max)\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\nconst counterColor = computed<string>(() => {\n const max = config.value.maxLength\n const min = config.value.minLength\n const current = currentLength.value\n if (max != null && current > max) return 'text-error'\n if (min != null && current < min) return 'text-warning'\n return ''\n})\n\n// Push counter text up to FormField so it renders on the same row as error/hint\nwatchEffect(() => {\n if (!field) return\n field.setCounterText(\n showCounter.value ? counterText.value : '',\n showCounter.value ? counterColor.value : '',\n )\n})\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\n// ── Shared input class ───────────────────────────────────────────────────────\n\nconst inputClass = computed(() => [\n getClass(colors, config.value.color),\n getClass(sizes, config.value.size),\n getClass(variants, config.value.variant),\n { 'input-error': hasError.value },\n { validator: hasConstraints.value },\n])\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- ── With addon (slots / clearable) ── -->\n <template v-if=\"hasAddon\">\n <label class=\"input w-full\" :class=\"inputClass\">\n <slot name=\"start\" />\n <input\n ref=\"inputEl\"\n v-bind=\"$attrs\"\n class=\"grow\"\n :type=\"config.type\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"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 <button\n v-if=\"clearable && resolvedValue != null && resolvedValue !== ''\"\n type=\"button\"\n class=\"btn btn-ghost btn-xs btn-circle opacity-50 hover:opacity-100\"\n tabindex=\"-1\"\n @click.stop=\"onClear\"\n >\n <XIcon class=\"size-3\" />\n </button>\n <slot name=\"end\" />\n </label>\n\n <!-- Standalone counter (no FormField) -->\n <div v-if=\"!field && showCounter\" class=\"flex justify-end mt-1\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n </template>\n\n <!-- ── Bare input ── -->\n <template v-else>\n <input\n ref=\"inputEl\"\n v-bind=\"$attrs\"\n class=\"input w-full\"\n :class=\"inputClass\"\n :type=\"config.type\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"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 <!-- Standalone counter (no FormField) -->\n <div v-if=\"!field && showCounter\" class=\"flex justify-end mt-1\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n </template>\n</template>","import type { ComputedRef, InjectionKey, ShallowRef } from 'vue'\n\nexport interface RadioGroupContext {\n /** Shared name attribute for all child Radio inputs. */\n name: string\n /** Currently selected value. */\n modelValue: ComputedRef<string | number | boolean | undefined>\n /** Whether any radio in the group is required. */\n required: ShallowRef<boolean>\n /** Updates the selected value. */\n setValue: (value: string | number | boolean) => void\n}\n\nexport const RADIO_GROUP_CONTEXT_KEY: InjectionKey<RadioGroupContext> = Symbol('RadioGroupContext')\n","import { createComponentConfigKey } from '@/config/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 { RADIO_GROUP_CONTEXT_KEY } from '@/components/data/radio-group/radio-group.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 { computed, inject, useId, useSlots, useTemplateRef } 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')\nconst slots = useSlots()\n\nconst config = useComponentConfig(RADIO_CONFIG, props, { size: 'md' })\n\nconst inputId = `radio-${useId()}`\n\n// Priority: FormField > RadioGroup > standalone prop\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null as FormFieldContext | null)\nconst groupCtx = inject(RADIO_GROUP_CONTEXT_KEY, null)\n\nconst resolvedName = computed(() => props.name ?? fieldCtx?.name ?? groupCtx?.name ?? 'radio-group')\n\n// Bridge to form field context\nconst { field, onBlur, clearError } = useFormField({\n required: computed(() => !!props.required || !!groupCtx?.required.value),\n inputEl,\n})\n\n// Resolved value priority: FormField > RadioGroup > local model\nconst resolvedValue = computed(() => {\n if (field) return field.value.value\n if (groupCtx) return groupCtx.modelValue.value\n return model.value\n})\n\n// Checked state\nconst isChecked = computed(() => resolvedValue.value === props.value)\n\nfunction handleChange(): void {\n model.value = props.value\n if (field) {\n field.setValue(props.value)\n field.setDirty(true)\n clearError()\n }\n else if (groupCtx) {\n groupCtx.setValue(props.value)\n }\n}\n\n// ── Description / hint ────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\nconst hasDescription = computed(() => !!(props.description || slots.description))\nconst hasHint = computed(() => !!(props.hint || slots.hint))\nconst hasLabel = computed(() => hasDescription.value || hasHint.value)\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- Radio with description / hint label to the right -->\n <label\n v-if=\"hasLabel\"\n :for=\"inputId\"\n class=\"flex cursor-pointer items-start gap-2\"\n :class=\"{ 'opacity-60 pointer-events-none': disabled }\"\n >\n <input\n :id=\"inputId\"\n ref=\"inputEl\"\n type=\"radio\"\n class=\"radio mt-0.5\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'radio-error': hasError },\n { validator: required },\n ]\"\n :name=\"resolvedName\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"flex flex-col gap-0.5\">\n <span v-if=\"hasDescription\" class=\"label-text leading-snug\">\n <slot name=\"description\">{{ description }}</slot>\n <span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </span>\n <span v-if=\"hasHint\" class=\"label-text text-xs text-base-content/60 leading-snug\">\n <slot name=\"hint\">{{ hint }}</slot>\n </span>\n </span>\n </label>\n\n <!-- Bare radio — no label -->\n <input\n v-else\n :id=\"inputId\"\n ref=\"inputEl\"\n type=\"radio\"\n class=\"radio\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'radio-error': hasError },\n { validator: required },\n ]\"\n :name=\"resolvedName\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\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 { RADIO_GROUP_CONTEXT_KEY } from '@/components/data/radio-group/radio-group.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 { computed, inject, useId, useSlots, useTemplateRef } 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')\nconst slots = useSlots()\n\nconst config = useComponentConfig(RADIO_CONFIG, props, { size: 'md' })\n\nconst inputId = `radio-${useId()}`\n\n// Priority: FormField > RadioGroup > standalone prop\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null as FormFieldContext | null)\nconst groupCtx = inject(RADIO_GROUP_CONTEXT_KEY, null)\n\nconst resolvedName = computed(() => props.name ?? fieldCtx?.name ?? groupCtx?.name ?? 'radio-group')\n\n// Bridge to form field context\nconst { field, onBlur, clearError } = useFormField({\n required: computed(() => !!props.required || !!groupCtx?.required.value),\n inputEl,\n})\n\n// Resolved value priority: FormField > RadioGroup > local model\nconst resolvedValue = computed(() => {\n if (field) return field.value.value\n if (groupCtx) return groupCtx.modelValue.value\n return model.value\n})\n\n// Checked state\nconst isChecked = computed(() => resolvedValue.value === props.value)\n\nfunction handleChange(): void {\n model.value = props.value\n if (field) {\n field.setValue(props.value)\n field.setDirty(true)\n clearError()\n }\n else if (groupCtx) {\n groupCtx.setValue(props.value)\n }\n}\n\n// ── Description / hint ────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\nconst hasDescription = computed(() => !!(props.description || slots.description))\nconst hasHint = computed(() => !!(props.hint || slots.hint))\nconst hasLabel = computed(() => hasDescription.value || hasHint.value)\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- Radio with description / hint label to the right -->\n <label\n v-if=\"hasLabel\"\n :for=\"inputId\"\n class=\"flex cursor-pointer items-start gap-2\"\n :class=\"{ 'opacity-60 pointer-events-none': disabled }\"\n >\n <input\n :id=\"inputId\"\n ref=\"inputEl\"\n type=\"radio\"\n class=\"radio mt-0.5\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'radio-error': hasError },\n { validator: required },\n ]\"\n :name=\"resolvedName\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"flex flex-col gap-0.5\">\n <span v-if=\"hasDescription\" class=\"label-text leading-snug\">\n <slot name=\"description\">{{ description }}</slot>\n <span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </span>\n <span v-if=\"hasHint\" class=\"label-text text-xs text-base-content/60 leading-snug\">\n <slot name=\"hint\">{{ hint }}</slot>\n </span>\n </span>\n </label>\n\n <!-- Bare radio — no label -->\n <input\n v-else\n :id=\"inputId\"\n ref=\"inputEl\"\n type=\"radio\"\n class=\"radio\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'radio-error': hasError },\n { validator: required },\n ]\"\n :name=\"resolvedName\"\n :value=\"value\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { computed, inject, provide, shallowRef, useId, watch } from 'vue'\nimport type { RadioGroupContext } from './radio-group.context'\nimport { RADIO_GROUP_CONTEXT_KEY } from './radio-group.context'\nimport type { RadioGroupProps } from './radio-group.props'\n\nconst props = defineProps<RadioGroupProps>()\n\n/**\n * The currently selected value.\n * Ignored when RadioGroup is inside a FormField (FormField owns the value).\n */\nconst model = defineModel<string | number | boolean>()\n\n// RadioGroup must not be used inside FormField — FormField owns the value.\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null)\n\nif (import.meta.env.DEV && fieldCtx) {\n console.warn(\n '[RadioGroup] Do not use <RadioGroup> inside <FormField>. ' +\n 'Place <Radio> components directly inside <FormField> — they share the field value automatically.',\n )\n}\n\nconst autoName = `radio-group-${useId()}`\nconst resolvedName = computed(() => props.name ?? autoName)\nconst required = shallowRef(!!props.required)\n\nwatch(\n () => props.required,\n val => {\n required.value = !!val\n },\n)\n\n// When inside FormField, defer to it; otherwise manage value locally.\nconst modelValue = computed<string | number | boolean | undefined>(() =>\n fieldCtx ? (fieldCtx.value.value as string | number | boolean | undefined) : model.value,\n)\n\nfunction setValue(value: string | number | boolean): void {\n if (fieldCtx) {\n fieldCtx.setValue(value)\n fieldCtx.setDirty(true)\n } else {\n model.value = value\n }\n}\n\nconst context: RadioGroupContext = {\n name: resolvedName.value,\n modelValue,\n required,\n setValue,\n}\n\nprovide(RADIO_GROUP_CONTEXT_KEY, context)\n</script>\n\n<template>\n <div role=\"radiogroup\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { FORM_FIELD_CONTEXT_KEY } from '@/components/data/form-field/form-field.context'\nimport { computed, inject, provide, shallowRef, useId, watch } from 'vue'\nimport type { RadioGroupContext } from './radio-group.context'\nimport { RADIO_GROUP_CONTEXT_KEY } from './radio-group.context'\nimport type { RadioGroupProps } from './radio-group.props'\n\nconst props = defineProps<RadioGroupProps>()\n\n/**\n * The currently selected value.\n * Ignored when RadioGroup is inside a FormField (FormField owns the value).\n */\nconst model = defineModel<string | number | boolean>()\n\n// RadioGroup must not be used inside FormField — FormField owns the value.\nconst fieldCtx = inject(FORM_FIELD_CONTEXT_KEY, null)\n\nif (import.meta.env.DEV && fieldCtx) {\n console.warn(\n '[RadioGroup] Do not use <RadioGroup> inside <FormField>. ' +\n 'Place <Radio> components directly inside <FormField> — they share the field value automatically.',\n )\n}\n\nconst autoName = `radio-group-${useId()}`\nconst resolvedName = computed(() => props.name ?? autoName)\nconst required = shallowRef(!!props.required)\n\nwatch(\n () => props.required,\n val => {\n required.value = !!val\n },\n)\n\n// When inside FormField, defer to it; otherwise manage value locally.\nconst modelValue = computed<string | number | boolean | undefined>(() =>\n fieldCtx ? (fieldCtx.value.value as string | number | boolean | undefined) : model.value,\n)\n\nfunction setValue(value: string | number | boolean): void {\n if (fieldCtx) {\n fieldCtx.setValue(value)\n fieldCtx.setDirty(true)\n } else {\n model.value = value\n }\n}\n\nconst context: RadioGroupContext = {\n name: resolvedName.value,\n modelValue,\n required,\n setValue,\n}\n\nprovide(RADIO_GROUP_CONTEXT_KEY, context)\n</script>\n\n<template>\n <div role=\"radiogroup\">\n <slot />\n </div>\n</template>\n","import { createComponentConfigKey } from '@/config/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 { 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// ── Refs ─────────────────────────────────────────────────────────────────────\n\nconst rootEl = useTemplateRef('rootEl')\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(() => !!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 = 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\ndefineExpose({\n $el: rootEl,\n focus: () => rootEl.value\n ?.querySelector<HTMLInputElement>('input[type=\"radio\"]:not(.hidden):not(.rating-hidden)')\n ?.focus(),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"rating\"\n :class=\"[\n getClass(sizes, config.size),\n { 'rating-half': 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=\"required\"\n :checked=\"resolvedValue > 0\"\n />\n\n <!-- Clear affordance — hidden radio at index 0 -->\n <input\n v-if=\"config.clearable\"\n type=\"radio\"\n class=\"rating-hidden\"\n name=\"rating\"\n :disabled=\"disabled\"\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 { 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// ── Refs ─────────────────────────────────────────────────────────────────────\n\nconst rootEl = useTemplateRef('rootEl')\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(() => !!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 = 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\ndefineExpose({\n $el: rootEl,\n focus: () => rootEl.value\n ?.querySelector<HTMLInputElement>('input[type=\"radio\"]:not(.hidden):not(.rating-hidden)')\n ?.focus(),\n})\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"rating\"\n :class=\"[\n getClass(sizes, config.size),\n { 'rating-half': 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=\"required\"\n :checked=\"resolvedValue > 0\"\n />\n\n <!-- Clear affordance — hidden radio at index 0 -->\n <input\n v-if=\"config.clearable\"\n type=\"radio\"\n class=\"rating-hidden\"\n name=\"rating\"\n :disabled=\"disabled\"\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 { createComponentConfigKey } from '@/config/symbol'\n\nexport const SELECT_CONFIG = createComponentConfigKey('select')\n","<script lang=\"ts\">\nimport { Badge } from '@/components/display/public'\nimport { Menu, MenuItem } from '@/components/navigation/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, LoaderCircleIcon, XIcon } from '@lucide/vue'\nimport { onClickOutside, useDebounceFn, useVirtualList } from '@vueuse/core'\nimport { computed, nextTick, onMounted, shallowRef, useAttrs, useId, useTemplateRef, watch } 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\nconst MAX_DROPDOWN_HEIGHT = 224\n\ndefineOptions({ inheritAttrs: false })\n\nconst emit = defineEmits<{\n clear: []\n}>()\n\nconst containerEl = useTemplateRef('containerEl')\nconst triggerEl = useTemplateRef('triggerEl')\nconst searchInputEl = useTemplateRef('searchInputEl')\nconst ulRef = useTemplateRef('ulRef')\nconst highlightedIndex = shallowRef(-1)\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)\nconst selectionCache = shallowRef<SelectOption<T>[]>([])\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)) {\n return 0\n }\n\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\n return value.value !== undefined && value.value !== null && value.value !== ''\n})\n\nconst selectedOptions = computed(() => {\n const current = value.value\n\n if (!current) {\n return []\n }\n\n const pool = [...(props.options ?? []), ...remoteOptions.value, ...selectionCache.value]\n\n if (props.multiple && Array.isArray(current)) {\n return (current as T[]).reduce<SelectOption<T>[]>((acc, v) => {\n const found = pool.find(o => isEqual(o.value, v))\n return found ? [...acc, found] : acc\n }, [])\n }\n\n const found = pool.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) {\n return a === b\n }\n\n if (typeof props.equals === 'function') {\n return (props.equals as (a: T, b: T) => boolean)(a, b)\n }\n\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\n if (props.multiple && Array.isArray(current)) {\n return (current as T[]).some(v => isEqual(v, option.value))\n }\n\n return isEqual(current as T, option.value)\n}\n\nfunction isOptionDisabled(option: SelectOption<T>): boolean {\n return option.disabled === true || (isAtMax.value && !isOptionSelected(option))\n}\n\nfunction setValue(next: ModelType): void {\n model.value = next\n\n if (field) {\n field.setValue(next)\n field.setDirty(true)\n clearError()\n }\n}\n\nfunction currentValues(): T[] {\n return (Array.isArray(value.value) ? value.value : []) as T[]\n}\n\nfunction select(option: SelectOption<T>): void {\n if (isOptionDisabled(option)) {\n return\n }\n\n if (!selectionCache.value.some(o => isEqual(o.value, option.value))) {\n selectionCache.value = [...selectionCache.value, option]\n }\n\n if (props.multiple) {\n const current = currentValues()\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\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) {\n return\n }\n\n setValue(currentValues().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 || props.readonly) {\n return\n }\n\n isOpen.value = true\n}\n\nfunction close(): void {\n if (props.disabled) {\n return\n }\n\n isOpen.value = false\n}\n\nfunction toggle(): void {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\n// ─── Search ──────────────────────────────────────────────────────────────────\n\nconst searchQuery = shallowRef('')\nconst isLoading = shallowRef(false)\nconst isLoadingMore = shallowRef(false)\nconst searchError = shallowRef<Error | null>(null)\nconst remoteOptions = shallowRef<SelectOption<T>[]>([])\nconst currentPage = shallowRef(1)\nconst hasMore = shallowRef(true)\n\nconst filteredLocalOptions = computed<SelectOption<T>[]>(() => {\n const opts = props.options ?? []\n\n if (!searchQuery.value) {\n return opts\n }\n\n const q = searchQuery.value.toLowerCase()\n return opts.filter(o => o.label.toLowerCase().includes(q))\n})\n\nconst displayedOptions = computed<SelectOption<T>[]>(() => {\n if (props.search) {\n return remoteOptions.value\n }\n\n if (props.searchable) {\n return filteredLocalOptions.value\n }\n\n return props.options ?? []\n})\n\nconst itemH = computed(() => props.itemHeight ?? 36)\n\nconst virtualContainerHeight = computed(() => {\n const count = displayedOptions.value.length\n\n if (count === 0) {\n return 0\n }\n\n return Math.min(count * itemH.value, MAX_DROPDOWN_HEIGHT)\n})\n\nconst { list: virtualList, containerProps, wrapperProps, scrollTo } = useVirtualList(displayedOptions, {\n itemHeight: () => itemH.value,\n overscan: 5,\n})\n\nfunction onVirtualScroll(e: Event): void {\n containerProps.onScroll()\n\n if (!props.search || !hasMore.value || isLoadingMore.value) {\n return\n }\n\n const el = e.target as HTMLElement\n\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 50) {\n const nextPage = currentPage.value + 1\n currentPage.value = nextPage\n fetchPage(searchQuery.value, nextPage, true)\n }\n}\n\nasync function fetchPage(term: string, page: number, append: boolean): Promise<void> {\n if (!props.search) {\n return\n }\n\n const limit = props.limit ?? 20\n\n if (append) {\n isLoadingMore.value = true\n } else {\n isLoading.value = true\n searchError.value = null\n }\n\n try {\n const lastItem = append ? remoteOptions.value.at(-1)?.value : undefined\n const results = await props.search({ term, limit, page, lastItem })\n remoteOptions.value = append ? [...remoteOptions.value, ...results] : results\n hasMore.value = results.length >= limit\n\n // All results fit without scrolling — load next page immediately to fill the list\n if (hasMore.value && remoteOptions.value.length * itemH.value <= MAX_DROPDOWN_HEIGHT) {\n currentPage.value = page + 1\n fetchPage(term, currentPage.value, true)\n return\n }\n } catch (err) {\n searchError.value = err instanceof Error ? err : new Error(String(err))\n\n if (!append) {\n remoteOptions.value = []\n }\n }\n\n isLoading.value = false\n isLoadingMore.value = false\n}\n\nfunction retrySearch(): void {\n fetchPage(searchQuery.value, 1, false)\n}\n\nconst debouncedRemoteSearch = useDebounceFn((term: string) => {\n currentPage.value = 1\n fetchPage(term, 1, false)\n}, computed(() => props.debounce ?? 300))\n\nfunction onSearchInput(val: string): void {\n searchQuery.value = val\n highlightedIndex.value = -1\n\n if (!props.search) {\n return\n }\n\n if (val.length >= (props.minChars ?? 0)) {\n debouncedRemoteSearch(val)\n } else {\n remoteOptions.value = []\n hasMore.value = true\n }\n}\n\nonMounted(() => {\n if (props.search && hasValue.value) {\n fetchPage('', 1, false)\n }\n})\n\nwatch(isOpen, async (opened) => {\n if (opened) {\n highlightedIndex.value = -1\n\n if (props.searchable) {\n await nextTick()\n searchInputEl.value?.focus()\n }\n\n if (props.search && remoteOptions.value.length === 0) {\n fetchPage('', 1, false)\n }\n\n return\n }\n\n highlightedIndex.value = -1\n\n // Discard filtered results on close so next open re-fetches the initial list\n if (searchQuery.value !== '') {\n remoteOptions.value = []\n currentPage.value = 1\n searchError.value = null\n hasMore.value = true\n }\n\n searchQuery.value = ''\n})\n\n// ─── Keyboard navigation ─────────────────────────────────────────────────────\n\nfunction scrollToHighlighted(): void {\n if (props.searchable || props.search) {\n scrollTo(highlightedIndex.value)\n return\n }\n\n nextTick(() => {\n // ulRef points to the Menu component instance — $el is the underlying <ul>\n const ul = (ulRef.value as any)?.$el as HTMLElement | undefined\n ul?.children[highlightedIndex.value]?.scrollIntoView({ block: 'nearest' })\n })\n}\n\nfunction highlightNext(): void {\n const opts = displayedOptions.value\n\n if (opts.length === 0) {\n return\n }\n\n highlightedIndex.value = highlightedIndex.value >= opts.length - 1 ? 0 : highlightedIndex.value + 1\n scrollToHighlighted()\n}\n\nfunction highlightPrev(): void {\n const opts = displayedOptions.value\n\n if (opts.length === 0) {\n return\n }\n\n highlightedIndex.value = highlightedIndex.value <= 0 ? opts.length - 1 : highlightedIndex.value - 1\n scrollToHighlighted()\n}\n\nfunction selectHighlighted(): void {\n const opt = displayedOptions.value[highlightedIndex.value]\n\n if (opt) {\n select(opt)\n }\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n if (!isOpen.value) {\n open()\n nextTick(highlightNext)\n } else {\n highlightNext()\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!isOpen.value) {\n open()\n nextTick(highlightPrev)\n } else {\n highlightPrev()\n }\n break\n case 'Enter':\n case ' ':\n if (isOpen.value && highlightedIndex.value >= 0) {\n e.preventDefault()\n selectHighlighted()\n }\n break\n case 'Escape':\n if (isOpen.value) {\n e.preventDefault()\n close()\n }\n break\n case 'Tab':\n if (isOpen.value) {\n close()\n }\n break\n }\n}\n\nfunction onSearchKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n highlightNext()\n break\n case 'ArrowUp':\n e.preventDefault()\n highlightPrev()\n break\n case 'Enter':\n if (highlightedIndex.value >= 0) {\n e.preventDefault()\n selectHighlighted()\n }\n break\n case 'Escape':\n e.preventDefault()\n close()\n break\n case 'Tab':\n close()\n break\n }\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\"\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 readonly && 'cursor-default',\n config.clearable && hasValue ? 'pr-14' : 'pr-10',\n ]\"\n :tabindex=\"disabled ? '-1' : undefined\"\n :disabled=\"disabled\"\n :aria-readonly=\"readonly || undefined\"\n @click=\"toggle()\"\n @keydown=\"onTriggerKeydown\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <!-- Start slot (icon, badge, prefix) -->\n <slot name=\"start\" />\n\n <!-- Selected values -->\n <div v-if=\"multiple && selectedOptions.length > 0\" class=\"flex flex-wrap gap-1 flex-1 min-w-0\">\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 v-if=\"!readonly\"\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 class=\"flex-1 min-w-0 truncate\">{{ selectedOptions[0]?.label }}</span>\n </slot>\n </template>\n\n <span v-else class=\"opacity-40 flex-1 min-w-0 truncate\">\n {{ placeholder || $t('common.field.select.placeholder') }}\n </span>\n\n <!-- End slot (icon, badge, suffix) -->\n <slot name=\"end\" />\n </div>\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 && !readonly\"\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 || searchable || search)\"\n class=\"anchor-dropdown absolute z-50 w-full bg-base-100 border border-base-300 rounded-box shadow-lg overflow-hidden\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"p-2 border-b border-base-200\">\n <input\n ref=\"searchInputEl\"\n :value=\"searchQuery\"\n type=\"text\"\n class=\"input input-sm w-full\"\n :placeholder=\"$t('common.field.select.search')\"\n @input=\"onSearchInput(($event.target as HTMLInputElement).value)\"\n @keydown=\"onSearchKeydown\"\n />\n </div>\n\n <!-- Virtual list area (searchable or remote) -->\n <template v-if=\"searchable || search\">\n <!-- Initial loading -->\n <div v-if=\"isLoading\" class=\"px-4 py-6 flex justify-center\">\n <slot name=\"loading\" :query=\"searchQuery\">\n <LoaderCircleIcon class=\"size-4 animate-spin opacity-40\" />\n </slot>\n </div>\n\n <!-- Error -->\n <div v-else-if=\"searchError\" class=\"px-4 py-3 text-sm text-center text-error\">\n <slot name=\"error\" :query=\"searchQuery\" :retry=\"retrySearch\">\n {{ searchError.message }}\n </slot>\n </div>\n\n <template v-else>\n <!-- Virtual list -->\n <div\n v-if=\"displayedOptions.length > 0\"\n :ref=\"containerProps.ref\"\n :style=\"{ height: `${virtualContainerHeight}px`, overflowY: 'auto' }\"\n @scroll=\"onVirtualScroll\"\n >\n <Menu :size=\"config.size\" class=\"flex-nowrap\" v-bind=\"wrapperProps\">\n <MenuItem\n v-for=\"{ data: option, index } in virtualList\"\n :key=\"String(option.value)\"\n :active=\"isOptionSelected(option)\"\n :disabled=\"isOptionDisabled(option)\"\n :style=\"{ height: `${itemH}px` }\"\n :class=\"index === highlightedIndex && !isOptionSelected(option) && 'highlighted'\"\n @click.prevent=\"select(option)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isOptionSelected(option)\" :index=\"index\">\n {{ option.label }}\n </slot>\n </MenuItem>\n </Menu>\n </div>\n\n <!-- Empty -->\n <div v-else class=\"px-4 py-3 text-sm opacity-40 text-center\">\n <slot name=\"empty\" :query=\"searchQuery\">\n {{ $t('common.field.select.empty') }}\n </slot>\n </div>\n </template>\n\n <!-- Loading more (pagination) -->\n <div v-if=\"isLoadingMore\" class=\"px-4 py-2 flex justify-center\">\n <slot name=\"loading-more\" :page=\"currentPage\">\n <LoaderCircleIcon class=\"size-3 animate-spin opacity-40\" />\n </slot>\n </div>\n </template>\n\n <!-- Non-searchable -->\n <Menu ref=\"ulRef\" v-else :size=\"config.size\" class=\"max-h-56 overflow-y-auto w-full flex-nowrap\">\n <MenuItem\n v-for=\"(option, index) in (options ?? [])\"\n :key=\"String(option.value)\"\n :active=\"isOptionSelected(option)\"\n :disabled=\"isOptionDisabled(option)\"\n :class=\"index === highlightedIndex && !isOptionSelected(option) && 'highlighted'\"\n @click.prevent=\"select(option)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isOptionSelected(option)\">\n {{ option.label }}\n </slot>\n </MenuItem>\n\n <li v-if=\"(options ?? []).length === 0\" class=\"px-4 py-3 text-sm opacity-40 text-center pointer-events-none\">\n <slot name=\"empty\" :query=\"''\">\n {{ $t('common.field.select.empty') }}\n </slot>\n </li>\n </Menu>\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:deep(.highlighted > a),\n:deep(.highlighted > button) {\n background-color: var(--color-base-200);\n}\n\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>\n","<script lang=\"ts\">\nimport { Badge } from '@/components/display/public'\nimport { Menu, MenuItem } from '@/components/navigation/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, LoaderCircleIcon, XIcon } from '@lucide/vue'\nimport { onClickOutside, useDebounceFn, useVirtualList } from '@vueuse/core'\nimport { computed, nextTick, onMounted, shallowRef, useAttrs, useId, useTemplateRef, watch } 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\nconst MAX_DROPDOWN_HEIGHT = 224\n\ndefineOptions({ inheritAttrs: false })\n\nconst emit = defineEmits<{\n clear: []\n}>()\n\nconst containerEl = useTemplateRef('containerEl')\nconst triggerEl = useTemplateRef('triggerEl')\nconst searchInputEl = useTemplateRef('searchInputEl')\nconst ulRef = useTemplateRef('ulRef')\nconst highlightedIndex = shallowRef(-1)\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)\nconst selectionCache = shallowRef<SelectOption<T>[]>([])\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)) {\n return 0\n }\n\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\n return value.value !== undefined && value.value !== null && value.value !== ''\n})\n\nconst selectedOptions = computed(() => {\n const current = value.value\n\n if (!current) {\n return []\n }\n\n const pool = [...(props.options ?? []), ...remoteOptions.value, ...selectionCache.value]\n\n if (props.multiple && Array.isArray(current)) {\n return (current as T[]).reduce<SelectOption<T>[]>((acc, v) => {\n const found = pool.find(o => isEqual(o.value, v))\n return found ? [...acc, found] : acc\n }, [])\n }\n\n const found = pool.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) {\n return a === b\n }\n\n if (typeof props.equals === 'function') {\n return (props.equals as (a: T, b: T) => boolean)(a, b)\n }\n\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\n if (props.multiple && Array.isArray(current)) {\n return (current as T[]).some(v => isEqual(v, option.value))\n }\n\n return isEqual(current as T, option.value)\n}\n\nfunction isOptionDisabled(option: SelectOption<T>): boolean {\n return option.disabled === true || (isAtMax.value && !isOptionSelected(option))\n}\n\nfunction setValue(next: ModelType): void {\n model.value = next\n\n if (field) {\n field.setValue(next)\n field.setDirty(true)\n clearError()\n }\n}\n\nfunction currentValues(): T[] {\n return (Array.isArray(value.value) ? value.value : []) as T[]\n}\n\nfunction select(option: SelectOption<T>): void {\n if (isOptionDisabled(option)) {\n return\n }\n\n if (!selectionCache.value.some(o => isEqual(o.value, option.value))) {\n selectionCache.value = [...selectionCache.value, option]\n }\n\n if (props.multiple) {\n const current = currentValues()\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\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) {\n return\n }\n\n setValue(currentValues().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 || props.readonly) {\n return\n }\n\n isOpen.value = true\n}\n\nfunction close(): void {\n if (props.disabled) {\n return\n }\n\n isOpen.value = false\n}\n\nfunction toggle(): void {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\n// ─── Search ──────────────────────────────────────────────────────────────────\n\nconst searchQuery = shallowRef('')\nconst isLoading = shallowRef(false)\nconst isLoadingMore = shallowRef(false)\nconst searchError = shallowRef<Error | null>(null)\nconst remoteOptions = shallowRef<SelectOption<T>[]>([])\nconst currentPage = shallowRef(1)\nconst hasMore = shallowRef(true)\n\nconst filteredLocalOptions = computed<SelectOption<T>[]>(() => {\n const opts = props.options ?? []\n\n if (!searchQuery.value) {\n return opts\n }\n\n const q = searchQuery.value.toLowerCase()\n return opts.filter(o => o.label.toLowerCase().includes(q))\n})\n\nconst displayedOptions = computed<SelectOption<T>[]>(() => {\n if (props.search) {\n return remoteOptions.value\n }\n\n if (props.searchable) {\n return filteredLocalOptions.value\n }\n\n return props.options ?? []\n})\n\nconst itemH = computed(() => props.itemHeight ?? 36)\n\nconst virtualContainerHeight = computed(() => {\n const count = displayedOptions.value.length\n\n if (count === 0) {\n return 0\n }\n\n return Math.min(count * itemH.value, MAX_DROPDOWN_HEIGHT)\n})\n\nconst { list: virtualList, containerProps, wrapperProps, scrollTo } = useVirtualList(displayedOptions, {\n itemHeight: () => itemH.value,\n overscan: 5,\n})\n\nfunction onVirtualScroll(e: Event): void {\n containerProps.onScroll()\n\n if (!props.search || !hasMore.value || isLoadingMore.value) {\n return\n }\n\n const el = e.target as HTMLElement\n\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 50) {\n const nextPage = currentPage.value + 1\n currentPage.value = nextPage\n fetchPage(searchQuery.value, nextPage, true)\n }\n}\n\nasync function fetchPage(term: string, page: number, append: boolean): Promise<void> {\n if (!props.search) {\n return\n }\n\n const limit = props.limit ?? 20\n\n if (append) {\n isLoadingMore.value = true\n } else {\n isLoading.value = true\n searchError.value = null\n }\n\n try {\n const lastItem = append ? remoteOptions.value.at(-1)?.value : undefined\n const results = await props.search({ term, limit, page, lastItem })\n remoteOptions.value = append ? [...remoteOptions.value, ...results] : results\n hasMore.value = results.length >= limit\n\n // All results fit without scrolling — load next page immediately to fill the list\n if (hasMore.value && remoteOptions.value.length * itemH.value <= MAX_DROPDOWN_HEIGHT) {\n currentPage.value = page + 1\n fetchPage(term, currentPage.value, true)\n return\n }\n } catch (err) {\n searchError.value = err instanceof Error ? err : new Error(String(err))\n\n if (!append) {\n remoteOptions.value = []\n }\n }\n\n isLoading.value = false\n isLoadingMore.value = false\n}\n\nfunction retrySearch(): void {\n fetchPage(searchQuery.value, 1, false)\n}\n\nconst debouncedRemoteSearch = useDebounceFn((term: string) => {\n currentPage.value = 1\n fetchPage(term, 1, false)\n}, computed(() => props.debounce ?? 300))\n\nfunction onSearchInput(val: string): void {\n searchQuery.value = val\n highlightedIndex.value = -1\n\n if (!props.search) {\n return\n }\n\n if (val.length >= (props.minChars ?? 0)) {\n debouncedRemoteSearch(val)\n } else {\n remoteOptions.value = []\n hasMore.value = true\n }\n}\n\nonMounted(() => {\n if (props.search && hasValue.value) {\n fetchPage('', 1, false)\n }\n})\n\nwatch(isOpen, async (opened) => {\n if (opened) {\n highlightedIndex.value = -1\n\n if (props.searchable) {\n await nextTick()\n searchInputEl.value?.focus()\n }\n\n if (props.search && remoteOptions.value.length === 0) {\n fetchPage('', 1, false)\n }\n\n return\n }\n\n highlightedIndex.value = -1\n\n // Discard filtered results on close so next open re-fetches the initial list\n if (searchQuery.value !== '') {\n remoteOptions.value = []\n currentPage.value = 1\n searchError.value = null\n hasMore.value = true\n }\n\n searchQuery.value = ''\n})\n\n// ─── Keyboard navigation ─────────────────────────────────────────────────────\n\nfunction scrollToHighlighted(): void {\n if (props.searchable || props.search) {\n scrollTo(highlightedIndex.value)\n return\n }\n\n nextTick(() => {\n // ulRef points to the Menu component instance — $el is the underlying <ul>\n const ul = (ulRef.value as any)?.$el as HTMLElement | undefined\n ul?.children[highlightedIndex.value]?.scrollIntoView({ block: 'nearest' })\n })\n}\n\nfunction highlightNext(): void {\n const opts = displayedOptions.value\n\n if (opts.length === 0) {\n return\n }\n\n highlightedIndex.value = highlightedIndex.value >= opts.length - 1 ? 0 : highlightedIndex.value + 1\n scrollToHighlighted()\n}\n\nfunction highlightPrev(): void {\n const opts = displayedOptions.value\n\n if (opts.length === 0) {\n return\n }\n\n highlightedIndex.value = highlightedIndex.value <= 0 ? opts.length - 1 : highlightedIndex.value - 1\n scrollToHighlighted()\n}\n\nfunction selectHighlighted(): void {\n const opt = displayedOptions.value[highlightedIndex.value]\n\n if (opt) {\n select(opt)\n }\n}\n\nfunction onTriggerKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n if (!isOpen.value) {\n open()\n nextTick(highlightNext)\n } else {\n highlightNext()\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!isOpen.value) {\n open()\n nextTick(highlightPrev)\n } else {\n highlightPrev()\n }\n break\n case 'Enter':\n case ' ':\n if (isOpen.value && highlightedIndex.value >= 0) {\n e.preventDefault()\n selectHighlighted()\n }\n break\n case 'Escape':\n if (isOpen.value) {\n e.preventDefault()\n close()\n }\n break\n case 'Tab':\n if (isOpen.value) {\n close()\n }\n break\n }\n}\n\nfunction onSearchKeydown(e: KeyboardEvent): void {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n highlightNext()\n break\n case 'ArrowUp':\n e.preventDefault()\n highlightPrev()\n break\n case 'Enter':\n if (highlightedIndex.value >= 0) {\n e.preventDefault()\n selectHighlighted()\n }\n break\n case 'Escape':\n e.preventDefault()\n close()\n break\n case 'Tab':\n close()\n break\n }\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\"\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 readonly && 'cursor-default',\n config.clearable && hasValue ? 'pr-14' : 'pr-10',\n ]\"\n :tabindex=\"disabled ? '-1' : undefined\"\n :disabled=\"disabled\"\n :aria-readonly=\"readonly || undefined\"\n @click=\"toggle()\"\n @keydown=\"onTriggerKeydown\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <!-- Start slot (icon, badge, prefix) -->\n <slot name=\"start\" />\n\n <!-- Selected values -->\n <div v-if=\"multiple && selectedOptions.length > 0\" class=\"flex flex-wrap gap-1 flex-1 min-w-0\">\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 v-if=\"!readonly\"\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 class=\"flex-1 min-w-0 truncate\">{{ selectedOptions[0]?.label }}</span>\n </slot>\n </template>\n\n <span v-else class=\"opacity-40 flex-1 min-w-0 truncate\">\n {{ placeholder || $t('common.field.select.placeholder') }}\n </span>\n\n <!-- End slot (icon, badge, suffix) -->\n <slot name=\"end\" />\n </div>\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 && !readonly\"\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 || searchable || search)\"\n class=\"anchor-dropdown absolute z-50 w-full bg-base-100 border border-base-300 rounded-box shadow-lg overflow-hidden\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"p-2 border-b border-base-200\">\n <input\n ref=\"searchInputEl\"\n :value=\"searchQuery\"\n type=\"text\"\n class=\"input input-sm w-full\"\n :placeholder=\"$t('common.field.select.search')\"\n @input=\"onSearchInput(($event.target as HTMLInputElement).value)\"\n @keydown=\"onSearchKeydown\"\n />\n </div>\n\n <!-- Virtual list area (searchable or remote) -->\n <template v-if=\"searchable || search\">\n <!-- Initial loading -->\n <div v-if=\"isLoading\" class=\"px-4 py-6 flex justify-center\">\n <slot name=\"loading\" :query=\"searchQuery\">\n <LoaderCircleIcon class=\"size-4 animate-spin opacity-40\" />\n </slot>\n </div>\n\n <!-- Error -->\n <div v-else-if=\"searchError\" class=\"px-4 py-3 text-sm text-center text-error\">\n <slot name=\"error\" :query=\"searchQuery\" :retry=\"retrySearch\">\n {{ searchError.message }}\n </slot>\n </div>\n\n <template v-else>\n <!-- Virtual list -->\n <div\n v-if=\"displayedOptions.length > 0\"\n :ref=\"containerProps.ref\"\n :style=\"{ height: `${virtualContainerHeight}px`, overflowY: 'auto' }\"\n @scroll=\"onVirtualScroll\"\n >\n <Menu :size=\"config.size\" class=\"flex-nowrap\" v-bind=\"wrapperProps\">\n <MenuItem\n v-for=\"{ data: option, index } in virtualList\"\n :key=\"String(option.value)\"\n :active=\"isOptionSelected(option)\"\n :disabled=\"isOptionDisabled(option)\"\n :style=\"{ height: `${itemH}px` }\"\n :class=\"index === highlightedIndex && !isOptionSelected(option) && 'highlighted'\"\n @click.prevent=\"select(option)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isOptionSelected(option)\" :index=\"index\">\n {{ option.label }}\n </slot>\n </MenuItem>\n </Menu>\n </div>\n\n <!-- Empty -->\n <div v-else class=\"px-4 py-3 text-sm opacity-40 text-center\">\n <slot name=\"empty\" :query=\"searchQuery\">\n {{ $t('common.field.select.empty') }}\n </slot>\n </div>\n </template>\n\n <!-- Loading more (pagination) -->\n <div v-if=\"isLoadingMore\" class=\"px-4 py-2 flex justify-center\">\n <slot name=\"loading-more\" :page=\"currentPage\">\n <LoaderCircleIcon class=\"size-3 animate-spin opacity-40\" />\n </slot>\n </div>\n </template>\n\n <!-- Non-searchable -->\n <Menu ref=\"ulRef\" v-else :size=\"config.size\" class=\"max-h-56 overflow-y-auto w-full flex-nowrap\">\n <MenuItem\n v-for=\"(option, index) in (options ?? [])\"\n :key=\"String(option.value)\"\n :active=\"isOptionSelected(option)\"\n :disabled=\"isOptionDisabled(option)\"\n :class=\"index === highlightedIndex && !isOptionSelected(option) && 'highlighted'\"\n @click.prevent=\"select(option)\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"isOptionSelected(option)\">\n {{ option.label }}\n </slot>\n </MenuItem>\n\n <li v-if=\"(options ?? []).length === 0\" class=\"px-4 py-3 text-sm opacity-40 text-center pointer-events-none\">\n <slot name=\"empty\" :query=\"''\">\n {{ $t('common.field.select.empty') }}\n </slot>\n </li>\n </Menu>\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:deep(.highlighted > a),\n:deep(.highlighted > button) {\n background-color: var(--color-base-200);\n}\n\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>\n","import { createComponentConfigKey } from '@/config/symbol'\n\nexport const SLIDER_CONFIG = createComponentConfigKey('slider')\n","<script lang=\"ts\">\nimport { useComponentConfig } from '@/composables/use-component-config'\nimport { useFormField } from '@/composables/use-form-field'\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 anchorEl = useTemplateRef('anchorEl')\nconst thumbRefs = useTemplateRefsList<HTMLElement>()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field } = useFormField({\n required: computed(() => !!props.required),\n inputEl: anchorEl,\n})\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 field?.setValue(model.value)\n field?.setDirty(true)\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\ndefineExpose({\n $el: sliderRoot,\n focus: () => thumbRefs.value[0]?.focus(),\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 <!-- Hidden anchor for form field constraint validation -->\n <input\n ref=\"anchorEl\"\n type=\"number\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :value=\"Array.isArray(model) ? model[0] : model\"\n :required=\"required\"\n :min=\"min\"\n :max=\"max\"\n />\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 { useFormField } from '@/composables/use-form-field'\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 anchorEl = useTemplateRef('anchorEl')\nconst thumbRefs = useTemplateRefsList<HTMLElement>()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field } = useFormField({\n required: computed(() => !!props.required),\n inputEl: anchorEl,\n})\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 field?.setValue(model.value)\n field?.setDirty(true)\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\ndefineExpose({\n $el: sliderRoot,\n focus: () => thumbRefs.value[0]?.focus(),\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 <!-- Hidden anchor for form field constraint validation -->\n <input\n ref=\"anchorEl\"\n type=\"number\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n :value=\"Array.isArray(model) ? model[0] : model\"\n :required=\"required\"\n :min=\"min\"\n :max=\"max\"\n />\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 '@/config/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 { computed, inject, useAttrs, useTemplateRef, watchEffect } 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\">\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps<TextareaProps>()\n\n/**\n * Bound string value.\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\n// @ts-ignore - Type too complex\nconst config = useComponentConfig(TEXTAREA_CONFIG, props, { size: 'md', counter: false }, contextOverrides)\n\n// ── Element ref ──────────────────────────────────────────────────────────────\n\nconst textareaEl = useTemplateRef('textareaEl')\nconst attrs = useAttrs()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, onBlur, clearError } = useFormField<string>({\n required: computed(() => !!props.required),\n inputEl: textareaEl as any,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() =>\n field ? (field.value.value as string | undefined) : model.value,\n)\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// ── Implicit validator ───────────────────────────────────────────────────────\n\nconst hasConstraints = computed(() =>\n !!props.required\n || attrs.minlength != null\n || attrs.maxlength != null,\n)\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => (resolvedValue.value ?? '').length)\nconst showCounter = computed(() => config.value.counter)\n\nconst counterText = computed<string>(() => {\n if (!showCounter.value) return ''\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 if (typeof fmt === 'function') return fmt(current, min, max)\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\nconst counterColor = computed<string>(() => {\n const max = config.value.maxLength\n const min = config.value.minLength\n const current = currentLength.value\n if (max != null && current > max) return 'text-error'\n if (min != null && current < min) return 'text-warning'\n return ''\n})\n\n// Push counter up to FormField\nwatchEffect(() => {\n if (!field) return\n field.setCounterText(\n showCounter.value ? counterText.value : '',\n showCounter.value ? counterColor.value : '',\n )\n})\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\ndefineExpose({\n $el: textareaEl,\n focus: () => textareaEl.value?.focus(),\n})\n</script>\n\n<template>\n <textarea\n ref=\"textareaEl\"\n v-bind=\"$attrs\"\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 { validator: hasConstraints },\n { 'resize-none': !autoGrow },\n ]\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"required\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n @input=\"handleUpdate\"\n @blur=\"onBlur\"\n />\n\n <!-- Standalone counter (no FormField) -->\n <div v-if=\"!field && showCounter\" class=\"flex justify-end mt-1\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\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 { computed, inject, useAttrs, useTemplateRef, watchEffect } 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\">\ndefineOptions({ inheritAttrs: false })\n\nconst props = defineProps<TextareaProps>()\n\n/**\n * Bound string value.\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\n// @ts-ignore - Type too complex\nconst config = useComponentConfig(TEXTAREA_CONFIG, props, { size: 'md', counter: false }, contextOverrides)\n\n// ── Element ref ──────────────────────────────────────────────────────────────\n\nconst textareaEl = useTemplateRef('textareaEl')\nconst attrs = useAttrs()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, onBlur, clearError } = useFormField<string>({\n required: computed(() => !!props.required),\n inputEl: textareaEl as any,\n})\n\n// ── Value resolution ─────────────────────────────────────────────────────────\n\nconst resolvedValue = computed(() =>\n field ? (field.value.value as string | undefined) : model.value,\n)\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// ── Implicit validator ───────────────────────────────────────────────────────\n\nconst hasConstraints = computed(() =>\n !!props.required\n || attrs.minlength != null\n || attrs.maxlength != null,\n)\n\n// ── Counter ──────────────────────────────────────────────────────────────────\n\nconst currentLength = computed(() => (resolvedValue.value ?? '').length)\nconst showCounter = computed(() => config.value.counter)\n\nconst counterText = computed<string>(() => {\n if (!showCounter.value) return ''\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 if (typeof fmt === 'function') return fmt(current, min, max)\n return fmt\n .replace('{current}', String(current))\n .replace('{min}', min != null ? String(min) : '')\n .replace('{max}', max != null ? String(max) : '')\n})\n\nconst counterColor = computed<string>(() => {\n const max = config.value.maxLength\n const min = config.value.minLength\n const current = currentLength.value\n if (max != null && current > max) return 'text-error'\n if (min != null && current < min) return 'text-warning'\n return ''\n})\n\n// Push counter up to FormField\nwatchEffect(() => {\n if (!field) return\n field.setCounterText(\n showCounter.value ? counterText.value : '',\n showCounter.value ? counterColor.value : '',\n )\n})\n\n// ── Error ────────────────────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\n\ndefineExpose({\n $el: textareaEl,\n focus: () => textareaEl.value?.focus(),\n})\n</script>\n\n<template>\n <textarea\n ref=\"textareaEl\"\n v-bind=\"$attrs\"\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 { validator: hasConstraints },\n { 'resize-none': !autoGrow },\n ]\"\n :value=\"resolvedValue\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :required=\"required\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n @input=\"handleUpdate\"\n @blur=\"onBlur\"\n />\n\n <!-- Standalone counter (no FormField) -->\n <div v-if=\"!field && showCounter\" class=\"flex justify-end mt-1\">\n <span class=\"text-xs\" :class=\"counterColor\">{{ counterText }}</span>\n </div>\n</template>\n","import { createComponentConfigKey } from '@/config/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 { 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 */\nconst model = defineModel<boolean>()\n\nconst config = useComponentConfig(TOGGLE_CONFIG, props, { size: 'md' })\n\nconst inputEl = useTemplateRef('inputEl')\nconst slots = useSlots()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => !!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 if (props.readonly) {\n event.preventDefault()\n return\n }\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 / description ──────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\nconst hasDescription = computed(() => !!(props.description || slots.description))\nconst hasHint = computed(() => !!(props.hint || slots.hint))\nconst hasLabel = computed(() => hasDescription.value || hasHint.value)\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- Toggle with description / hint label to the right -->\n <label\n v-if=\"hasLabel\"\n class=\"flex cursor-pointer items-start gap-2\"\n :class=\"{ 'opacity-60 pointer-events-none': disabled || readonly }\"\n >\n <input\n ref=\"inputEl\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"toggle mt-0.5\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"flex flex-col gap-0.5\">\n <span v-if=\"hasDescription\" class=\"label-text leading-snug\">\n <slot name=\"description\">{{ description }}</slot>\n <span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </span>\n <span v-if=\"hasHint\" class=\"label-text text-xs text-base-content/60 leading-snug\">\n <slot name=\"hint\">{{ hint }}</slot>\n </span>\n </span>\n </label>\n\n <!-- Bare toggle — no label -->\n <input\n v-else\n ref=\"inputEl\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"toggle\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\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 { 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 */\nconst model = defineModel<boolean>()\n\nconst config = useComponentConfig(TOGGLE_CONFIG, props, { size: 'md' })\n\nconst inputEl = useTemplateRef('inputEl')\nconst slots = useSlots()\n\n// ── Form field ───────────────────────────────────────────────────────────────\n\nconst { field, fieldValue, onBlur, clearError } = useFormField<boolean>({\n required: computed(() => !!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 if (props.readonly) {\n event.preventDefault()\n return\n }\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 / description ──────────────────────────────────────────────────────\n\nconst hasError = computed(() => !!field?.error.value)\nconst hasDescription = computed(() => !!(props.description || slots.description))\nconst hasHint = computed(() => !!(props.hint || slots.hint))\nconst hasLabel = computed(() => hasDescription.value || hasHint.value)\n\ndefineExpose({\n $el: inputEl,\n focus: () => inputEl.value?.focus(),\n})\n</script>\n\n<template>\n <!-- Toggle with description / hint label to the right -->\n <label\n v-if=\"hasLabel\"\n class=\"flex cursor-pointer items-start gap-2\"\n :class=\"{ 'opacity-60 pointer-events-none': disabled || readonly }\"\n >\n <input\n ref=\"inputEl\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"toggle mt-0.5\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n <span class=\"flex flex-col gap-0.5\">\n <span v-if=\"hasDescription\" class=\"label-text leading-snug\">\n <slot name=\"description\">{{ description }}</slot>\n <span v-if=\"required\" class=\"text-error ml-0.5\" aria-hidden=\"true\">*</span>\n </span>\n <span v-if=\"hasHint\" class=\"label-text text-xs text-base-content/60 leading-snug\">\n <slot name=\"hint\">{{ hint }}</slot>\n </span>\n </span>\n </label>\n\n <!-- Bare toggle — no label -->\n <input\n v-else\n ref=\"inputEl\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"toggle\"\n :class=\"[\n getClass(colors, config.color),\n getClass(sizes, config.size),\n { 'toggle-error': hasError },\n { validator: required },\n ]\"\n :checked=\"resolvedValue\"\n :disabled=\"disabled\"\n :required=\"required\"\n :aria-invalid=\"hasError || undefined\"\n @change=\"handleChange\"\n @blur=\"onBlur\"\n />\n</template>\n"],"mappings":"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"}