@vielzeug/buildit 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (792) hide show
  1. package/README.md +124 -0
  2. package/dist/accordion-item.cjs +32 -0
  3. package/dist/accordion-item.cjs.map +1 -0
  4. package/dist/accordion-item.js +72 -0
  5. package/dist/accordion-item.js.map +1 -0
  6. package/dist/accordion.cjs +2 -0
  7. package/dist/accordion.cjs.map +1 -0
  8. package/dist/accordion.js +37 -0
  9. package/dist/accordion.js.map +1 -0
  10. package/dist/alert.cjs +31 -0
  11. package/dist/alert.cjs.map +1 -0
  12. package/dist/alert.js +85 -0
  13. package/dist/alert.js.map +1 -0
  14. package/dist/avatar.cjs +37 -0
  15. package/dist/avatar.cjs.map +1 -0
  16. package/dist/avatar.js +123 -0
  17. package/dist/avatar.js.map +1 -0
  18. package/dist/badge.cjs +7 -0
  19. package/dist/badge.cjs.map +1 -0
  20. package/dist/badge.js +60 -0
  21. package/dist/badge.js.map +1 -0
  22. package/dist/box.cjs +2 -0
  23. package/dist/box.cjs.map +1 -0
  24. package/dist/box.js +22 -0
  25. package/dist/box.js.map +1 -0
  26. package/dist/breadcrumb.cjs +21 -0
  27. package/dist/breadcrumb.cjs.map +1 -0
  28. package/dist/breadcrumb.js +58 -0
  29. package/dist/breadcrumb.js.map +1 -0
  30. package/dist/buildit.cjs +1892 -0
  31. package/dist/buildit.cjs.map +1 -0
  32. package/dist/buildit.js +1892 -0
  33. package/dist/buildit.js.map +1 -0
  34. package/dist/button-group.cjs +6 -0
  35. package/dist/button-group.cjs.map +1 -0
  36. package/dist/button-group.js +31 -0
  37. package/dist/button-group.js.map +1 -0
  38. package/dist/button.cjs +30 -0
  39. package/dist/button.cjs.map +1 -0
  40. package/dist/button.js +115 -0
  41. package/dist/button.js.map +1 -0
  42. package/dist/card.cjs +23 -0
  43. package/dist/card.cjs.map +1 -0
  44. package/dist/card.js +99 -0
  45. package/dist/card.js.map +1 -0
  46. package/dist/checkbox-group.cjs +20 -0
  47. package/dist/checkbox-group.cjs.map +1 -0
  48. package/dist/checkbox-group.js +88 -0
  49. package/dist/checkbox-group.js.map +1 -0
  50. package/dist/checkbox.cjs +37 -0
  51. package/dist/checkbox.cjs.map +1 -0
  52. package/dist/checkbox.js +115 -0
  53. package/dist/checkbox.js.map +1 -0
  54. package/dist/chip.cjs +56 -0
  55. package/dist/chip.cjs.map +1 -0
  56. package/dist/chip.js +140 -0
  57. package/dist/chip.js.map +1 -0
  58. package/dist/combobox.cjs +93 -0
  59. package/dist/combobox.cjs.map +1 -0
  60. package/dist/combobox.js +401 -0
  61. package/dist/combobox.js.map +1 -0
  62. package/dist/content/avatar/avatar-group.css?inline.cjs +2 -0
  63. package/dist/content/avatar/avatar-group.css?inline.cjs.map +1 -0
  64. package/dist/content/avatar/avatar-group.css?inline.js +6 -0
  65. package/dist/content/avatar/avatar-group.css?inline.js.map +1 -0
  66. package/dist/content/avatar/avatar.css?inline.cjs +2 -0
  67. package/dist/content/avatar/avatar.css?inline.cjs.map +1 -0
  68. package/dist/content/avatar/avatar.css?inline.js +6 -0
  69. package/dist/content/avatar/avatar.css?inline.js.map +1 -0
  70. package/dist/content/avatar/avatar.d.ts +78 -0
  71. package/dist/content/avatar/avatar.d.ts.map +1 -0
  72. package/dist/content/breadcrumb/breadcrumb-item.css?inline.cjs +2 -0
  73. package/dist/content/breadcrumb/breadcrumb-item.css?inline.cjs.map +1 -0
  74. package/dist/content/breadcrumb/breadcrumb-item.css?inline.js +6 -0
  75. package/dist/content/breadcrumb/breadcrumb-item.css?inline.js.map +1 -0
  76. package/dist/content/breadcrumb/breadcrumb.css?inline.cjs +2 -0
  77. package/dist/content/breadcrumb/breadcrumb.css?inline.cjs.map +1 -0
  78. package/dist/content/breadcrumb/breadcrumb.css?inline.js +6 -0
  79. package/dist/content/breadcrumb/breadcrumb.css?inline.js.map +1 -0
  80. package/dist/content/breadcrumb/breadcrumb.d.ts +36 -0
  81. package/dist/content/breadcrumb/breadcrumb.d.ts.map +1 -0
  82. package/dist/content/card/card.css?inline.cjs +2 -0
  83. package/dist/content/card/card.css?inline.cjs.map +1 -0
  84. package/dist/content/card/card.css?inline.js +6 -0
  85. package/dist/content/card/card.css?inline.js.map +1 -0
  86. package/dist/content/card/card.d.ts +66 -0
  87. package/dist/content/card/card.d.ts.map +1 -0
  88. package/dist/content/index.cjs +1 -0
  89. package/dist/content/index.d.ts +15 -0
  90. package/dist/content/index.d.ts.map +1 -0
  91. package/dist/content/index.js +7 -0
  92. package/dist/content/pagination/pagination.css?inline.cjs +2 -0
  93. package/dist/content/pagination/pagination.css?inline.cjs.map +1 -0
  94. package/dist/content/pagination/pagination.css?inline.js +6 -0
  95. package/dist/content/pagination/pagination.css?inline.js.map +1 -0
  96. package/dist/content/pagination/pagination.d.ts +56 -0
  97. package/dist/content/pagination/pagination.d.ts.map +1 -0
  98. package/dist/content/separator/separator.css?inline.cjs +2 -0
  99. package/dist/content/separator/separator.css?inline.cjs.map +1 -0
  100. package/dist/content/separator/separator.css?inline.js +6 -0
  101. package/dist/content/separator/separator.css?inline.js.map +1 -0
  102. package/dist/content/separator/separator.d.ts +35 -0
  103. package/dist/content/separator/separator.d.ts.map +1 -0
  104. package/dist/content/table/table.css?inline.cjs +2 -0
  105. package/dist/content/table/table.css?inline.cjs.map +1 -0
  106. package/dist/content/table/table.css?inline.js +6 -0
  107. package/dist/content/table/table.css?inline.js.map +1 -0
  108. package/dist/content/table/table.d.ts +69 -0
  109. package/dist/content/table/table.d.ts.map +1 -0
  110. package/dist/content/text/text.css?inline.cjs +2 -0
  111. package/dist/content/text/text.css?inline.cjs.map +1 -0
  112. package/dist/content/text/text.css?inline.js +6 -0
  113. package/dist/content/text/text.css?inline.js.map +1 -0
  114. package/dist/content/text/text.d.ts +55 -0
  115. package/dist/content/text/text.d.ts.map +1 -0
  116. package/dist/craftit/dist/core/internal.cjs +2 -0
  117. package/dist/craftit/dist/core/internal.cjs.map +1 -0
  118. package/dist/craftit/dist/core/internal.js +25 -0
  119. package/dist/craftit/dist/core/internal.js.map +1 -0
  120. package/dist/craftit/dist/core/runtime-bindings.cjs +2 -0
  121. package/dist/craftit/dist/core/runtime-bindings.cjs.map +1 -0
  122. package/dist/craftit/dist/core/runtime-bindings.js +38 -0
  123. package/dist/craftit/dist/core/runtime-bindings.js.map +1 -0
  124. package/dist/craftit/dist/core/runtime-lifecycle.cjs +2 -0
  125. package/dist/craftit/dist/core/runtime-lifecycle.cjs.map +1 -0
  126. package/dist/craftit/dist/core/runtime-lifecycle.js +68 -0
  127. package/dist/craftit/dist/core/runtime-lifecycle.js.map +1 -0
  128. package/dist/craftit/dist/core/runtime.cjs +1 -0
  129. package/dist/craftit/dist/core/runtime.js +2 -0
  130. package/dist/craftit/dist/core/utilities.cjs +2 -0
  131. package/dist/craftit/dist/core/utilities.cjs.map +1 -0
  132. package/dist/craftit/dist/core/utilities.js +12 -0
  133. package/dist/craftit/dist/core/utilities.js.map +1 -0
  134. package/dist/craftit/dist/directives/attr.cjs +2 -0
  135. package/dist/craftit/dist/directives/attr.cjs.map +1 -0
  136. package/dist/craftit/dist/directives/attr.js +13 -0
  137. package/dist/craftit/dist/directives/attr.js.map +1 -0
  138. package/dist/craftit/dist/directives/bind.cjs +1 -0
  139. package/dist/craftit/dist/directives/bind.js +3 -0
  140. package/dist/craftit/dist/directives/choose.cjs +1 -0
  141. package/dist/craftit/dist/directives/choose.js +1 -0
  142. package/dist/craftit/dist/directives/classes.cjs +2 -0
  143. package/dist/craftit/dist/directives/classes.cjs.map +1 -0
  144. package/dist/craftit/dist/directives/classes.js +12 -0
  145. package/dist/craftit/dist/directives/classes.js.map +1 -0
  146. package/dist/craftit/dist/directives/each.cjs +2 -0
  147. package/dist/craftit/dist/directives/each.cjs.map +1 -0
  148. package/dist/craftit/dist/directives/each.js +96 -0
  149. package/dist/craftit/dist/directives/each.js.map +1 -0
  150. package/dist/craftit/dist/directives/index.cjs +1 -0
  151. package/dist/craftit/dist/directives/index.js +12 -0
  152. package/dist/craftit/dist/directives/match.cjs +1 -0
  153. package/dist/craftit/dist/directives/match.js +1 -0
  154. package/dist/craftit/dist/directives/memo.cjs +1 -0
  155. package/dist/craftit/dist/directives/memo.js +1 -0
  156. package/dist/craftit/dist/directives/raw.cjs +1 -0
  157. package/dist/craftit/dist/directives/raw.js +2 -0
  158. package/dist/craftit/dist/directives/spread.cjs +2 -0
  159. package/dist/craftit/dist/directives/spread.cjs.map +1 -0
  160. package/dist/craftit/dist/directives/spread.js +30 -0
  161. package/dist/craftit/dist/directives/spread.js.map +1 -0
  162. package/dist/craftit/dist/directives/style.cjs +1 -0
  163. package/dist/craftit/dist/directives/style.js +1 -0
  164. package/dist/craftit/dist/directives/until.cjs +1 -0
  165. package/dist/craftit/dist/directives/until.js +1 -0
  166. package/dist/craftit/dist/directives/when.cjs +2 -0
  167. package/dist/craftit/dist/directives/when.cjs.map +1 -0
  168. package/dist/craftit/dist/directives/when.js +14 -0
  169. package/dist/craftit/dist/directives/when.js.map +1 -0
  170. package/dist/craftit/dist/labs/a11y.cjs +2 -0
  171. package/dist/craftit/dist/labs/a11y.cjs.map +1 -0
  172. package/dist/craftit/dist/labs/a11y.js +38 -0
  173. package/dist/craftit/dist/labs/a11y.js.map +1 -0
  174. package/dist/craftit/dist/labs/list.cjs +2 -0
  175. package/dist/craftit/dist/labs/list.cjs.map +1 -0
  176. package/dist/craftit/dist/labs/list.js +87 -0
  177. package/dist/craftit/dist/labs/list.js.map +1 -0
  178. package/dist/craftit/dist/labs/observers.cjs +2 -0
  179. package/dist/craftit/dist/labs/observers.cjs.map +1 -0
  180. package/dist/craftit/dist/labs/observers.js +28 -0
  181. package/dist/craftit/dist/labs/observers.js.map +1 -0
  182. package/dist/craftit/dist/labs/overlay.cjs +2 -0
  183. package/dist/craftit/dist/labs/overlay.cjs.map +1 -0
  184. package/dist/craftit/dist/labs/overlay.js +49 -0
  185. package/dist/craftit/dist/labs/overlay.js.map +1 -0
  186. package/dist/craftit/dist/labs/selectable.cjs +2 -0
  187. package/dist/craftit/dist/labs/selectable.cjs.map +1 -0
  188. package/dist/craftit/dist/labs/selectable.js +29 -0
  189. package/dist/craftit/dist/labs/selectable.js.map +1 -0
  190. package/dist/craftit/dist/labs/selection.cjs +2 -0
  191. package/dist/craftit/dist/labs/selection.cjs.map +1 -0
  192. package/dist/craftit/dist/labs/selection.js +42 -0
  193. package/dist/craftit/dist/labs/selection.js.map +1 -0
  194. package/dist/craftit/dist/labs.cjs +1 -0
  195. package/dist/craftit/dist/labs.js +6 -0
  196. package/dist/custom-elements.json +2321 -0
  197. package/dist/dialog.cjs +33 -0
  198. package/dist/dialog.cjs.map +1 -0
  199. package/dist/dialog.js +94 -0
  200. package/dist/dialog.js.map +1 -0
  201. package/dist/disclosure/accordion/accordion.css?inline.cjs +2 -0
  202. package/dist/disclosure/accordion/accordion.css?inline.cjs.map +1 -0
  203. package/dist/disclosure/accordion/accordion.css?inline.js +6 -0
  204. package/dist/disclosure/accordion/accordion.css?inline.js.map +1 -0
  205. package/dist/disclosure/accordion/accordion.d.ts +47 -0
  206. package/dist/disclosure/accordion/accordion.d.ts.map +1 -0
  207. package/dist/disclosure/accordion-item/accordion-item.css?inline.cjs +2 -0
  208. package/dist/disclosure/accordion-item/accordion-item.css?inline.cjs.map +1 -0
  209. package/dist/disclosure/accordion-item/accordion-item.css?inline.js +6 -0
  210. package/dist/disclosure/accordion-item/accordion-item.css?inline.js.map +1 -0
  211. package/dist/disclosure/accordion-item/accordion-item.d.ts +62 -0
  212. package/dist/disclosure/accordion-item/accordion-item.d.ts.map +1 -0
  213. package/dist/disclosure/index.cjs +1 -0
  214. package/dist/disclosure/index.d.ts +11 -0
  215. package/dist/disclosure/index.d.ts.map +1 -0
  216. package/dist/disclosure/index.js +5 -0
  217. package/dist/disclosure/tab-item/tab-item.css?inline.cjs +2 -0
  218. package/dist/disclosure/tab-item/tab-item.css?inline.cjs.map +1 -0
  219. package/dist/disclosure/tab-item/tab-item.css?inline.js +6 -0
  220. package/dist/disclosure/tab-item/tab-item.css?inline.js.map +1 -0
  221. package/dist/disclosure/tab-item/tab-item.d.ts +39 -0
  222. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -0
  223. package/dist/disclosure/tab-panel/tab-panel.css?inline.cjs +2 -0
  224. package/dist/disclosure/tab-panel/tab-panel.css?inline.cjs.map +1 -0
  225. package/dist/disclosure/tab-panel/tab-panel.css?inline.js +6 -0
  226. package/dist/disclosure/tab-panel/tab-panel.css?inline.js.map +1 -0
  227. package/dist/disclosure/tab-panel/tab-panel.d.ts +30 -0
  228. package/dist/disclosure/tab-panel/tab-panel.d.ts.map +1 -0
  229. package/dist/disclosure/tabs/tabs.css?inline.cjs +2 -0
  230. package/dist/disclosure/tabs/tabs.css?inline.cjs.map +1 -0
  231. package/dist/disclosure/tabs/tabs.css?inline.js +6 -0
  232. package/dist/disclosure/tabs/tabs.css?inline.js.map +1 -0
  233. package/dist/disclosure/tabs/tabs.d.ts +64 -0
  234. package/dist/disclosure/tabs/tabs.d.ts.map +1 -0
  235. package/dist/drawer.cjs +31 -0
  236. package/dist/drawer.cjs.map +1 -0
  237. package/dist/drawer.js +98 -0
  238. package/dist/drawer.js.map +1 -0
  239. package/dist/feedback/alert/alert.css?inline.cjs +2 -0
  240. package/dist/feedback/alert/alert.css?inline.cjs.map +1 -0
  241. package/dist/feedback/alert/alert.css?inline.js +6 -0
  242. package/dist/feedback/alert/alert.css?inline.js.map +1 -0
  243. package/dist/feedback/alert/alert.d.ts +63 -0
  244. package/dist/feedback/alert/alert.d.ts.map +1 -0
  245. package/dist/feedback/badge/badge.css?inline.cjs +2 -0
  246. package/dist/feedback/badge/badge.css?inline.cjs.map +1 -0
  247. package/dist/feedback/badge/badge.css?inline.js +6 -0
  248. package/dist/feedback/badge/badge.css?inline.js.map +1 -0
  249. package/dist/feedback/badge/badge.d.ts +67 -0
  250. package/dist/feedback/badge/badge.d.ts.map +1 -0
  251. package/dist/feedback/chip/chip.css?inline.cjs +2 -0
  252. package/dist/feedback/chip/chip.css?inline.cjs.map +1 -0
  253. package/dist/feedback/chip/chip.css?inline.js +6 -0
  254. package/dist/feedback/chip/chip.css?inline.js.map +1 -0
  255. package/dist/feedback/chip/chip.d.ts +124 -0
  256. package/dist/feedback/chip/chip.d.ts.map +1 -0
  257. package/dist/feedback/index.cjs +1 -0
  258. package/dist/feedback/index.d.ts +13 -0
  259. package/dist/feedback/index.d.ts.map +1 -0
  260. package/dist/feedback/index.js +6 -0
  261. package/dist/feedback/progress/progress.css?inline.cjs +2 -0
  262. package/dist/feedback/progress/progress.css?inline.cjs.map +1 -0
  263. package/dist/feedback/progress/progress.css?inline.js +6 -0
  264. package/dist/feedback/progress/progress.css?inline.js.map +1 -0
  265. package/dist/feedback/progress/progress.d.ts +64 -0
  266. package/dist/feedback/progress/progress.d.ts.map +1 -0
  267. package/dist/feedback/skeleton/skeleton.css?inline.cjs +2 -0
  268. package/dist/feedback/skeleton/skeleton.css?inline.cjs.map +1 -0
  269. package/dist/feedback/skeleton/skeleton.css?inline.js +6 -0
  270. package/dist/feedback/skeleton/skeleton.css?inline.js.map +1 -0
  271. package/dist/feedback/skeleton/skeleton.d.ts +61 -0
  272. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -0
  273. package/dist/feedback/toast/index.d.ts +2 -0
  274. package/dist/feedback/toast/index.d.ts.map +1 -0
  275. package/dist/feedback/toast/toast.css?inline.cjs +2 -0
  276. package/dist/feedback/toast/toast.css?inline.cjs.map +1 -0
  277. package/dist/feedback/toast/toast.css?inline.js +6 -0
  278. package/dist/feedback/toast/toast.css?inline.js.map +1 -0
  279. package/dist/feedback/toast/toast.d.ts +95 -0
  280. package/dist/feedback/toast/toast.d.ts.map +1 -0
  281. package/dist/file-input.cjs +66 -0
  282. package/dist/file-input.cjs.map +1 -0
  283. package/dist/file-input.js +210 -0
  284. package/dist/file-input.js.map +1 -0
  285. package/dist/form.cjs +11 -0
  286. package/dist/form.cjs.map +1 -0
  287. package/dist/form.js +49 -0
  288. package/dist/form.js.map +1 -0
  289. package/dist/grid-item.cjs +2 -0
  290. package/dist/grid-item.cjs.map +1 -0
  291. package/dist/grid-item.js +28 -0
  292. package/dist/grid-item.js.map +1 -0
  293. package/dist/grid.cjs +2 -0
  294. package/dist/grid.cjs.map +1 -0
  295. package/dist/grid.js +90 -0
  296. package/dist/grid.js.map +1 -0
  297. package/dist/icons.cjs +176 -0
  298. package/dist/icons.cjs.map +1 -0
  299. package/dist/icons.d.ts +15 -0
  300. package/dist/icons.d.ts.map +1 -0
  301. package/dist/icons.js +181 -0
  302. package/dist/icons.js.map +1 -0
  303. package/dist/index.cjs +1 -0
  304. package/dist/index.d.ts +9 -0
  305. package/dist/index.d.ts.map +1 -0
  306. package/dist/index.js +53 -0
  307. package/dist/input.cjs +48 -0
  308. package/dist/input.cjs.map +1 -0
  309. package/dist/input.js +182 -0
  310. package/dist/input.js.map +1 -0
  311. package/dist/inputs/button/button.css?inline.cjs +2 -0
  312. package/dist/inputs/button/button.css?inline.cjs.map +1 -0
  313. package/dist/inputs/button/button.css?inline.js +6 -0
  314. package/dist/inputs/button/button.css?inline.js.map +1 -0
  315. package/dist/inputs/button/button.d.ts +73 -0
  316. package/dist/inputs/button/button.d.ts.map +1 -0
  317. package/dist/inputs/button-group/button-group.css?inline.cjs +2 -0
  318. package/dist/inputs/button-group/button-group.css?inline.cjs.map +1 -0
  319. package/dist/inputs/button-group/button-group.css?inline.js +6 -0
  320. package/dist/inputs/button-group/button-group.css?inline.js.map +1 -0
  321. package/dist/inputs/button-group/button-group.d.ts +52 -0
  322. package/dist/inputs/button-group/button-group.d.ts.map +1 -0
  323. package/dist/inputs/checkbox/checkbox.css?inline.cjs +2 -0
  324. package/dist/inputs/checkbox/checkbox.css?inline.cjs.map +1 -0
  325. package/dist/inputs/checkbox/checkbox.css?inline.js +6 -0
  326. package/dist/inputs/checkbox/checkbox.css?inline.js.map +1 -0
  327. package/dist/inputs/checkbox/checkbox.d.ts +43 -0
  328. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -0
  329. package/dist/inputs/checkbox-group/checkbox-group.css?inline.cjs +2 -0
  330. package/dist/inputs/checkbox-group/checkbox-group.css?inline.cjs.map +1 -0
  331. package/dist/inputs/checkbox-group/checkbox-group.css?inline.js +6 -0
  332. package/dist/inputs/checkbox-group/checkbox-group.css?inline.js.map +1 -0
  333. package/dist/inputs/checkbox-group/checkbox-group.d.ts +56 -0
  334. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -0
  335. package/dist/inputs/combobox/combobox-options.cjs +2 -0
  336. package/dist/inputs/combobox/combobox-options.cjs.map +1 -0
  337. package/dist/inputs/combobox/combobox-options.d.ts +7 -0
  338. package/dist/inputs/combobox/combobox-options.d.ts.map +1 -0
  339. package/dist/inputs/combobox/combobox-options.js +36 -0
  340. package/dist/inputs/combobox/combobox-options.js.map +1 -0
  341. package/dist/inputs/combobox/combobox-virtualizer.cjs +2 -0
  342. package/dist/inputs/combobox/combobox-virtualizer.cjs.map +1 -0
  343. package/dist/inputs/combobox/combobox-virtualizer.d.ts +20 -0
  344. package/dist/inputs/combobox/combobox-virtualizer.d.ts.map +1 -0
  345. package/dist/inputs/combobox/combobox-virtualizer.js +71 -0
  346. package/dist/inputs/combobox/combobox-virtualizer.js.map +1 -0
  347. package/dist/inputs/combobox/combobox.css?inline.cjs +2 -0
  348. package/dist/inputs/combobox/combobox.css?inline.cjs.map +1 -0
  349. package/dist/inputs/combobox/combobox.css?inline.js +6 -0
  350. package/dist/inputs/combobox/combobox.css?inline.js.map +1 -0
  351. package/dist/inputs/combobox/combobox.d.ts +28 -0
  352. package/dist/inputs/combobox/combobox.d.ts.map +1 -0
  353. package/dist/inputs/combobox/combobox.types.d.ts +36 -0
  354. package/dist/inputs/combobox/combobox.types.d.ts.map +1 -0
  355. package/dist/inputs/file-input/file-input.css?inline.cjs +2 -0
  356. package/dist/inputs/file-input/file-input.css?inline.cjs.map +1 -0
  357. package/dist/inputs/file-input/file-input.css?inline.js +6 -0
  358. package/dist/inputs/file-input/file-input.css?inline.js.map +1 -0
  359. package/dist/inputs/file-input/file-input.d.ts +94 -0
  360. package/dist/inputs/file-input/file-input.d.ts.map +1 -0
  361. package/dist/inputs/form/form.css?inline.cjs +2 -0
  362. package/dist/inputs/form/form.css?inline.cjs.map +1 -0
  363. package/dist/inputs/form/form.css?inline.js +6 -0
  364. package/dist/inputs/form/form.css?inline.js.map +1 -0
  365. package/dist/inputs/form/form.d.ts +61 -0
  366. package/dist/inputs/form/form.d.ts.map +1 -0
  367. package/dist/inputs/index.cjs +1 -0
  368. package/dist/inputs/index.d.ts +38 -0
  369. package/dist/inputs/index.d.ts.map +1 -0
  370. package/dist/inputs/index.js +18 -0
  371. package/dist/inputs/input/input.css?inline.cjs +2 -0
  372. package/dist/inputs/input/input.css?inline.cjs.map +1 -0
  373. package/dist/inputs/input/input.css?inline.js +6 -0
  374. package/dist/inputs/input/input.css?inline.js.map +1 -0
  375. package/dist/inputs/input/input.d.ts +82 -0
  376. package/dist/inputs/input/input.d.ts.map +1 -0
  377. package/dist/inputs/number-input/number-input.css?inline.cjs +2 -0
  378. package/dist/inputs/number-input/number-input.css?inline.cjs.map +1 -0
  379. package/dist/inputs/number-input/number-input.css?inline.js +6 -0
  380. package/dist/inputs/number-input/number-input.css?inline.js.map +1 -0
  381. package/dist/inputs/number-input/number-input.d.ts +76 -0
  382. package/dist/inputs/number-input/number-input.d.ts.map +1 -0
  383. package/dist/inputs/otp-input/otp-input.css?inline.cjs +2 -0
  384. package/dist/inputs/otp-input/otp-input.css?inline.cjs.map +1 -0
  385. package/dist/inputs/otp-input/otp-input.css?inline.js +6 -0
  386. package/dist/inputs/otp-input/otp-input.css?inline.js.map +1 -0
  387. package/dist/inputs/otp-input/otp-input.d.ts +71 -0
  388. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -0
  389. package/dist/inputs/radio/radio.css?inline.cjs +2 -0
  390. package/dist/inputs/radio/radio.css?inline.cjs.map +1 -0
  391. package/dist/inputs/radio/radio.css?inline.js +6 -0
  392. package/dist/inputs/radio/radio.css?inline.js.map +1 -0
  393. package/dist/inputs/radio/radio.d.ts +41 -0
  394. package/dist/inputs/radio/radio.d.ts.map +1 -0
  395. package/dist/inputs/radio-group/radio-group.css?inline.cjs +2 -0
  396. package/dist/inputs/radio-group/radio-group.css?inline.cjs.map +1 -0
  397. package/dist/inputs/radio-group/radio-group.css?inline.js +6 -0
  398. package/dist/inputs/radio-group/radio-group.css?inline.js.map +1 -0
  399. package/dist/inputs/radio-group/radio-group.d.ts +61 -0
  400. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -0
  401. package/dist/inputs/rating/rating.css?inline.cjs +2 -0
  402. package/dist/inputs/rating/rating.css?inline.cjs.map +1 -0
  403. package/dist/inputs/rating/rating.css?inline.js +6 -0
  404. package/dist/inputs/rating/rating.css?inline.js.map +1 -0
  405. package/dist/inputs/rating/rating.d.ts +48 -0
  406. package/dist/inputs/rating/rating.d.ts.map +1 -0
  407. package/dist/inputs/select/select.css?inline.cjs +2 -0
  408. package/dist/inputs/select/select.css?inline.cjs.map +1 -0
  409. package/dist/inputs/select/select.css?inline.js +6 -0
  410. package/dist/inputs/select/select.css?inline.js.map +1 -0
  411. package/dist/inputs/select/select.d.ts +79 -0
  412. package/dist/inputs/select/select.d.ts.map +1 -0
  413. package/dist/inputs/shared/base-props.d.ts +39 -0
  414. package/dist/inputs/shared/base-props.d.ts.map +1 -0
  415. package/dist/inputs/shared/composables/index.cjs +1 -0
  416. package/dist/inputs/shared/composables/index.d.ts +3 -0
  417. package/dist/inputs/shared/composables/index.d.ts.map +1 -0
  418. package/dist/inputs/shared/composables/index.js +2 -0
  419. package/dist/inputs/shared/composables/use-text-field.cjs +2 -0
  420. package/dist/inputs/shared/composables/use-text-field.cjs.map +1 -0
  421. package/dist/inputs/shared/composables/use-text-field.d.ts +33 -0
  422. package/dist/inputs/shared/composables/use-text-field.d.ts.map +1 -0
  423. package/dist/inputs/shared/composables/use-text-field.js +41 -0
  424. package/dist/inputs/shared/composables/use-text-field.js.map +1 -0
  425. package/dist/inputs/shared/composables/use-toggle-field.cjs +2 -0
  426. package/dist/inputs/shared/composables/use-toggle-field.cjs.map +1 -0
  427. package/dist/inputs/shared/composables/use-toggle-field.d.ts +18 -0
  428. package/dist/inputs/shared/composables/use-toggle-field.d.ts.map +1 -0
  429. package/dist/inputs/shared/composables/use-toggle-field.js +26 -0
  430. package/dist/inputs/shared/composables/use-toggle-field.js.map +1 -0
  431. package/dist/inputs/shared/design-presets.cjs +2 -0
  432. package/dist/inputs/shared/design-presets.cjs.map +1 -0
  433. package/dist/inputs/shared/design-presets.d.ts +97 -0
  434. package/dist/inputs/shared/design-presets.d.ts.map +1 -0
  435. package/dist/inputs/shared/design-presets.js +92 -0
  436. package/dist/inputs/shared/design-presets.js.map +1 -0
  437. package/dist/inputs/shared/dom-sync/dropdown.cjs +2 -0
  438. package/dist/inputs/shared/dom-sync/dropdown.cjs.map +1 -0
  439. package/dist/inputs/shared/dom-sync/dropdown.d.ts +7 -0
  440. package/dist/inputs/shared/dom-sync/dropdown.d.ts.map +1 -0
  441. package/dist/inputs/shared/dom-sync/dropdown.js +30 -0
  442. package/dist/inputs/shared/dom-sync/dropdown.js.map +1 -0
  443. package/dist/inputs/shared/dom-sync/field-sync.cjs +2 -0
  444. package/dist/inputs/shared/dom-sync/field-sync.cjs.map +1 -0
  445. package/dist/inputs/shared/dom-sync/field-sync.d.ts +36 -0
  446. package/dist/inputs/shared/dom-sync/field-sync.d.ts.map +1 -0
  447. package/dist/inputs/shared/dom-sync/field-sync.js +37 -0
  448. package/dist/inputs/shared/dom-sync/field-sync.js.map +1 -0
  449. package/dist/inputs/shared/dom-sync/form-context.cjs +2 -0
  450. package/dist/inputs/shared/dom-sync/form-context.cjs.map +1 -0
  451. package/dist/inputs/shared/dom-sync/form-context.d.ts +18 -0
  452. package/dist/inputs/shared/dom-sync/form-context.d.ts.map +1 -0
  453. package/dist/inputs/shared/dom-sync/form-context.js +20 -0
  454. package/dist/inputs/shared/dom-sync/form-context.js.map +1 -0
  455. package/dist/inputs/shared/dom-sync/index.cjs +1 -0
  456. package/dist/inputs/shared/dom-sync/index.d.ts +5 -0
  457. package/dist/inputs/shared/dom-sync/index.d.ts.map +1 -0
  458. package/dist/inputs/shared/dom-sync/index.js +4 -0
  459. package/dist/inputs/shared/dom-sync/label-sync.cjs +2 -0
  460. package/dist/inputs/shared/dom-sync/label-sync.cjs.map +1 -0
  461. package/dist/inputs/shared/dom-sync/label-sync.d.ts +16 -0
  462. package/dist/inputs/shared/dom-sync/label-sync.d.ts.map +1 -0
  463. package/dist/inputs/shared/dom-sync/label-sync.js +12 -0
  464. package/dist/inputs/shared/dom-sync/label-sync.js.map +1 -0
  465. package/dist/inputs/shared/form-context.cjs +2 -0
  466. package/dist/inputs/shared/form-context.cjs.map +1 -0
  467. package/dist/inputs/shared/form-context.d.ts +19 -0
  468. package/dist/inputs/shared/form-context.d.ts.map +1 -0
  469. package/dist/inputs/shared/form-context.js +7 -0
  470. package/dist/inputs/shared/form-context.js.map +1 -0
  471. package/dist/inputs/shared/utils/assistive-text.cjs +2 -0
  472. package/dist/inputs/shared/utils/assistive-text.cjs.map +1 -0
  473. package/dist/inputs/shared/utils/assistive-text.d.ts +24 -0
  474. package/dist/inputs/shared/utils/assistive-text.d.ts.map +1 -0
  475. package/dist/inputs/shared/utils/assistive-text.js +37 -0
  476. package/dist/inputs/shared/utils/assistive-text.js.map +1 -0
  477. package/dist/inputs/shared/utils/choice-change.cjs +2 -0
  478. package/dist/inputs/shared/utils/choice-change.cjs.map +1 -0
  479. package/dist/inputs/shared/utils/choice-change.d.ts +8 -0
  480. package/dist/inputs/shared/utils/choice-change.d.ts.map +1 -0
  481. package/dist/inputs/shared/utils/choice-change.js +13 -0
  482. package/dist/inputs/shared/utils/choice-change.js.map +1 -0
  483. package/dist/inputs/shared/utils/controlled-csv.cjs +2 -0
  484. package/dist/inputs/shared/utils/controlled-csv.cjs.map +1 -0
  485. package/dist/inputs/shared/utils/controlled-csv.d.ts +8 -0
  486. package/dist/inputs/shared/utils/controlled-csv.d.ts.map +1 -0
  487. package/dist/inputs/shared/utils/controlled-csv.js +15 -0
  488. package/dist/inputs/shared/utils/controlled-csv.js.map +1 -0
  489. package/dist/inputs/shared/utils/field-values.cjs +2 -0
  490. package/dist/inputs/shared/utils/field-values.cjs.map +1 -0
  491. package/dist/inputs/shared/utils/field-values.d.ts +5 -0
  492. package/dist/inputs/shared/utils/field-values.d.ts.map +1 -0
  493. package/dist/inputs/shared/utils/field-values.js +13 -0
  494. package/dist/inputs/shared/utils/field-values.js.map +1 -0
  495. package/dist/inputs/shared/utils/index.d.ts +5 -0
  496. package/dist/inputs/shared/utils/index.d.ts.map +1 -0
  497. package/dist/inputs/shared/validation/index.cjs +2 -0
  498. package/dist/inputs/shared/validation/index.cjs.map +1 -0
  499. package/dist/inputs/shared/validation/index.d.ts +14 -0
  500. package/dist/inputs/shared/validation/index.d.ts.map +1 -0
  501. package/dist/inputs/shared/validation/index.js +13 -0
  502. package/dist/inputs/shared/validation/index.js.map +1 -0
  503. package/dist/inputs/slider/slider.css?inline.cjs +2 -0
  504. package/dist/inputs/slider/slider.css?inline.cjs.map +1 -0
  505. package/dist/inputs/slider/slider.css?inline.js +6 -0
  506. package/dist/inputs/slider/slider.css?inline.js.map +1 -0
  507. package/dist/inputs/slider/slider.d.ts +82 -0
  508. package/dist/inputs/slider/slider.d.ts.map +1 -0
  509. package/dist/inputs/switch/switch.css?inline.cjs +2 -0
  510. package/dist/inputs/switch/switch.css?inline.cjs.map +1 -0
  511. package/dist/inputs/switch/switch.css?inline.js +6 -0
  512. package/dist/inputs/switch/switch.css?inline.js.map +1 -0
  513. package/dist/inputs/switch/switch.d.ts +40 -0
  514. package/dist/inputs/switch/switch.d.ts.map +1 -0
  515. package/dist/inputs/textarea/textarea.css?inline.cjs +2 -0
  516. package/dist/inputs/textarea/textarea.css?inline.cjs.map +1 -0
  517. package/dist/inputs/textarea/textarea.css?inline.js +6 -0
  518. package/dist/inputs/textarea/textarea.css?inline.js.map +1 -0
  519. package/dist/inputs/textarea/textarea.d.ts +57 -0
  520. package/dist/inputs/textarea/textarea.d.ts.map +1 -0
  521. package/dist/layout/box/box.css?inline.cjs +2 -0
  522. package/dist/layout/box/box.css?inline.cjs.map +1 -0
  523. package/dist/layout/box/box.css?inline.js +6 -0
  524. package/dist/layout/box/box.css?inline.js.map +1 -0
  525. package/dist/layout/box/box.d.ts +52 -0
  526. package/dist/layout/box/box.d.ts.map +1 -0
  527. package/dist/layout/grid/grid.css?inline.cjs +2 -0
  528. package/dist/layout/grid/grid.css?inline.cjs.map +1 -0
  529. package/dist/layout/grid/grid.css?inline.js +6 -0
  530. package/dist/layout/grid/grid.css?inline.js.map +1 -0
  531. package/dist/layout/grid/grid.d.ts +105 -0
  532. package/dist/layout/grid/grid.d.ts.map +1 -0
  533. package/dist/layout/grid-item/grid-item.css?inline.cjs +2 -0
  534. package/dist/layout/grid-item/grid-item.css?inline.cjs.map +1 -0
  535. package/dist/layout/grid-item/grid-item.css?inline.js +6 -0
  536. package/dist/layout/grid-item/grid-item.css?inline.js.map +1 -0
  537. package/dist/layout/grid-item/grid-item.d.ts +47 -0
  538. package/dist/layout/grid-item/grid-item.d.ts.map +1 -0
  539. package/dist/layout/index.cjs +1 -0
  540. package/dist/layout/index.d.ts +9 -0
  541. package/dist/layout/index.d.ts.map +1 -0
  542. package/dist/layout/index.js +4 -0
  543. package/dist/layout/sidebar/sidebar-group.css?inline.cjs +2 -0
  544. package/dist/layout/sidebar/sidebar-group.css?inline.cjs.map +1 -0
  545. package/dist/layout/sidebar/sidebar-group.css?inline.js +6 -0
  546. package/dist/layout/sidebar/sidebar-group.css?inline.js.map +1 -0
  547. package/dist/layout/sidebar/sidebar-item.css?inline.cjs +2 -0
  548. package/dist/layout/sidebar/sidebar-item.css?inline.cjs.map +1 -0
  549. package/dist/layout/sidebar/sidebar-item.css?inline.js +6 -0
  550. package/dist/layout/sidebar/sidebar-item.css?inline.js.map +1 -0
  551. package/dist/layout/sidebar/sidebar.css?inline.cjs +2 -0
  552. package/dist/layout/sidebar/sidebar.css?inline.cjs.map +1 -0
  553. package/dist/layout/sidebar/sidebar.css?inline.js +6 -0
  554. package/dist/layout/sidebar/sidebar.css?inline.js.map +1 -0
  555. package/dist/layout/sidebar/sidebar.d.ts +190 -0
  556. package/dist/layout/sidebar/sidebar.d.ts.map +1 -0
  557. package/dist/menu.cjs +133 -0
  558. package/dist/menu.cjs.map +1 -0
  559. package/dist/menu.js +296 -0
  560. package/dist/menu.js.map +1 -0
  561. package/dist/number-input.cjs +55 -0
  562. package/dist/number-input.cjs.map +1 -0
  563. package/dist/number-input.js +158 -0
  564. package/dist/number-input.js.map +1 -0
  565. package/dist/otp-input.cjs +22 -0
  566. package/dist/otp-input.cjs.map +1 -0
  567. package/dist/otp-input.js +120 -0
  568. package/dist/otp-input.js.map +1 -0
  569. package/dist/overlay/dialog/dialog.css?inline.cjs +2 -0
  570. package/dist/overlay/dialog/dialog.css?inline.cjs.map +1 -0
  571. package/dist/overlay/dialog/dialog.css?inline.js +6 -0
  572. package/dist/overlay/dialog/dialog.css?inline.js.map +1 -0
  573. package/dist/overlay/dialog/dialog.d.ts +98 -0
  574. package/dist/overlay/dialog/dialog.d.ts.map +1 -0
  575. package/dist/overlay/drawer/drawer.css?inline.cjs +2 -0
  576. package/dist/overlay/drawer/drawer.css?inline.cjs.map +1 -0
  577. package/dist/overlay/drawer/drawer.css?inline.js +6 -0
  578. package/dist/overlay/drawer/drawer.css?inline.js.map +1 -0
  579. package/dist/overlay/drawer/drawer.d.ts +98 -0
  580. package/dist/overlay/drawer/drawer.d.ts.map +1 -0
  581. package/dist/overlay/index.cjs +1 -0
  582. package/dist/overlay/index.d.ts +11 -0
  583. package/dist/overlay/index.d.ts.map +1 -0
  584. package/dist/overlay/index.js +5 -0
  585. package/dist/overlay/menu/menu.css?inline.cjs +2 -0
  586. package/dist/overlay/menu/menu.css?inline.cjs.map +1 -0
  587. package/dist/overlay/menu/menu.css?inline.js +6 -0
  588. package/dist/overlay/menu/menu.css?inline.js.map +1 -0
  589. package/dist/overlay/menu/menu.d.ts +45 -0
  590. package/dist/overlay/menu/menu.d.ts.map +1 -0
  591. package/dist/overlay/popover/popover.css?inline.cjs +2 -0
  592. package/dist/overlay/popover/popover.css?inline.cjs.map +1 -0
  593. package/dist/overlay/popover/popover.css?inline.js +6 -0
  594. package/dist/overlay/popover/popover.css?inline.js.map +1 -0
  595. package/dist/overlay/popover/popover.d.ts +56 -0
  596. package/dist/overlay/popover/popover.d.ts.map +1 -0
  597. package/dist/overlay/tooltip/tooltip.css?inline.cjs +2 -0
  598. package/dist/overlay/tooltip/tooltip.css?inline.cjs.map +1 -0
  599. package/dist/overlay/tooltip/tooltip.css?inline.js +6 -0
  600. package/dist/overlay/tooltip/tooltip.css?inline.js.map +1 -0
  601. package/dist/overlay/tooltip/tooltip.d.ts +55 -0
  602. package/dist/overlay/tooltip/tooltip.d.ts.map +1 -0
  603. package/dist/pagination.cjs +102 -0
  604. package/dist/pagination.cjs.map +1 -0
  605. package/dist/pagination.js +168 -0
  606. package/dist/pagination.js.map +1 -0
  607. package/dist/popover.cjs +16 -0
  608. package/dist/popover.cjs.map +1 -0
  609. package/dist/popover.js +110 -0
  610. package/dist/popover.js.map +1 -0
  611. package/dist/progress.cjs +51 -0
  612. package/dist/progress.cjs.map +1 -0
  613. package/dist/progress.js +90 -0
  614. package/dist/progress.js.map +1 -0
  615. package/dist/radio-group.cjs +20 -0
  616. package/dist/radio-group.cjs.map +1 -0
  617. package/dist/radio-group.js +104 -0
  618. package/dist/radio-group.js.map +1 -0
  619. package/dist/radio.cjs +16 -0
  620. package/dist/radio.cjs.map +1 -0
  621. package/dist/radio.js +135 -0
  622. package/dist/radio.js.map +1 -0
  623. package/dist/rating.cjs +37 -0
  624. package/dist/rating.cjs.map +1 -0
  625. package/dist/rating.js +123 -0
  626. package/dist/rating.js.map +1 -0
  627. package/dist/select.cjs +77 -0
  628. package/dist/select.cjs.map +1 -0
  629. package/dist/select.js +317 -0
  630. package/dist/select.js.map +1 -0
  631. package/dist/separator.cjs +26 -0
  632. package/dist/separator.cjs.map +1 -0
  633. package/dist/separator.js +46 -0
  634. package/dist/separator.js.map +1 -0
  635. package/dist/sidebar.cjs +69 -0
  636. package/dist/sidebar.cjs.map +1 -0
  637. package/dist/sidebar.js +202 -0
  638. package/dist/sidebar.js.map +1 -0
  639. package/dist/skeleton.cjs +10 -0
  640. package/dist/skeleton.cjs.map +1 -0
  641. package/dist/skeleton.js +56 -0
  642. package/dist/skeleton.js.map +1 -0
  643. package/dist/slider.cjs +24 -0
  644. package/dist/slider.cjs.map +1 -0
  645. package/dist/slider.js +209 -0
  646. package/dist/slider.js.map +1 -0
  647. package/dist/stateit/dist/computed.cjs +2 -0
  648. package/dist/stateit/dist/computed.cjs.map +1 -0
  649. package/dist/stateit/dist/computed.js +65 -0
  650. package/dist/stateit/dist/computed.js.map +1 -0
  651. package/dist/stateit/dist/effect.cjs +2 -0
  652. package/dist/stateit/dist/effect.cjs.map +1 -0
  653. package/dist/stateit/dist/effect.js +53 -0
  654. package/dist/stateit/dist/effect.js.map +1 -0
  655. package/dist/stateit/dist/index.cjs +1 -0
  656. package/dist/stateit/dist/index.js +5 -0
  657. package/dist/stateit/dist/runtime.cjs +2 -0
  658. package/dist/stateit/dist/runtime.cjs.map +1 -0
  659. package/dist/stateit/dist/runtime.js +43 -0
  660. package/dist/stateit/dist/runtime.js.map +1 -0
  661. package/dist/stateit/dist/signal.cjs +2 -0
  662. package/dist/stateit/dist/signal.cjs.map +1 -0
  663. package/dist/stateit/dist/signal.js +27 -0
  664. package/dist/stateit/dist/signal.js.map +1 -0
  665. package/dist/stateit/dist/store.cjs +2 -0
  666. package/dist/stateit/dist/store.cjs.map +1 -0
  667. package/dist/stateit/dist/store.js +17 -0
  668. package/dist/stateit/dist/store.js.map +1 -0
  669. package/dist/stateit/dist/types.cjs +2 -0
  670. package/dist/stateit/dist/types.cjs.map +1 -0
  671. package/dist/stateit/dist/types.js +6 -0
  672. package/dist/stateit/dist/types.js.map +1 -0
  673. package/dist/styles/animation.css +87 -0
  674. package/dist/styles/index.cjs +2 -0
  675. package/dist/styles/index.cjs.map +1 -0
  676. package/dist/styles/index.d.ts +48 -0
  677. package/dist/styles/index.d.ts.map +1 -0
  678. package/dist/styles/index.js +26 -0
  679. package/dist/styles/index.js.map +1 -0
  680. package/dist/styles/layer.css +18 -0
  681. package/dist/styles/mixins/accessibility.css.cjs +15 -0
  682. package/dist/styles/mixins/accessibility.css.cjs.map +1 -0
  683. package/dist/styles/mixins/accessibility.css.d.ts +46 -0
  684. package/dist/styles/mixins/accessibility.css.d.ts.map +1 -0
  685. package/dist/styles/mixins/accessibility.css.js +20 -0
  686. package/dist/styles/mixins/accessibility.css.js.map +1 -0
  687. package/dist/styles/mixins/animation.css.cjs +71 -0
  688. package/dist/styles/mixins/animation.css.cjs.map +1 -0
  689. package/dist/styles/mixins/animation.css.d.ts +22 -0
  690. package/dist/styles/mixins/animation.css.d.ts.map +1 -0
  691. package/dist/styles/mixins/animation.css.js +90 -0
  692. package/dist/styles/mixins/animation.css.js.map +1 -0
  693. package/dist/styles/mixins/shape.css.cjs +72 -0
  694. package/dist/styles/mixins/shape.css.cjs.map +1 -0
  695. package/dist/styles/mixins/shape.css.d.ts +97 -0
  696. package/dist/styles/mixins/shape.css.d.ts.map +1 -0
  697. package/dist/styles/mixins/shape.css.js +104 -0
  698. package/dist/styles/mixins/shape.css.js.map +1 -0
  699. package/dist/styles/mixins/states.css.cjs +18 -0
  700. package/dist/styles/mixins/states.css.cjs.map +1 -0
  701. package/dist/styles/mixins/states.css.d.ts +61 -0
  702. package/dist/styles/mixins/states.css.d.ts.map +1 -0
  703. package/dist/styles/mixins/states.css.js +26 -0
  704. package/dist/styles/mixins/states.css.js.map +1 -0
  705. package/dist/styles/mixins/theme.css.cjs +146 -0
  706. package/dist/styles/mixins/theme.css.cjs.map +1 -0
  707. package/dist/styles/mixins/theme.css.d.ts +93 -0
  708. package/dist/styles/mixins/theme.css.d.ts.map +1 -0
  709. package/dist/styles/mixins/theme.css.js +151 -0
  710. package/dist/styles/mixins/theme.css.js.map +1 -0
  711. package/dist/styles/mixins/variants.css.cjs +84 -0
  712. package/dist/styles/mixins/variants.css.cjs.map +1 -0
  713. package/dist/styles/mixins/variants.css.d.ts +22 -0
  714. package/dist/styles/mixins/variants.css.d.ts.map +1 -0
  715. package/dist/styles/mixins/variants.css.js +89 -0
  716. package/dist/styles/mixins/variants.css.js.map +1 -0
  717. package/dist/styles/preflight.css +237 -0
  718. package/dist/styles/styles.css +5 -0
  719. package/dist/styles/theme.css +457 -0
  720. package/dist/switch.cjs +16 -0
  721. package/dist/switch.cjs.map +1 -0
  722. package/dist/switch.js +82 -0
  723. package/dist/switch.js.map +1 -0
  724. package/dist/tab-item.cjs +17 -0
  725. package/dist/tab-item.cjs.map +1 -0
  726. package/dist/tab-item.js +57 -0
  727. package/dist/tab-item.js.map +1 -0
  728. package/dist/tab-panel.cjs +14 -0
  729. package/dist/tab-panel.cjs.map +1 -0
  730. package/dist/tab-panel.js +51 -0
  731. package/dist/tab-panel.js.map +1 -0
  732. package/dist/table.cjs +2 -0
  733. package/dist/table.cjs.map +1 -0
  734. package/dist/table.js +101 -0
  735. package/dist/table.js.map +1 -0
  736. package/dist/tabs.cjs +17 -0
  737. package/dist/tabs.cjs.map +1 -0
  738. package/dist/tabs.js +98 -0
  739. package/dist/tabs.js.map +1 -0
  740. package/dist/text.cjs +2 -0
  741. package/dist/text.cjs.map +1 -0
  742. package/dist/text.js +30 -0
  743. package/dist/text.js.map +1 -0
  744. package/dist/textarea.cjs +16 -0
  745. package/dist/textarea.cjs.map +1 -0
  746. package/dist/textarea.js +122 -0
  747. package/dist/textarea.js.map +1 -0
  748. package/dist/toast.cjs +63 -0
  749. package/dist/toast.cjs.map +1 -0
  750. package/dist/toast.js +221 -0
  751. package/dist/toast.js.map +1 -0
  752. package/dist/tooltip.cjs +15 -0
  753. package/dist/tooltip.cjs.map +1 -0
  754. package/dist/tooltip.js +111 -0
  755. package/dist/tooltip.js.map +1 -0
  756. package/dist/types/index.d.ts +7 -0
  757. package/dist/types/index.d.ts.map +1 -0
  758. package/dist/types/shared.d.ts +120 -0
  759. package/dist/types/shared.d.ts.map +1 -0
  760. package/dist/utils/animation.cjs +2 -0
  761. package/dist/utils/animation.cjs.map +1 -0
  762. package/dist/utils/animation.d.ts +2 -0
  763. package/dist/utils/animation.d.ts.map +1 -0
  764. package/dist/utils/animation.js +29 -0
  765. package/dist/utils/animation.js.map +1 -0
  766. package/dist/utils/background-lock.cjs +2 -0
  767. package/dist/utils/background-lock.cjs.map +1 -0
  768. package/dist/utils/background-lock.d.ts +20 -0
  769. package/dist/utils/background-lock.d.ts.map +1 -0
  770. package/dist/utils/background-lock.js +21 -0
  771. package/dist/utils/background-lock.js.map +1 -0
  772. package/dist/utils/index.cjs +1 -0
  773. package/dist/utils/index.d.ts +4 -0
  774. package/dist/utils/index.d.ts.map +1 -0
  775. package/dist/utils/index.js +3 -0
  776. package/dist/utils/use-overlay.cjs +2 -0
  777. package/dist/utils/use-overlay.cjs.map +1 -0
  778. package/dist/utils/use-overlay.d.ts +26 -0
  779. package/dist/utils/use-overlay.d.ts.map +1 -0
  780. package/dist/utils/use-overlay.js +34 -0
  781. package/dist/utils/use-overlay.js.map +1 -0
  782. package/dist/virtualit/dist/dom/dom.cjs +2 -0
  783. package/dist/virtualit/dist/dom/dom.cjs.map +1 -0
  784. package/dist/virtualit/dist/dom/dom.js +47 -0
  785. package/dist/virtualit/dist/dom/dom.js.map +1 -0
  786. package/dist/virtualit/dist/dom.cjs +1 -0
  787. package/dist/virtualit/dist/dom.js +2 -0
  788. package/dist/virtualit/dist/virtualit.cjs +2 -0
  789. package/dist/virtualit/dist/virtualit.cjs.map +1 -0
  790. package/dist/virtualit/dist/virtualit.js +129 -0
  791. package/dist/virtualit/dist/virtualit.js.map +1 -0
  792. package/package.json +282 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.cjs","names":[],"sources":["../src/inputs/radio/radio.ts"],"sourcesContent":["import { computed, defineComponent, defineField, html, inject, signal, watch } from '@vielzeug/craftit';\nimport { useA11yControl, createCheckableControl } from '@vielzeug/craftit/labs';\n\nimport type { CheckableProps, DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, formControlMixins, sizeVariantMixin } from '../../styles';\nimport { RADIO_GROUP_CTX } from '../radio-group/radio-group';\nimport { CONTROL_SIZE_PRESET } from '../shared/design-presets';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport componentStyles from './radio.css?inline';\n\n/** Radio component properties */\n\nexport type BitRadioEvents = {\n change: { checked: boolean; fieldValue: string; originalEvent?: Event; value: boolean };\n};\n\nexport type BitRadioProps = CheckableProps &\n ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Error message (marks field as invalid) */\n error?: string;\n /** Helper text displayed below the radio */\n helper?: string;\n };\n\n/**\n * A customizable radio button component for mutually exclusive selections.\n *\n * @element bit-radio\n *\n * @attr {boolean} checked - Checked state\n * @attr {boolean} disabled - Disable radio interaction\n * @attr {string} value - Field value (required for radio groups)\n * @attr {string} name - Form field name (required for radio groups)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Radio size: 'sm' | 'md' | 'lg'\n * @attr {string} error - Error message (marks field as invalid)\n * @attr {string} helper - Helper text displayed below the radio\n *\n * @fires change - Emitted when radio is selected. detail: { value: boolean, checked: boolean, fieldValue: string, originalEvent?: Event }\n *\n * @slot - Radio button label text\n *\n * @part radio - The radio wrapper element\n * @part circle - The visual radio circle\n * @part label - The label element\n * @part helper-text - The helper/error text element\n */\nexport const RADIO_TAG = defineComponent<BitRadioProps, BitRadioEvents>({\n formAssociated: true,\n props: {\n checked: { default: false },\n color: { default: undefined },\n disabled: { default: false },\n error: { default: '' },\n helper: { default: '' },\n name: { default: '' },\n size: { default: undefined },\n value: { default: '' },\n },\n setup({ emit, host, props, reflect }) {\n const groupCtx = inject(RADIO_GROUP_CTX, undefined);\n const formCtx = inject(FORM_CTX, undefined);\n\n const effectiveName = computed(() => groupCtx?.name.value || props.name.value || '');\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveDisabled = computed(() => Boolean(groupCtx?.disabled.value || props.disabled.value));\n\n mountFormContextSync(host, formCtx, props);\n\n // Local signal — source of truth for checked state.\n // Driven by group context when inside a radio-group, otherwise by the checked prop.\n const checkedSignal = signal(Boolean(props.checked.value));\n\n if (groupCtx) {\n watch(\n computed(() => groupCtx.value.value === props.value.value),\n (isChecked) => {\n checkedSignal.value = isChecked;\n },\n { immediate: true },\n );\n } else {\n watch(\n props.checked,\n (v) => {\n checkedSignal.value = Boolean(v);\n },\n { immediate: true },\n );\n }\n\n const control = createCheckableControl({\n checked: checkedSignal,\n disabled: props.disabled,\n onToggle: (e) => {\n emit('change', {\n checked: control.checked.value,\n fieldValue: props.value.value ?? '',\n originalEvent: e,\n value: control.checked.value,\n });\n },\n value: props.value,\n });\n\n defineField(\n {\n disabled: effectiveDisabled,\n toFormValue: (v: string | null) => v,\n value: computed(() => (checkedSignal.value ? (props.value.value ?? '') : null)),\n },\n {\n onReset: () => {\n checkedSignal.value = Boolean(props.checked.value);\n },\n },\n );\n\n const getRadioGroup = (): HTMLElement[] => {\n const radioName = effectiveName.value;\n\n if (!radioName) return [];\n\n return Array.from(document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`)).filter(\n (r) => !r.hasAttribute('disabled'),\n );\n };\n\n const a11y = useA11yControl(host, {\n checked: () => (control.checked.value ? 'true' : 'false'),\n helperText: () => props.error.value || props.helper.value,\n helperTone: () => (props.error.value ? 'error' : 'default'),\n invalid: () => !!props.error.value,\n role: 'radio',\n });\n\n reflect({\n checked: () => control.checked.value,\n classMap: () => ({\n 'is-checked': control.checked.value,\n 'is-disabled': effectiveDisabled.value,\n }),\n color: () => effectiveColor.value,\n disabled: () => (effectiveDisabled.value ? true : undefined),\n name: () => effectiveName.value || undefined,\n onClick: (e: Event) => {\n if (effectiveDisabled.value) return;\n\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', e);\n } else {\n // For non-grouped radios, require a name attribute\n // (radios should be part of a group, either via radio-group or via name)\n if (!effectiveName.value) return;\n\n // Only toggle if not already checked\n // (radio buttons can only be checked, never unchecked by clicking)\n if (!control.checked.value) {\n // Uncheck all other radios with the same name\n const radioName = props.name.value;\n const allRadios = document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`);\n\n allRadios.forEach((radio) => {\n if (radio !== host) {\n radio.removeAttribute('checked');\n }\n });\n\n control.toggle(e);\n }\n }\n },\n onKeydown: (e: Event) => {\n const ke = e as KeyboardEvent;\n const radios = getRadioGroup();\n\n if (radios.length === 0) return;\n\n const currentIndex = radios.indexOf(host);\n\n if (currentIndex === -1) return;\n\n if (ke.key === ' ' || ke.key === 'Enter') {\n ke.preventDefault();\n\n if (!control.checked.value) {\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', ke);\n } else {\n control.toggle(ke);\n }\n }\n } else if (ke.key === 'ArrowDown' || ke.key === 'ArrowRight') {\n ke.preventDefault();\n\n const nextIndex = (currentIndex + 1) % radios.length;\n const nextRadio = radios[nextIndex];\n\n nextRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(nextRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n nextRadio.click();\n }\n } else if (ke.key === 'ArrowUp' || ke.key === 'ArrowLeft') {\n ke.preventDefault();\n\n const prevIndex = currentIndex === 0 ? radios.length - 1 : currentIndex - 1;\n const prevRadio = radios[prevIndex];\n\n prevRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(prevRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n prevRadio.click();\n }\n }\n },\n size: () => effectiveSize.value,\n tabindex: () => {\n if (effectiveDisabled.value) return undefined;\n\n return control.checked.value ? 0 : -1;\n },\n });\n\n return html`\n <div class=\"radio-wrapper\" part=\"radio\">\n <div class=\"circle\" part=\"circle\">\n <div class=\"dot\" part=\"dot\"></div>\n </div>\n </div>\n <span class=\"label\" part=\"label\" data-a11y-label id=\"${a11y.labelId}\"><slot></slot></span>\n <div\n class=\"helper-text\"\n part=\"helper-text\"\n data-a11y-helper\n id=\"${a11y.helperId}\"\n aria-live=\"polite\"\n hidden></div>\n `;\n },\n styles: [...formControlMixins, coarsePointerMixin, sizeVariantMixin(CONTROL_SIZE_PRESET), componentStyles],\n tag: 'bit-radio',\n});\n"],"mappings":"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"}
package/dist/radio.js ADDED
@@ -0,0 +1,135 @@
1
+ import { coarsePointerMixin as e } from "./styles/mixins/accessibility.css.js";
2
+ import { sizeVariantMixin as t } from "./styles/mixins/shape.css.js";
3
+ import { formControlMixins as n } from "./styles/index.js";
4
+ import { r } from "./craftit/dist/labs/a11y.js";
5
+ import { t as i } from "./craftit/dist/labs/selectable.js";
6
+ import "./craftit/dist/labs.js";
7
+ import { FORM_CTX as a } from "./inputs/shared/form-context.js";
8
+ import { mountFormContextSync as o } from "./inputs/shared/dom-sync/form-context.js";
9
+ import "./inputs/shared/dom-sync/index.js";
10
+ import { CONTROL_SIZE_PRESET as s } from "./inputs/shared/design-presets.js";
11
+ import { RADIO_GROUP_CTX as c } from "./radio-group.js";
12
+ import l from "./inputs/radio/radio.css?inline.js";
13
+ import { computed as u, defineComponent as d, defineField as f, html as p, inject as m, signal as h, watch as g } from "@vielzeug/craftit";
14
+ //#region src/inputs/radio/radio.ts
15
+ var _ = d({
16
+ formAssociated: !0,
17
+ props: {
18
+ checked: { default: !1 },
19
+ color: { default: void 0 },
20
+ disabled: { default: !1 },
21
+ error: { default: "" },
22
+ helper: { default: "" },
23
+ name: { default: "" },
24
+ size: { default: void 0 },
25
+ value: { default: "" }
26
+ },
27
+ setup({ emit: e, host: t, props: n, reflect: s }) {
28
+ let l = m(c, void 0), d = m(a, void 0), _ = u(() => l?.name.value || n.name.value || ""), v = u(() => l?.size.value ?? n.size.value), y = u(() => l?.color.value ?? n.color.value), b = u(() => !!(l?.disabled.value || n.disabled.value));
29
+ o(t, d, n);
30
+ let x = h(!!n.checked.value);
31
+ l ? g(u(() => l.value.value === n.value.value), (e) => {
32
+ x.value = e;
33
+ }, { immediate: !0 }) : g(n.checked, (e) => {
34
+ x.value = !!e;
35
+ }, { immediate: !0 });
36
+ let S = i({
37
+ checked: x,
38
+ disabled: n.disabled,
39
+ onToggle: (t) => {
40
+ e("change", {
41
+ checked: S.checked.value,
42
+ fieldValue: n.value.value ?? "",
43
+ originalEvent: t,
44
+ value: S.checked.value
45
+ });
46
+ },
47
+ value: n.value
48
+ });
49
+ f({
50
+ disabled: b,
51
+ toFormValue: (e) => e,
52
+ value: u(() => x.value ? n.value.value ?? "" : null)
53
+ }, { onReset: () => {
54
+ x.value = !!n.checked.value;
55
+ } });
56
+ let C = () => {
57
+ let e = _.value;
58
+ return e ? Array.from(document.querySelectorAll(`bit-radio[name="${e}"]`)).filter((e) => !e.hasAttribute("disabled")) : [];
59
+ }, w = r(t, {
60
+ checked: () => S.checked.value ? "true" : "false",
61
+ helperText: () => n.error.value || n.helper.value,
62
+ helperTone: () => n.error.value ? "error" : "default",
63
+ invalid: () => !!n.error.value,
64
+ role: "radio"
65
+ });
66
+ return s({
67
+ checked: () => S.checked.value,
68
+ classMap: () => ({
69
+ "is-checked": S.checked.value,
70
+ "is-disabled": b.value
71
+ }),
72
+ color: () => y.value,
73
+ disabled: () => b.value ? !0 : void 0,
74
+ name: () => _.value || void 0,
75
+ onClick: (e) => {
76
+ if (!b.value) if (l) l.select(n.value.value ?? "", e);
77
+ else {
78
+ if (!_.value) return;
79
+ if (!S.checked.value) {
80
+ let r = n.name.value;
81
+ document.querySelectorAll(`bit-radio[name="${r}"]`).forEach((e) => {
82
+ e !== t && e.removeAttribute("checked");
83
+ }), S.toggle(e);
84
+ }
85
+ }
86
+ },
87
+ onKeydown: (e) => {
88
+ let r = e, i = C();
89
+ if (i.length === 0) return;
90
+ let a = i.indexOf(t);
91
+ if (a !== -1) {
92
+ if (r.key === " " || r.key === "Enter") r.preventDefault(), S.checked.value || (l ? l.select(n.value.value ?? "", r) : S.toggle(r));
93
+ else if (r.key === "ArrowDown" || r.key === "ArrowRight") {
94
+ r.preventDefault();
95
+ let e = i[(a + 1) % i.length];
96
+ e.focus(), l ? l.select(e.getAttribute("value") ?? "") : e.click();
97
+ } else if (r.key === "ArrowUp" || r.key === "ArrowLeft") {
98
+ r.preventDefault();
99
+ let e = i[a === 0 ? i.length - 1 : a - 1];
100
+ e.focus(), l ? l.select(e.getAttribute("value") ?? "") : e.click();
101
+ }
102
+ }
103
+ },
104
+ size: () => v.value,
105
+ tabindex: () => {
106
+ if (!b.value) return S.checked.value ? 0 : -1;
107
+ }
108
+ }), p`
109
+ <div class="radio-wrapper" part="radio">
110
+ <div class="circle" part="circle">
111
+ <div class="dot" part="dot"></div>
112
+ </div>
113
+ </div>
114
+ <span class="label" part="label" data-a11y-label id="${w.labelId}"><slot></slot></span>
115
+ <div
116
+ class="helper-text"
117
+ part="helper-text"
118
+ data-a11y-helper
119
+ id="${w.helperId}"
120
+ aria-live="polite"
121
+ hidden></div>
122
+ `;
123
+ },
124
+ styles: [
125
+ ...n,
126
+ e,
127
+ t(s),
128
+ l
129
+ ],
130
+ tag: "bit-radio"
131
+ });
132
+ //#endregion
133
+ export { _ as RADIO_TAG };
134
+
135
+ //# sourceMappingURL=radio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio.js","names":[],"sources":["../src/inputs/radio/radio.ts"],"sourcesContent":["import { computed, defineComponent, defineField, html, inject, signal, watch } from '@vielzeug/craftit';\nimport { useA11yControl, createCheckableControl } from '@vielzeug/craftit/labs';\n\nimport type { CheckableProps, DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, formControlMixins, sizeVariantMixin } from '../../styles';\nimport { RADIO_GROUP_CTX } from '../radio-group/radio-group';\nimport { CONTROL_SIZE_PRESET } from '../shared/design-presets';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport componentStyles from './radio.css?inline';\n\n/** Radio component properties */\n\nexport type BitRadioEvents = {\n change: { checked: boolean; fieldValue: string; originalEvent?: Event; value: boolean };\n};\n\nexport type BitRadioProps = CheckableProps &\n ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Error message (marks field as invalid) */\n error?: string;\n /** Helper text displayed below the radio */\n helper?: string;\n };\n\n/**\n * A customizable radio button component for mutually exclusive selections.\n *\n * @element bit-radio\n *\n * @attr {boolean} checked - Checked state\n * @attr {boolean} disabled - Disable radio interaction\n * @attr {string} value - Field value (required for radio groups)\n * @attr {string} name - Form field name (required for radio groups)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Radio size: 'sm' | 'md' | 'lg'\n * @attr {string} error - Error message (marks field as invalid)\n * @attr {string} helper - Helper text displayed below the radio\n *\n * @fires change - Emitted when radio is selected. detail: { value: boolean, checked: boolean, fieldValue: string, originalEvent?: Event }\n *\n * @slot - Radio button label text\n *\n * @part radio - The radio wrapper element\n * @part circle - The visual radio circle\n * @part label - The label element\n * @part helper-text - The helper/error text element\n */\nexport const RADIO_TAG = defineComponent<BitRadioProps, BitRadioEvents>({\n formAssociated: true,\n props: {\n checked: { default: false },\n color: { default: undefined },\n disabled: { default: false },\n error: { default: '' },\n helper: { default: '' },\n name: { default: '' },\n size: { default: undefined },\n value: { default: '' },\n },\n setup({ emit, host, props, reflect }) {\n const groupCtx = inject(RADIO_GROUP_CTX, undefined);\n const formCtx = inject(FORM_CTX, undefined);\n\n const effectiveName = computed(() => groupCtx?.name.value || props.name.value || '');\n const effectiveSize = computed(() => groupCtx?.size.value ?? props.size.value);\n const effectiveColor = computed(() => groupCtx?.color.value ?? props.color.value);\n const effectiveDisabled = computed(() => Boolean(groupCtx?.disabled.value || props.disabled.value));\n\n mountFormContextSync(host, formCtx, props);\n\n // Local signal — source of truth for checked state.\n // Driven by group context when inside a radio-group, otherwise by the checked prop.\n const checkedSignal = signal(Boolean(props.checked.value));\n\n if (groupCtx) {\n watch(\n computed(() => groupCtx.value.value === props.value.value),\n (isChecked) => {\n checkedSignal.value = isChecked;\n },\n { immediate: true },\n );\n } else {\n watch(\n props.checked,\n (v) => {\n checkedSignal.value = Boolean(v);\n },\n { immediate: true },\n );\n }\n\n const control = createCheckableControl({\n checked: checkedSignal,\n disabled: props.disabled,\n onToggle: (e) => {\n emit('change', {\n checked: control.checked.value,\n fieldValue: props.value.value ?? '',\n originalEvent: e,\n value: control.checked.value,\n });\n },\n value: props.value,\n });\n\n defineField(\n {\n disabled: effectiveDisabled,\n toFormValue: (v: string | null) => v,\n value: computed(() => (checkedSignal.value ? (props.value.value ?? '') : null)),\n },\n {\n onReset: () => {\n checkedSignal.value = Boolean(props.checked.value);\n },\n },\n );\n\n const getRadioGroup = (): HTMLElement[] => {\n const radioName = effectiveName.value;\n\n if (!radioName) return [];\n\n return Array.from(document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`)).filter(\n (r) => !r.hasAttribute('disabled'),\n );\n };\n\n const a11y = useA11yControl(host, {\n checked: () => (control.checked.value ? 'true' : 'false'),\n helperText: () => props.error.value || props.helper.value,\n helperTone: () => (props.error.value ? 'error' : 'default'),\n invalid: () => !!props.error.value,\n role: 'radio',\n });\n\n reflect({\n checked: () => control.checked.value,\n classMap: () => ({\n 'is-checked': control.checked.value,\n 'is-disabled': effectiveDisabled.value,\n }),\n color: () => effectiveColor.value,\n disabled: () => (effectiveDisabled.value ? true : undefined),\n name: () => effectiveName.value || undefined,\n onClick: (e: Event) => {\n if (effectiveDisabled.value) return;\n\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', e);\n } else {\n // For non-grouped radios, require a name attribute\n // (radios should be part of a group, either via radio-group or via name)\n if (!effectiveName.value) return;\n\n // Only toggle if not already checked\n // (radio buttons can only be checked, never unchecked by clicking)\n if (!control.checked.value) {\n // Uncheck all other radios with the same name\n const radioName = props.name.value;\n const allRadios = document.querySelectorAll<HTMLElement>(`bit-radio[name=\"${radioName}\"]`);\n\n allRadios.forEach((radio) => {\n if (radio !== host) {\n radio.removeAttribute('checked');\n }\n });\n\n control.toggle(e);\n }\n }\n },\n onKeydown: (e: Event) => {\n const ke = e as KeyboardEvent;\n const radios = getRadioGroup();\n\n if (radios.length === 0) return;\n\n const currentIndex = radios.indexOf(host);\n\n if (currentIndex === -1) return;\n\n if (ke.key === ' ' || ke.key === 'Enter') {\n ke.preventDefault();\n\n if (!control.checked.value) {\n if (groupCtx) {\n groupCtx.select(props.value.value ?? '', ke);\n } else {\n control.toggle(ke);\n }\n }\n } else if (ke.key === 'ArrowDown' || ke.key === 'ArrowRight') {\n ke.preventDefault();\n\n const nextIndex = (currentIndex + 1) % radios.length;\n const nextRadio = radios[nextIndex];\n\n nextRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(nextRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n nextRadio.click();\n }\n } else if (ke.key === 'ArrowUp' || ke.key === 'ArrowLeft') {\n ke.preventDefault();\n\n const prevIndex = currentIndex === 0 ? radios.length - 1 : currentIndex - 1;\n const prevRadio = radios[prevIndex];\n\n prevRadio.focus();\n\n if (groupCtx) {\n groupCtx.select(prevRadio.getAttribute('value') ?? '');\n } else {\n // For non-grouped radios, trigger the select on the focused radio\n prevRadio.click();\n }\n }\n },\n size: () => effectiveSize.value,\n tabindex: () => {\n if (effectiveDisabled.value) return undefined;\n\n return control.checked.value ? 0 : -1;\n },\n });\n\n return html`\n <div class=\"radio-wrapper\" part=\"radio\">\n <div class=\"circle\" part=\"circle\">\n <div class=\"dot\" part=\"dot\"></div>\n </div>\n </div>\n <span class=\"label\" part=\"label\" data-a11y-label id=\"${a11y.labelId}\"><slot></slot></span>\n <div\n class=\"helper-text\"\n part=\"helper-text\"\n data-a11y-helper\n id=\"${a11y.helperId}\"\n aria-live=\"polite\"\n hidden></div>\n `;\n },\n styles: [...formControlMixins, coarsePointerMixin, sizeVariantMixin(CONTROL_SIZE_PRESET), componentStyles],\n tag: 'bit-radio',\n});\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./styles/mixins/accessibility.css.cjs`),t=require(`./styles/mixins/shape.css.cjs`),n=require(`./styles/mixins/theme.css.cjs`);require(`./styles/index.cjs`);const r=require(`./inputs/shared/form-context.cjs`),i=require(`./inputs/shared/dom-sync/form-context.cjs`);require(`./inputs/shared/dom-sync/index.cjs`);const a=require(`./inputs/shared/validation/index.cjs`),o=require(`./inputs/rating/rating.css?inline.cjs`);let s=require(`@vielzeug/craftit`);var c=`M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z`,l=(0,s.defineComponent)({formAssociated:!0,props:{color:(0,s.typed)(void 0),disabled:(0,s.typed)(!1),label:(0,s.typed)(`Rating`),max:(0,s.typed)(5),name:(0,s.typed)(void 0),readonly:(0,s.typed)(!1),size:(0,s.typed)(void 0),value:(0,s.typed)(0)},setup({emit:e,host:t,props:n}){let o=(0,s.inject)(r.FORM_CTX,void 0);i.mountFormContextSync(t,o,n);let l=(0,s.computed)(()=>{let e=Math.max(1,Number(n.max.value)||5),t=Number(n.value.value);return Math.min(e,Math.max(0,Number.isFinite(t)?t:0))}),{triggerValidation:u}=a.createFieldValidation(o,(0,s.defineField)({disabled:(0,s.computed)(()=>!!n.disabled.value),value:(0,s.computed)(()=>String(l.value||0))},{onReset:()=>{t.removeAttribute(`value`)}})),d=(0,s.signal)(null),f=(0,s.computed)(()=>d.value??l.value);function p(e){let n=t.shadowRoot?.querySelector(`.sparkle-layer`),r=t.shadowRoot?.querySelector(`[data-star="${e}"]`);if(!n||!r)return;let i=r.offsetLeft+r.offsetWidth/2,a=r.offsetTop+r.offsetHeight/2;for(let e=0;e<10;e++){let t=document.createElement(`span`),r=360/10*e+(Math.random()*30-15),o=18+Math.random()*20,s=3+Math.random()*4,c=380+Math.random()*220;t.className=`sparkle`,t.style.cssText=[`left:${i}px`,`top:${a}px`,`--_angle:${r}deg`,`--_dist:${o}px`,`width:${s}px`,`height:${s}px`,`--_dur:${c}ms`,`animation-delay:${Math.random()*60}ms`].join(`;`),n.appendChild(t),t.addEventListener(`animationend`,()=>t.remove(),{once:!0})}}function m(t,r){if(n.readonly.value||n.disabled.value)return;let i=Math.max(1,Number(n.max.value)||5),a=Math.min(i,Math.max(0,t));a!==l.value&&(n.value.value=a,e(`change`,{originalEvent:r,value:a}),u(`change`),p(a))}function h(e,r){let i=Number(n.max.value)||5;e.key===`ArrowRight`||e.key===`ArrowUp`?(e.preventDefault(),m(Math.min(i,r+1),e),(t.shadowRoot?.querySelector(`[data-star="${Math.min(i,r+1)}"]`))?.focus()):(e.key===`ArrowLeft`||e.key===`ArrowDown`)&&(e.preventDefault(),m(Math.max(1,r-1),e),(t.shadowRoot?.querySelector(`[data-star="${Math.max(1,r-1)}"]`))?.focus())}let g=(0,s.computed)(()=>{let e=Number(n.max.value)||5;return Array.from({length:e},(e,t)=>t+1)});return s.html`
2
+ <div
3
+ class="stars"
4
+ part="stars"
5
+ role="radiogroup"
6
+ :aria-label="${()=>n.label.value}"
7
+ :aria-required="${()=>null}">
8
+ ${()=>g.value.map(e=>s.html`<button
9
+ class="star-btn"
10
+ part="star"
11
+ type="button"
12
+ role="radio"
13
+ :aria-label="${()=>`${e} ${e===1?`star`:`stars`}`}"
14
+ :aria-checked="${()=>String(e===l.value)}"
15
+ :data-star="${e}"
16
+ ?data-filled="${()=>e<=f.value}"
17
+ :disabled="${()=>n.disabled.value||n.readonly.value||null}"
18
+ @click="${t=>m(e,t)}"
19
+ @pointerenter="${()=>{!n.readonly.value&&!n.disabled.value&&(d.value=e)}}"
20
+ @pointerleave="${()=>{d.value=null}}"
21
+ @keydown="${t=>h(t,e)}">
22
+ <svg
23
+ xmlns="http://www.w3.org/2000/svg"
24
+ viewBox="0 0 24 24"
25
+ aria-hidden="true"
26
+ fill="${()=>e<=f.value?`currentColor`:`none`}"
27
+ stroke="currentColor"
28
+ stroke-width="${()=>e<=f.value?0:1.5}"
29
+ stroke-linecap="round"
30
+ stroke-linejoin="round">
31
+ <path d="${c}" />
32
+ </svg>
33
+ </button>`)}
34
+ <div class="sparkle-layer"></div>
35
+ </div>
36
+ `},styles:[n.colorThemeMixin,t.sizeVariantMixin({}),e.coarsePointerMixin,e.reducedMotionMixin,o.default],tag:`bit-rating`});exports.RATING_TAG=l;
37
+ //# sourceMappingURL=rating.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.cjs","names":[],"sources":["../src/inputs/rating/rating.ts"],"sourcesContent":["import { computed, defineComponent, typed, defineField, html, inject, signal } from '@vielzeug/craftit';\n\nimport type { DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, colorThemeMixin, reducedMotionMixin, sizeVariantMixin } from '../../styles';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport { createFieldValidation } from '../shared/validation';\nimport styles from './rating.css?inline';\n\nconst FULL_STAR_PATH = 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z';\n\nexport type BitRatingEvents = {\n change: { originalEvent?: Event; value: number };\n};\n\n/** Rating props */\nexport type BitRatingProps = ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Accessible group label */\n label?: string;\n /** Maximum rating (number of stars) */\n max?: number;\n /** Form field name */\n name?: string;\n /** Make rating read-only */\n readonly?: boolean;\n /** Current rating value */\n value?: number;\n };\n\n/**\n * A star rating input.\n *\n * @element bit-rating\n *\n * @attr {number} value - Current rating value (default: 0)\n * @attr {number} max - Maximum number of stars (default: 5)\n * @attr {boolean} readonly - Read-only display mode\n * @attr {boolean} disabled - Disabled state\n * @attr {string} label - aria-label for the group (default: 'Rating')\n * @attr {string} color - Theme color for filled stars\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} name - Form field name\n *\n * @fires change - Emitted when value changes. detail: { value: number, originalEvent?: Event }\n *\n * @cssprop --rating-star-size - Star diameter\n * @cssprop --rating-color-empty - Empty star color\n * @cssprop --rating-color-filled - Filled star color\n * @cssprop --rating-gap - Gap between stars\n *\n * @example\n * ```html\n * <bit-rating value=\"3\" max=\"5\" color=\"warning\"></bit-rating>\n * ```\n */\nexport const RATING_TAG = defineComponent<BitRatingProps, BitRatingEvents>({\n formAssociated: true,\n props: {\n color: typed<BitRatingProps['color']>(undefined),\n disabled: typed<boolean>(false),\n label: typed<string>('Rating'),\n max: typed<number>(5),\n name: typed<string | undefined>(undefined),\n readonly: typed<boolean>(false),\n size: typed<BitRatingProps['size']>(undefined),\n value: typed<number>(0),\n },\n setup({ emit, host, props }) {\n const formCtx = inject(FORM_CTX, undefined);\n\n mountFormContextSync(host, formCtx, props);\n\n const normalizedValue = computed(() => {\n const max = Math.max(1, Number(props.max.value) || 5);\n const raw = Number(props.value.value);\n const safe = Number.isFinite(raw) ? raw : 0;\n\n return Math.min(max, Math.max(0, safe));\n });\n\n const fd = defineField(\n {\n disabled: computed(() => Boolean(props.disabled.value)),\n value: computed(() => String(normalizedValue.value || 0)),\n },\n {\n onReset: () => {\n host.removeAttribute('value');\n },\n },\n );\n\n const { triggerValidation } = createFieldValidation(formCtx, fd);\n\n const hovered = signal<number | null>(null);\n const displayValue = computed(() => hovered.value ?? normalizedValue.value);\n\n function spawnSparkles(star: number) {\n const layer = host.shadowRoot?.querySelector<HTMLElement>('.sparkle-layer');\n const btn = host.shadowRoot?.querySelector<HTMLElement>(`[data-star=\"${star}\"]`);\n\n if (!layer || !btn) return;\n\n const cx = btn.offsetLeft + btn.offsetWidth / 2;\n const cy = btn.offsetTop + btn.offsetHeight / 2;\n const count = 10;\n\n for (let i = 0; i < count; i++) {\n const p = document.createElement('span');\n const angle = (360 / count) * i + (Math.random() * 30 - 15);\n const dist = 18 + Math.random() * 20;\n const size = 3 + Math.random() * 4;\n const dur = 380 + Math.random() * 220;\n\n p.className = 'sparkle';\n p.style.cssText = [\n `left:${cx}px`,\n `top:${cy}px`,\n `--_angle:${angle}deg`,\n `--_dist:${dist}px`,\n `width:${size}px`,\n `height:${size}px`,\n `--_dur:${dur}ms`,\n `animation-delay:${Math.random() * 60}ms`,\n ].join(';');\n layer.appendChild(p);\n p.addEventListener('animationend', () => p.remove(), { once: true });\n }\n }\n function select(star: number, originalEvent?: Event) {\n if (props.readonly.value || props.disabled.value) return;\n\n const max = Math.max(1, Number(props.max.value) || 5);\n const nextValue = Math.min(max, Math.max(0, star));\n\n if (nextValue === normalizedValue.value) return;\n\n // Write through the reactive prop signal; craftit handles host reflection.\n props.value.value = nextValue;\n emit('change', { originalEvent, value: nextValue });\n triggerValidation('change');\n spawnSparkles(nextValue);\n }\n function handleKeydown(e: KeyboardEvent, star: number) {\n const max = Number(props.max.value) || 5;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n select(Math.min(max, star + 1), e);\n\n const nextBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.min(max, star + 1)}\"]`);\n\n nextBtn?.focus();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n select(Math.max(1, star - 1), e);\n\n const prevBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.max(1, star - 1)}\"]`);\n\n prevBtn?.focus();\n }\n }\n\n const stars = computed(() => {\n const max = Number(props.max.value) || 5;\n\n return Array.from({ length: max }, (_, i) => i + 1);\n });\n\n return html`\n <div\n class=\"stars\"\n part=\"stars\"\n role=\"radiogroup\"\n :aria-label=\"${() => props.label.value}\"\n :aria-required=\"${() => null}\">\n ${() =>\n stars.value.map(\n (star) =>\n html`<button\n class=\"star-btn\"\n part=\"star\"\n type=\"button\"\n role=\"radio\"\n :aria-label=\"${() => `${star} ${star === 1 ? 'star' : 'stars'}`}\"\n :aria-checked=\"${() => String(star === normalizedValue.value)}\"\n :data-star=\"${star}\"\n ?data-filled=\"${() => star <= displayValue.value}\"\n :disabled=\"${() => props.disabled.value || props.readonly.value || null}\"\n @click=\"${(e: Event) => select(star, e)}\"\n @pointerenter=\"${() => {\n if (!props.readonly.value && !props.disabled.value) hovered.value = star;\n }}\"\n @pointerleave=\"${() => {\n hovered.value = null;\n }}\"\n @keydown=\"${(e: KeyboardEvent) => handleKeydown(e, star)}\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n fill=\"${() => (star <= displayValue.value ? 'currentColor' : 'none')}\"\n stroke=\"currentColor\"\n stroke-width=\"${() => (star <= displayValue.value ? 0 : 1.5)}\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"${FULL_STAR_PATH}\" />\n </svg>\n </button>`,\n )}\n <div class=\"sparkle-layer\"></div>\n </div>\n `;\n },\n styles: [colorThemeMixin, sizeVariantMixin({}), coarsePointerMixin, reducedMotionMixin, styles],\n tag: 'bit-rating',\n});\n"],"mappings":"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"}
package/dist/rating.js ADDED
@@ -0,0 +1,123 @@
1
+ import { coarsePointerMixin as e, reducedMotionMixin as t } from "./styles/mixins/accessibility.css.js";
2
+ import { sizeVariantMixin as n } from "./styles/mixins/shape.css.js";
3
+ import { colorThemeMixin as r } from "./styles/mixins/theme.css.js";
4
+ import "./styles/index.js";
5
+ import { FORM_CTX as i } from "./inputs/shared/form-context.js";
6
+ import { mountFormContextSync as a } from "./inputs/shared/dom-sync/form-context.js";
7
+ import "./inputs/shared/dom-sync/index.js";
8
+ import { createFieldValidation as o } from "./inputs/shared/validation/index.js";
9
+ import s from "./inputs/rating/rating.css?inline.js";
10
+ import { computed as c, defineComponent as l, defineField as u, html as d, inject as f, signal as p, typed as m } from "@vielzeug/craftit";
11
+ //#region src/inputs/rating/rating.ts
12
+ var h = "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z", g = l({
13
+ formAssociated: !0,
14
+ props: {
15
+ color: m(void 0),
16
+ disabled: m(!1),
17
+ label: m("Rating"),
18
+ max: m(5),
19
+ name: m(void 0),
20
+ readonly: m(!1),
21
+ size: m(void 0),
22
+ value: m(0)
23
+ },
24
+ setup({ emit: e, host: t, props: n }) {
25
+ let r = f(i, void 0);
26
+ a(t, r, n);
27
+ let s = c(() => {
28
+ let e = Math.max(1, Number(n.max.value) || 5), t = Number(n.value.value);
29
+ return Math.min(e, Math.max(0, Number.isFinite(t) ? t : 0));
30
+ }), { triggerValidation: l } = o(r, u({
31
+ disabled: c(() => !!n.disabled.value),
32
+ value: c(() => String(s.value || 0))
33
+ }, { onReset: () => {
34
+ t.removeAttribute("value");
35
+ } })), m = p(null), g = c(() => m.value ?? s.value);
36
+ function _(e) {
37
+ let n = t.shadowRoot?.querySelector(".sparkle-layer"), r = t.shadowRoot?.querySelector(`[data-star="${e}"]`);
38
+ if (!n || !r) return;
39
+ let i = r.offsetLeft + r.offsetWidth / 2, a = r.offsetTop + r.offsetHeight / 2;
40
+ for (let e = 0; e < 10; e++) {
41
+ let t = document.createElement("span"), r = 360 / 10 * e + (Math.random() * 30 - 15), o = 18 + Math.random() * 20, s = 3 + Math.random() * 4, c = 380 + Math.random() * 220;
42
+ t.className = "sparkle", t.style.cssText = [
43
+ `left:${i}px`,
44
+ `top:${a}px`,
45
+ `--_angle:${r}deg`,
46
+ `--_dist:${o}px`,
47
+ `width:${s}px`,
48
+ `height:${s}px`,
49
+ `--_dur:${c}ms`,
50
+ `animation-delay:${Math.random() * 60}ms`
51
+ ].join(";"), n.appendChild(t), t.addEventListener("animationend", () => t.remove(), { once: !0 });
52
+ }
53
+ }
54
+ function v(t, r) {
55
+ if (n.readonly.value || n.disabled.value) return;
56
+ let i = Math.max(1, Number(n.max.value) || 5), a = Math.min(i, Math.max(0, t));
57
+ a !== s.value && (n.value.value = a, e("change", {
58
+ originalEvent: r,
59
+ value: a
60
+ }), l("change"), _(a));
61
+ }
62
+ function y(e, r) {
63
+ let i = Number(n.max.value) || 5;
64
+ e.key === "ArrowRight" || e.key === "ArrowUp" ? (e.preventDefault(), v(Math.min(i, r + 1), e), (t.shadowRoot?.querySelector(`[data-star="${Math.min(i, r + 1)}"]`))?.focus()) : (e.key === "ArrowLeft" || e.key === "ArrowDown") && (e.preventDefault(), v(Math.max(1, r - 1), e), (t.shadowRoot?.querySelector(`[data-star="${Math.max(1, r - 1)}"]`))?.focus());
65
+ }
66
+ let b = c(() => {
67
+ let e = Number(n.max.value) || 5;
68
+ return Array.from({ length: e }, (e, t) => t + 1);
69
+ });
70
+ return d`
71
+ <div
72
+ class="stars"
73
+ part="stars"
74
+ role="radiogroup"
75
+ :aria-label="${() => n.label.value}"
76
+ :aria-required="${() => null}">
77
+ ${() => b.value.map((e) => d`<button
78
+ class="star-btn"
79
+ part="star"
80
+ type="button"
81
+ role="radio"
82
+ :aria-label="${() => `${e} ${e === 1 ? "star" : "stars"}`}"
83
+ :aria-checked="${() => String(e === s.value)}"
84
+ :data-star="${e}"
85
+ ?data-filled="${() => e <= g.value}"
86
+ :disabled="${() => n.disabled.value || n.readonly.value || null}"
87
+ @click="${(t) => v(e, t)}"
88
+ @pointerenter="${() => {
89
+ !n.readonly.value && !n.disabled.value && (m.value = e);
90
+ }}"
91
+ @pointerleave="${() => {
92
+ m.value = null;
93
+ }}"
94
+ @keydown="${(t) => y(t, e)}">
95
+ <svg
96
+ xmlns="http://www.w3.org/2000/svg"
97
+ viewBox="0 0 24 24"
98
+ aria-hidden="true"
99
+ fill="${() => e <= g.value ? "currentColor" : "none"}"
100
+ stroke="currentColor"
101
+ stroke-width="${() => e <= g.value ? 0 : 1.5}"
102
+ stroke-linecap="round"
103
+ stroke-linejoin="round">
104
+ <path d="${h}" />
105
+ </svg>
106
+ </button>`)}
107
+ <div class="sparkle-layer"></div>
108
+ </div>
109
+ `;
110
+ },
111
+ styles: [
112
+ r,
113
+ n({}),
114
+ e,
115
+ t,
116
+ s
117
+ ],
118
+ tag: "bit-rating"
119
+ });
120
+ //#endregion
121
+ export { g as RATING_TAG };
122
+
123
+ //# sourceMappingURL=rating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rating.js","names":[],"sources":["../src/inputs/rating/rating.ts"],"sourcesContent":["import { computed, defineComponent, typed, defineField, html, inject, signal } from '@vielzeug/craftit';\n\nimport type { DisablableProps, SizableProps, ThemableProps } from '../../types';\n\nimport { coarsePointerMixin, colorThemeMixin, reducedMotionMixin, sizeVariantMixin } from '../../styles';\nimport { mountFormContextSync } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport { createFieldValidation } from '../shared/validation';\nimport styles from './rating.css?inline';\n\nconst FULL_STAR_PATH = 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z';\n\nexport type BitRatingEvents = {\n change: { originalEvent?: Event; value: number };\n};\n\n/** Rating props */\nexport type BitRatingProps = ThemableProps &\n SizableProps &\n DisablableProps & {\n /** Accessible group label */\n label?: string;\n /** Maximum rating (number of stars) */\n max?: number;\n /** Form field name */\n name?: string;\n /** Make rating read-only */\n readonly?: boolean;\n /** Current rating value */\n value?: number;\n };\n\n/**\n * A star rating input.\n *\n * @element bit-rating\n *\n * @attr {number} value - Current rating value (default: 0)\n * @attr {number} max - Maximum number of stars (default: 5)\n * @attr {boolean} readonly - Read-only display mode\n * @attr {boolean} disabled - Disabled state\n * @attr {string} label - aria-label for the group (default: 'Rating')\n * @attr {string} color - Theme color for filled stars\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} name - Form field name\n *\n * @fires change - Emitted when value changes. detail: { value: number, originalEvent?: Event }\n *\n * @cssprop --rating-star-size - Star diameter\n * @cssprop --rating-color-empty - Empty star color\n * @cssprop --rating-color-filled - Filled star color\n * @cssprop --rating-gap - Gap between stars\n *\n * @example\n * ```html\n * <bit-rating value=\"3\" max=\"5\" color=\"warning\"></bit-rating>\n * ```\n */\nexport const RATING_TAG = defineComponent<BitRatingProps, BitRatingEvents>({\n formAssociated: true,\n props: {\n color: typed<BitRatingProps['color']>(undefined),\n disabled: typed<boolean>(false),\n label: typed<string>('Rating'),\n max: typed<number>(5),\n name: typed<string | undefined>(undefined),\n readonly: typed<boolean>(false),\n size: typed<BitRatingProps['size']>(undefined),\n value: typed<number>(0),\n },\n setup({ emit, host, props }) {\n const formCtx = inject(FORM_CTX, undefined);\n\n mountFormContextSync(host, formCtx, props);\n\n const normalizedValue = computed(() => {\n const max = Math.max(1, Number(props.max.value) || 5);\n const raw = Number(props.value.value);\n const safe = Number.isFinite(raw) ? raw : 0;\n\n return Math.min(max, Math.max(0, safe));\n });\n\n const fd = defineField(\n {\n disabled: computed(() => Boolean(props.disabled.value)),\n value: computed(() => String(normalizedValue.value || 0)),\n },\n {\n onReset: () => {\n host.removeAttribute('value');\n },\n },\n );\n\n const { triggerValidation } = createFieldValidation(formCtx, fd);\n\n const hovered = signal<number | null>(null);\n const displayValue = computed(() => hovered.value ?? normalizedValue.value);\n\n function spawnSparkles(star: number) {\n const layer = host.shadowRoot?.querySelector<HTMLElement>('.sparkle-layer');\n const btn = host.shadowRoot?.querySelector<HTMLElement>(`[data-star=\"${star}\"]`);\n\n if (!layer || !btn) return;\n\n const cx = btn.offsetLeft + btn.offsetWidth / 2;\n const cy = btn.offsetTop + btn.offsetHeight / 2;\n const count = 10;\n\n for (let i = 0; i < count; i++) {\n const p = document.createElement('span');\n const angle = (360 / count) * i + (Math.random() * 30 - 15);\n const dist = 18 + Math.random() * 20;\n const size = 3 + Math.random() * 4;\n const dur = 380 + Math.random() * 220;\n\n p.className = 'sparkle';\n p.style.cssText = [\n `left:${cx}px`,\n `top:${cy}px`,\n `--_angle:${angle}deg`,\n `--_dist:${dist}px`,\n `width:${size}px`,\n `height:${size}px`,\n `--_dur:${dur}ms`,\n `animation-delay:${Math.random() * 60}ms`,\n ].join(';');\n layer.appendChild(p);\n p.addEventListener('animationend', () => p.remove(), { once: true });\n }\n }\n function select(star: number, originalEvent?: Event) {\n if (props.readonly.value || props.disabled.value) return;\n\n const max = Math.max(1, Number(props.max.value) || 5);\n const nextValue = Math.min(max, Math.max(0, star));\n\n if (nextValue === normalizedValue.value) return;\n\n // Write through the reactive prop signal; craftit handles host reflection.\n props.value.value = nextValue;\n emit('change', { originalEvent, value: nextValue });\n triggerValidation('change');\n spawnSparkles(nextValue);\n }\n function handleKeydown(e: KeyboardEvent, star: number) {\n const max = Number(props.max.value) || 5;\n\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n select(Math.min(max, star + 1), e);\n\n const nextBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.min(max, star + 1)}\"]`);\n\n nextBtn?.focus();\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n select(Math.max(1, star - 1), e);\n\n const prevBtn = host.shadowRoot?.querySelector<HTMLButtonElement>(`[data-star=\"${Math.max(1, star - 1)}\"]`);\n\n prevBtn?.focus();\n }\n }\n\n const stars = computed(() => {\n const max = Number(props.max.value) || 5;\n\n return Array.from({ length: max }, (_, i) => i + 1);\n });\n\n return html`\n <div\n class=\"stars\"\n part=\"stars\"\n role=\"radiogroup\"\n :aria-label=\"${() => props.label.value}\"\n :aria-required=\"${() => null}\">\n ${() =>\n stars.value.map(\n (star) =>\n html`<button\n class=\"star-btn\"\n part=\"star\"\n type=\"button\"\n role=\"radio\"\n :aria-label=\"${() => `${star} ${star === 1 ? 'star' : 'stars'}`}\"\n :aria-checked=\"${() => String(star === normalizedValue.value)}\"\n :data-star=\"${star}\"\n ?data-filled=\"${() => star <= displayValue.value}\"\n :disabled=\"${() => props.disabled.value || props.readonly.value || null}\"\n @click=\"${(e: Event) => select(star, e)}\"\n @pointerenter=\"${() => {\n if (!props.readonly.value && !props.disabled.value) hovered.value = star;\n }}\"\n @pointerleave=\"${() => {\n hovered.value = null;\n }}\"\n @keydown=\"${(e: KeyboardEvent) => handleKeydown(e, star)}\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n fill=\"${() => (star <= displayValue.value ? 'currentColor' : 'none')}\"\n stroke=\"currentColor\"\n stroke-width=\"${() => (star <= displayValue.value ? 0 : 1.5)}\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"${FULL_STAR_PATH}\" />\n </svg>\n </button>`,\n )}\n <div class=\"sparkle-layer\"></div>\n </div>\n `;\n },\n styles: [colorThemeMixin, sizeVariantMixin({}), coarsePointerMixin, reducedMotionMixin, styles],\n tag: 'bit-rating',\n});\n"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./styles/mixins/shape.css.cjs`),t=require(`./styles/mixins/states.css.cjs`),n=require(`./styles/mixins/theme.css.cjs`),r=require(`./styles/index.cjs`),i=require(`./icons.cjs`);require(`./chip.cjs`);const a=require(`./craftit/dist/labs/list.cjs`),o=require(`./craftit/dist/labs/overlay.cjs`);require(`./craftit/dist/labs.cjs`);const s=require(`./inputs/shared/dom-sync/dropdown.cjs`),c=require(`./inputs/shared/utils/assistive-text.cjs`),l=require(`./inputs/shared/utils/choice-change.cjs`),u=require(`./inputs/shared/utils/controlled-csv.cjs`),d=require(`./inputs/shared/form-context.cjs`),f=require(`./inputs/shared/dom-sync/label-sync.cjs`);require(`./inputs/shared/dom-sync/index.cjs`);const p=require(`./inputs/shared/validation/index.cjs`),m=require(`./inputs/shared/design-presets.cjs`),h=require(`./inputs/select/select.css?inline.cjs`);let g=require(`@vielzeug/craftit`);var _=(0,g.defineComponent)({formAssociated:!0,props:{color:{default:void 0},disabled:{default:!1},error:{default:``,omit:!0},fullwidth:{default:!1},helper:{default:``},label:{default:``},"label-placement":{default:`inset`},loading:{default:!1},multiple:{default:!1},name:{default:``},options:(0,g.typed)(void 0,{reflect:!1}),placeholder:{default:``},required:{default:!1},rounded:{default:void 0},size:{default:void 0},value:{default:``},variant:{default:void 0}},setup({emit:e,host:t,props:n}){let r=(0,g.signal)([]),m=(0,g.signal)([]),h=(0,g.signal)(!1),_=(0,g.signal)(-1),v=(0,g.computed)(()=>!!n.loading.value),y=(0,g.computed)(()=>{let e=n.options.value;return e===void 0?m.value:e}),b=(0,g.inject)(d.FORM_CTX,void 0),x=(0,g.computed)(()=>r.value.join(`,`)),{triggerValidation:S}=p.createFieldValidation(b,(0,g.defineField)({disabled:(0,g.computed)(()=>!!n.disabled.value||!!b?.disabled.value),value:x},{onReset:()=>{r.value=[]}}));(0,g.watch)(h,e=>{t.toggleAttribute(`open`,(e=>!!e)(e))},{immediate:!0}),(0,g.watch)(n.error,e=>{t.toggleAttribute(`has-error`,(e=>!!e)(e))},{immediate:!0});let{fieldId:C,labelId:w}=(0,g.createFormIds)(`select`,n.name.value),T=`listbox-${C}`,E=null,D=null,O=(0,g.ref)(),k=(0,g.ref)();function A(){let e=t.shadowRoot?.querySelector(`slot`);if(!e)return;let n=e.assignedElements({flatten:!0}),r=[];for(let e of n)if(e.tagName===`OPTION`){let t=e;r.push({disabled:t.disabled,label:t.text||t.value,value:t.value})}else if(e.tagName===`OPTGROUP`){let t=e,n=t.label;for(let e of Array.from(t.querySelectorAll(`option`))){let t=e;r.push({disabled:t.disabled,group:n,label:t.text||t.value,value:t.value})}}m.value=r}(0,g.effect)(()=>{r.value=u.computeControlledCsvState(n.value.value).values});let j=(0,g.computed)(()=>{if(r.value.length===0)return``;if(n.multiple.value&&r.value.length>1)return`${r.value.length} selected`;let e=r.value[0];return y.value.find(t=>t.value===e)?.label??e}),M=(0,g.computed)(()=>n.multiple.value?r.value.map(e=>({label:y.value.find(t=>t.value===e)?.label??e,value:e})):[]),N=(0,g.computed)(()=>c.resolveMergedAssistiveText(n.error.value,n.helper.value)),P=(0,g.computed)(()=>n.multiple.value&&r.value.length>0),F=(0,g.computed)(()=>j.value||n.placeholder.value||``),I=(0,g.computed)(()=>!!n.label.value);function L(e){let t=[],n=new Map;for(let t of e){let e=t.group;n.has(e)||n.set(e,[]),n.get(e).push(t)}let r=0;for(let[e,i]of n){e!==void 0&&t.push({label:e,type:`group`});for(let e of i)t.push({idx:r++,opt:e,type:`option`})}return t}let R=(0,g.computed)(()=>L(y.value));function z(e){return y.value.find(t=>t.value===e)?.label??e}function B(t){let n=r.value;e(`change`,l.createChoiceChangeDetail(n,n.map(e=>z(e)),t))}function V(e){e.stopPropagation();let t=e.detail?.value;t!==void 0&&(r.value=r.value.filter(e=>e!==t),B(e),S(`change`))}let H=s.createDropdownPositioner(()=>E,()=>D),U=a.e({getIndex:()=>_.value,getItems:()=>y.value,isItemDisabled:e=>e.disabled,setIndex:e=>{_.value=e,J()}}),W=o.t({getBoundaryElement:()=>t,getPanelElement:()=>D,getTriggerElement:()=>E,isDisabled:()=>!!n.disabled.value,isOpen:()=>h.value,positioner:{floating:()=>D,reference:()=>E,update:()=>H.updatePosition()},setOpen:e=>{h.value=e,e||U.reset()}});function G(){W.open(),requestAnimationFrame(()=>{let e=r.value.length>0?y.value.findIndex(e=>e.value===r.value[0]):0;U.set(e>=0?e:0)})}function K(e=`programmatic`){W.close({reason:e}),S(`blur`)}function q(e,t){e.disabled||(n.multiple.value?r.value=r.value.includes(e.value)?r.value.filter(t=>t!==e.value):[...r.value,e.value]:(r.value=[e.value],K()),B(t),S(`change`))}function J(){let e=_.value;if(e>=0){(D?.querySelector(`#${C}-opt-${e}`))?.scrollIntoView({block:`nearest`});return}D&&D.querySelector(`[data-focused]`)?.scrollIntoView({block:`nearest`})}function Y(e){if(n.disabled.value)return;let t=y.value;switch(e.key){case` `:case`Enter`:if(e.preventDefault(),h.value){let n=_.value;n>=0&&n<t.length&&q(t[n],e)}else G();break;case`ArrowDown`:e.preventDefault(),h.value?U.next():G();break;case`ArrowUp`:e.preventDefault(),h.value?U.prev():G();break;case`End`:h.value&&(e.preventDefault(),U.last());break;case`Escape`:e.preventDefault(),K(`escape`);break;case`Home`:h.value&&(e.preventDefault(),U.first());break;case`Tab`:K();break}}return(0,g.onMount)(()=>{(0,g.onSlotChange)(`default`,A),A(),f.mountLabelSyncStandalone(k,O,n),E&&(0,g.aria)(E,{activedescendant:()=>_.value>=0?`${C}-opt-${_.value}`:null,disabled:()=>n.disabled.value,expanded:()=>h.value?`true`:`false`,invalid:()=>!!n.error.value,labelledby:()=>I.value?w:null});let e=W.bindOutsideClick(document);return()=>{H.destroy(),e()}}),g.html`<slot style="display:none"></slot>
2
+ <div class="select-wrapper">
3
+ <label class="label-outside" id="${w}" ref=${O} hidden></label>
4
+ <div
5
+ class="field"
6
+ ref=${e=>{E=e}}
7
+ role="combobox"
8
+ tabindex=${()=>n.disabled.value?`-1`:`0`}
9
+ aria-controls="${T}"
10
+ aria-expanded="false"
11
+ aria-labelledby="${w}"
12
+ @click=${e=>{e.stopPropagation(),h.value?K():G()}}
13
+ @keydown=${Y}>
14
+ <label class="label-inset" id="${w}" ref=${k} hidden></label>
15
+ <div class="trigger-row">
16
+ <div class="chips-row" ?hidden=${()=>!P.value}>
17
+ ${()=>M.value.map(e=>g.html`
18
+ <bit-chip
19
+ value=${e.value}
20
+ aria-label=${e.label}
21
+ mode="removable"
22
+ variant="flat"
23
+ size="sm"
24
+ color=${()=>n.color.value}
25
+ @remove=${V}>
26
+ ${e.label}
27
+ </bit-chip>
28
+ `)}
29
+ </div>
30
+ <span
31
+ class="trigger-value ${()=>j.value?``:`trigger-placeholder`}"
32
+ ?hidden=${()=>P.value}
33
+ >${()=>F.value}</span
34
+ >
35
+ </div>
36
+ <span class="trigger-icon" aria-hidden="true">
37
+ ${i.chevronDownIcon}
38
+ <span class="loader" aria-label="Loading"></span>
39
+ </span>
40
+ </div>
41
+ <div
42
+ class="helper-text"
43
+ aria-live="polite"
44
+ ?hidden=${()=>N.value.hidden}
45
+ style=${()=>N.value.isError?`color: var(--color-error);`:``}>
46
+ ${()=>N.value.text}
47
+ </div>
48
+ </div>
49
+ <div
50
+ class="dropdown"
51
+ ?data-open=${()=>h.value}
52
+ role="listbox"
53
+ id="${T}"
54
+ aria-label="Options"
55
+ ref=${e=>{D=e}}>
56
+ <div class="dropdown-loading" ?hidden=${()=>!v.value}>Loading…</div>
57
+ <div class="dropdown-empty" ?hidden=${()=>v.value||y.value.length>0}>No options</div>
58
+ <div class="options-list" ?hidden=${()=>v.value||y.value.length===0}>
59
+ ${()=>R.value.map(e=>e.type===`group`?g.html`<div class="optgroup-label" role="presentation">${e.label}</div>`:g.html`<div
60
+ class="option"
61
+ role="option"
62
+ id=${`${C}-opt-${e.idx}`}
63
+ data-option-index=${()=>String(e.idx)}
64
+ data-option-value=${e.opt.value}
65
+ aria-selected=${()=>String(r.value.includes(e.opt.value))}
66
+ aria-disabled=${()=>String(e.opt.disabled)}
67
+ ?data-focused=${()=>_.value===e.idx}
68
+ ?data-selected=${()=>r.value.includes(e.opt.value)}
69
+ ?data-disabled=${()=>e.opt.disabled}
70
+ @click=${t=>{t.stopPropagation(),q(e.opt,t)}}
71
+ @pointerenter=${()=>{_.value=e.idx}}>
72
+ <span>${e.opt.label}</span>
73
+ <span class="option-check" aria-hidden="true">${i.checkIcon}</span>
74
+ </div>`)}
75
+ </div>
76
+ </div>`},shadow:{delegatesFocus:!0},styles:[e.sizeVariantMixin(m.FIELD_SIZE_PRESET),...r.formFieldMixins,t.disabledLoadingMixin(),n.forcedColorsFocusMixin(`.field`),h.default],tag:`bit-select`});exports.SELECT_TAG=_;
77
+ //# sourceMappingURL=select.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.cjs","names":[],"sources":["../src/inputs/select/select.ts"],"sourcesContent":["import {\n aria,\n computed,\n createFormIds,\n defineComponent,\n defineField,\n effect,\n html,\n inject,\n onMount,\n onSlotChange,\n ref,\n signal,\n typed,\n watch,\n} from '@vielzeug/craftit';\nimport { createListNavigation, createOverlayControl } from '@vielzeug/craftit/labs';\n\nimport type { VisualVariant } from '../../types';\n\nimport '../../feedback/chip/chip';\nimport type { SelectableFieldProps } from '../shared/base-props';\n\nimport { checkIcon, chevronDownIcon } from '../../icons';\nimport { disabledLoadingMixin, forcedColorsFocusMixin, formFieldMixins, sizeVariantMixin } from '../../styles';\nimport { FIELD_SIZE_PRESET } from '../shared/design-presets';\nimport { createDropdownPositioner, mountLabelSyncStandalone } from '../shared/dom-sync';\nimport { FORM_CTX } from '../shared/form-context';\nimport {\n type ChoiceChangeDetail,\n computeControlledCsvState,\n createChoiceChangeDetail,\n resolveMergedAssistiveText,\n} from '../shared/utils';\nimport { createFieldValidation } from '../shared/validation';\nimport componentStyles from './select.css?inline';\n\n// ============================================\n// Types\n// ============================================\n\ntype OptionItem = {\n disabled: boolean;\n group?: string;\n label: string;\n value: string;\n};\n\ntype FlatRow =\n | {\n idx: number;\n opt: OptionItem;\n type: 'option';\n }\n | {\n label: string;\n type: 'group';\n };\n\n// ============================================\n// Styles\n// ============================================\n\n// ============================================\n// Component Props\n// ============================================\n\n/** Select component properties */\n\nexport type BitSelectEvents = {\n change: ChoiceChangeDetail;\n};\n\nexport type BitSelectProps = SelectableFieldProps<Exclude<VisualVariant, 'glass' | 'text' | 'frost'>> & {\n /** Show loading state in dropdown */\n loading?: boolean;\n /** Allow selecting multiple options */\n multiple?: boolean;\n /** JS options array (alternative to slotted <option> elements) */\n options?: OptionItem[];\n /** Mark the field as required */\n required?: boolean;\n};\n\n/**\n * A fully custom form-associated select dropdown with keyboard navigation and ARIA support.\n * Reads `<option>` and `<optgroup>` children from the default slot.\n *\n * @element bit-select\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - 'inset' | 'outside'\n * @attr {string} value - Current selected value(s) (comma-separated for multiple)\n * @attr {string} placeholder - Placeholder when no option selected\n * @attr {string} name - Form field name\n * @attr {boolean} multiple - Enable multi-select\n * @attr {boolean} disabled - Disable the select\n * @attr {boolean} required - Required field\n * @attr {string} helper - Helper text below the select\n * @attr {string} error - Error message\n * @attr {string} color - Theme color\n * @attr {string} variant - Visual variant\n * @attr {string} size - Component size\n * @attr {string} rounded - Border radius\n * @attr {boolean} fullwidth - Expand to full width\n *\n * @fires change - Fired when selection changes. detail: { value: string, values: string[], labels: string[], originalEvent?: Event }\n *\n * @slot - `<option>` and `<optgroup>` elements\n *\n * @cssprop --select-bg - Background\n * @cssprop --select-border-color - Border color\n * @cssprop --select-radius - Border radius\n * @cssprop --select-padding - Padding\n * @cssprop --select-font-size - Font size\n * @cssprop --select-placeholder-color - Placeholder text color\n *\n * @example\n * ```html\n * <bit-select label=\"Role\" value=\"admin\">\n * <option value=\"admin\">Administrator</option>\n * <option value=\"editor\">Editor</option>\n * <option value=\"viewer\">Viewer</option>\n * </bit-select>\n *\n * <bit-select label=\"Tags\" multiple color=\"primary\">\n * <optgroup label=\"Frontend\">\n * <option value=\"react\">React</option>\n * <option value=\"vue\">Vue</option>\n * </optgroup>\n * <optgroup label=\"Backend\">\n * <option value=\"node\">Node.js</option>\n * </optgroup>\n * </bit-select>\n * ```\n */\nexport const SELECT_TAG = defineComponent<BitSelectProps, BitSelectEvents>({\n formAssociated: true,\n props: {\n color: { default: undefined },\n disabled: { default: false },\n error: { default: '', omit: true },\n fullwidth: { default: false },\n helper: { default: '' },\n label: { default: '' },\n 'label-placement': { default: 'inset' },\n loading: { default: false },\n multiple: { default: false },\n name: { default: '' },\n options: typed<OptionItem[] | undefined>(undefined, { reflect: false }),\n placeholder: { default: '' },\n required: { default: false },\n rounded: { default: undefined },\n size: { default: undefined },\n value: { default: '' },\n variant: { default: undefined },\n },\n setup({ emit, host, props }) {\n // ============================================\n // State\n // ============================================\n const selectedValues = signal<string[]>([]);\n const slottedOptions = signal<OptionItem[]>([]);\n const isOpen = signal(false);\n const focusedIndex = signal(-1);\n const isLoading = computed(() => Boolean(props.loading.value));\n // Merged options: explicit prop value overrides slotted options.\n const options = computed(() => {\n const propOptions = props.options.value;\n\n return propOptions !== undefined ? propOptions : slottedOptions.value;\n });\n const formCtx = inject(FORM_CTX, undefined);\n // Form-associated value (comma-separated for multiple)\n const formValue = computed(() => selectedValues.value.join(','));\n const fd = defineField(\n { disabled: computed(() => Boolean(props.disabled.value) || Boolean(formCtx?.disabled.value)), value: formValue },\n {\n onReset: () => {\n selectedValues.value = [];\n },\n },\n );\n\n const { triggerValidation } = createFieldValidation(formCtx, fd);\n\n // Sync host attributes from component state for CSS hooks.\n watch(\n isOpen,\n (value) => {\n host.toggleAttribute('open', ((value) => Boolean(value))(value));\n },\n { immediate: true },\n );\n watch(\n props.error,\n (value) => {\n host.toggleAttribute('has-error', ((value) => Boolean(value))(value));\n },\n { immediate: true },\n );\n\n // Accessibility IDs\n const { fieldId: selectId, labelId } = createFormIds('select', props.name.value);\n const listboxId = `listbox-${selectId}`;\n // DOM refs\n let triggerEl: HTMLElement | null = null;\n let dropdownEl: HTMLElement | null = null;\n // Refs for dynamic content\n const labelOutsideRef = ref<HTMLSpanElement>();\n const labelInsetRef = ref<HTMLSpanElement>();\n\n // ============================================\n // Option reading from slot\n // ============================================\n function readOptions() {\n const slot = host.shadowRoot?.querySelector<HTMLSlotElement>('slot');\n\n if (!slot) return;\n\n const assigned = slot.assignedElements({ flatten: true });\n const items: OptionItem[] = [];\n\n for (const el of assigned) {\n if (el.tagName === 'OPTION') {\n const opt = el as HTMLOptionElement;\n\n items.push({ disabled: opt.disabled, label: opt.text || opt.value, value: opt.value });\n } else if (el.tagName === 'OPTGROUP') {\n const group = el as HTMLOptGroupElement;\n const groupLabel = group.label;\n\n for (const child of Array.from(group.querySelectorAll('option'))) {\n const opt = child as HTMLOptionElement;\n\n items.push({ disabled: opt.disabled, group: groupLabel, label: opt.text || opt.value, value: opt.value });\n }\n }\n }\n slottedOptions.value = items;\n }\n // Initialize selectedValues from prop\n effect(() => {\n selectedValues.value = computeControlledCsvState(props.value.value).values;\n });\n\n // ============================================\n // Display value\n // ============================================\n const displayLabel = computed(() => {\n if (selectedValues.value.length === 0) return '';\n\n if (props.multiple.value && selectedValues.value.length > 1) {\n return `${selectedValues.value.length} selected`;\n }\n\n const first = selectedValues.value[0];\n\n return options.value.find((o) => o.value === first)?.label ?? first;\n });\n const selectedChipItems = computed(() => {\n if (!props.multiple.value) return [];\n\n return selectedValues.value.map((value) => ({\n label: options.value.find((o) => o.value === value)?.label ?? value,\n value,\n }));\n });\n const assistiveText = computed(() => resolveMergedAssistiveText(props.error.value, props.helper.value));\n const showChips = computed(() => props.multiple.value && selectedValues.value.length > 0);\n const triggerText = computed(() => displayLabel.value || props.placeholder.value || '');\n const hasLabel = computed(() => !!props.label.value);\n\n function buildFlatList(opts: OptionItem[]): FlatRow[] {\n const flat: FlatRow[] = [];\n const groups = new Map<string | undefined, OptionItem[]>();\n\n for (const opt of opts) {\n const key = opt.group;\n\n if (!groups.has(key)) groups.set(key, []);\n\n groups.get(key)!.push(opt);\n }\n\n let globalIdx = 0;\n\n for (const [groupLabel, groupOpts] of groups) {\n if (groupLabel !== undefined) flat.push({ label: groupLabel, type: 'group' });\n\n for (const opt of groupOpts) flat.push({ idx: globalIdx++, opt, type: 'option' });\n }\n\n return flat;\n }\n\n const flatRows = computed(() => buildFlatList(options.value));\n\n function getLabelForValue(value: string): string {\n return options.value.find((option) => option.value === value)?.label ?? value;\n }\n\n function emitChange(originalEvent?: Event): void {\n const values = selectedValues.value;\n const labels = values.map((value) => getLabelForValue(value));\n\n emit('change', createChoiceChangeDetail(values, labels, originalEvent));\n }\n\n function removeChip(event: Event): void {\n event.stopPropagation();\n\n const value = (event as CustomEvent<{ value?: string }>).detail?.value;\n\n if (value === undefined) return;\n\n selectedValues.value = selectedValues.value.filter((v) => v !== value);\n emitChange(event);\n triggerValidation('change');\n }\n\n // ============================================\n // Dropdown positioning (shared positioner)\n // ============================================\n const positioner = createDropdownPositioner(\n () => triggerEl,\n () => dropdownEl,\n );\n\n const listNavigation = createListNavigation<OptionItem>({\n getIndex: () => focusedIndex.value,\n getItems: () => options.value,\n isItemDisabled: (option) => option.disabled,\n setIndex: (index) => {\n focusedIndex.value = index;\n scrollFocusedIntoView();\n },\n });\n\n const overlay = createOverlayControl({\n getBoundaryElement: () => host,\n getPanelElement: () => dropdownEl,\n getTriggerElement: () => triggerEl,\n isDisabled: () => Boolean(props.disabled.value),\n isOpen: () => isOpen.value,\n positioner: {\n floating: () => dropdownEl,\n reference: () => triggerEl,\n update: () => positioner.updatePosition(),\n },\n setOpen: (next) => {\n isOpen.value = next;\n\n if (!next) listNavigation.reset();\n },\n });\n\n // ============================================\n // Open / Close\n // ============================================\n function open() {\n overlay.open();\n\n requestAnimationFrame(() => {\n const selectedIndex =\n selectedValues.value.length > 0\n ? options.value.findIndex((option) => option.value === selectedValues.value[0])\n : 0;\n\n listNavigation.set(selectedIndex >= 0 ? selectedIndex : 0);\n });\n }\n\n function close(reason: 'escape' | 'programmatic' = 'programmatic') {\n overlay.close({ reason });\n triggerValidation('blur');\n }\n // ============================================\n // Selection\n // ============================================\n function selectOption(opt: OptionItem, e?: Event) {\n if (opt.disabled) return;\n\n if (props.multiple.value) {\n selectedValues.value = selectedValues.value.includes(opt.value)\n ? selectedValues.value.filter((entry) => entry !== opt.value)\n : [...selectedValues.value, opt.value];\n } else {\n selectedValues.value = [opt.value];\n close();\n }\n\n emitChange(e);\n triggerValidation('change');\n }\n // ============================================\n // Keyboard navigation\n // ============================================\n function scrollFocusedIntoView() {\n const idx = focusedIndex.value;\n\n if (idx >= 0) {\n const focusedOptionEl = dropdownEl?.querySelector<HTMLElement>(`#${selectId}-opt-${idx}`);\n\n focusedOptionEl?.scrollIntoView({ block: 'nearest' });\n\n return;\n }\n\n if (!dropdownEl) return;\n\n const focusedEl = dropdownEl.querySelector<HTMLElement>('[data-focused]');\n\n focusedEl?.scrollIntoView({ block: 'nearest' });\n }\n function handleTriggerKeydown(e: KeyboardEvent) {\n if (props.disabled.value) return;\n\n const opts = options.value;\n\n switch (e.key) {\n case ' ':\n case 'Enter':\n e.preventDefault();\n\n if (isOpen.value) {\n const idx = focusedIndex.value;\n\n if (idx >= 0 && idx < opts.length) selectOption(opts[idx], e);\n } else {\n open();\n }\n\n break;\n case 'ArrowDown':\n e.preventDefault();\n\n if (!isOpen.value) {\n open();\n } else {\n listNavigation.next();\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (!isOpen.value) {\n open();\n } else {\n listNavigation.prev();\n }\n\n break;\n case 'End':\n if (isOpen.value) {\n e.preventDefault();\n listNavigation.last();\n }\n\n break;\n case 'Escape':\n e.preventDefault();\n close('escape');\n break;\n case 'Home':\n if (isOpen.value) {\n e.preventDefault();\n listNavigation.first();\n }\n\n break;\n case 'Tab':\n close();\n break;\n }\n }\n onMount(() => {\n onSlotChange('default', readOptions);\n // Ensure initial light-DOM <option>/<optgroup> content is available immediately.\n readOptions();\n mountLabelSyncStandalone(labelInsetRef, labelOutsideRef, props);\n\n if (triggerEl) {\n aria(triggerEl, {\n activedescendant: () => (focusedIndex.value >= 0 ? `${selectId}-opt-${focusedIndex.value}` : null),\n disabled: () => props.disabled.value,\n expanded: () => (isOpen.value ? 'true' : 'false'),\n invalid: () => !!props.error.value,\n labelledby: () => (hasLabel.value ? labelId : null),\n });\n }\n\n const removeOutsideClick = overlay.bindOutsideClick(document);\n\n return () => {\n positioner.destroy();\n removeOutsideClick();\n };\n });\n\n return html`<slot style=\"display:none\"></slot>\n <div class=\"select-wrapper\">\n <label class=\"label-outside\" id=\"${labelId}\" ref=${labelOutsideRef} hidden></label>\n <div\n class=\"field\"\n ref=${(el: HTMLElement) => {\n triggerEl = el;\n }}\n role=\"combobox\"\n tabindex=${() => (props.disabled.value ? '-1' : '0')}\n aria-controls=\"${listboxId}\"\n aria-expanded=\"false\"\n aria-labelledby=\"${labelId}\"\n @click=${(e: MouseEvent) => {\n e.stopPropagation();\n\n if (isOpen.value) close();\n else open();\n }}\n @keydown=${handleTriggerKeydown}>\n <label class=\"label-inset\" id=\"${labelId}\" ref=${labelInsetRef} hidden></label>\n <div class=\"trigger-row\">\n <div class=\"chips-row\" ?hidden=${() => !showChips.value}>\n ${() =>\n selectedChipItems.value.map(\n (item) => html`\n <bit-chip\n value=${item.value}\n aria-label=${item.label}\n mode=\"removable\"\n variant=\"flat\"\n size=\"sm\"\n color=${() => props.color.value}\n @remove=${removeChip}>\n ${item.label}\n </bit-chip>\n `,\n )}\n </div>\n <span\n class=\"trigger-value ${() => (displayLabel.value ? '' : 'trigger-placeholder')}\"\n ?hidden=${() => showChips.value}\n >${() => triggerText.value}</span\n >\n </div>\n <span class=\"trigger-icon\" aria-hidden=\"true\">\n ${chevronDownIcon}\n <span class=\"loader\" aria-label=\"Loading\"></span>\n </span>\n </div>\n <div\n class=\"helper-text\"\n aria-live=\"polite\"\n ?hidden=${() => assistiveText.value.hidden}\n style=${() => (assistiveText.value.isError ? 'color: var(--color-error);' : '')}>\n ${() => assistiveText.value.text}\n </div>\n </div>\n <div\n class=\"dropdown\"\n ?data-open=${() => isOpen.value}\n role=\"listbox\"\n id=\"${listboxId}\"\n aria-label=\"Options\"\n ref=${(el: HTMLElement) => {\n dropdownEl = el;\n }}>\n <div class=\"dropdown-loading\" ?hidden=${() => !isLoading.value}>Loading…</div>\n <div class=\"dropdown-empty\" ?hidden=${() => isLoading.value || options.value.length > 0}>No options</div>\n <div class=\"options-list\" ?hidden=${() => isLoading.value || options.value.length === 0}>\n ${() =>\n flatRows.value.map((row) =>\n row.type === 'group'\n ? html`<div class=\"optgroup-label\" role=\"presentation\">${row.label}</div>`\n : html`<div\n class=\"option\"\n role=\"option\"\n id=${`${selectId}-opt-${row.idx}`}\n data-option-index=${() => String(row.idx)}\n data-option-value=${row.opt.value}\n aria-selected=${() => String(selectedValues.value.includes(row.opt.value))}\n aria-disabled=${() => String(row.opt.disabled)}\n ?data-focused=${() => focusedIndex.value === row.idx}\n ?data-selected=${() => selectedValues.value.includes(row.opt.value)}\n ?data-disabled=${() => row.opt.disabled}\n @click=${(e: MouseEvent) => {\n e.stopPropagation();\n selectOption(row.opt, e);\n }}\n @pointerenter=${() => {\n focusedIndex.value = row.idx;\n }}>\n <span>${row.opt.label}</span>\n <span class=\"option-check\" aria-hidden=\"true\">${checkIcon}</span>\n </div>`,\n )}\n </div>\n </div>`;\n },\n shadow: { delegatesFocus: true },\n styles: [\n sizeVariantMixin(FIELD_SIZE_PRESET),\n ...formFieldMixins,\n disabledLoadingMixin(),\n forcedColorsFocusMixin('.field'),\n componentStyles,\n ],\n tag: 'bit-select',\n});\n"],"mappings":"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"}