@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,16 @@
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(`./craftit/dist/directives/attr.cjs`);require(`./craftit/dist/directives/index.cjs`);const a=require(`./inputs/shared/utils/field-values.cjs`),o=require(`./inputs/shared/dom-sync/field-sync.cjs`);require(`./inputs/shared/dom-sync/index.cjs`);const s=require(`./inputs/shared/composables/use-text-field.cjs`);require(`./inputs/shared/composables/index.cjs`);const c=require(`./inputs/shared/design-presets.cjs`),l=require(`./inputs/textarea/textarea.css?inline.cjs`);let u=require(`@vielzeug/craftit`);var d=(0,u.defineComponent)({formAssociated:!0,props:{"auto-resize":{default:!1},color:{default:void 0},disabled:{default:!1},error:{default:``,omit:!0},fullwidth:{default:!1},helper:{default:``},label:{default:``},"label-placement":{default:`inset`},maxlength:{default:void 0},name:{default:``},"no-resize":{default:!1},placeholder:{default:``},readonly:{default:!1},required:{default:!1},resize:{default:void 0},rounded:{default:void 0},rows:{default:void 0},size:{default:void 0},value:{default:``},variant:{default:void 0}},setup({emit:e,props:t}){let n=s.useTextField(t,`textarea`),{fieldId:r,helperId:c,labelInsetId:l,labelInsetRef:d,labelOutsideId:f,labelOutsideRef:p,valueSignal:m}=n,h=(0,u.computed)(()=>t.maxlength.value),g=(0,u.ref)(),_=(0,u.ref)(),v=(0,u.ref)();return(0,u.onMount)(()=>{let r=g.value;if(!r)return;let i=()=>{!t[`auto-resize`].value||!r||(r.style.height=`auto`,r.style.height=`${r.scrollHeight}px`)};n.mountLabelSync(),(0,u.effect)(()=>{let e=a.parsePositiveNumber(t.rows.value);e==null?r.removeAttribute(`rows`):r.rows=e;let n=a.parsePositiveNumber(h.value);n==null?r.removeAttribute(`maxlength`):r.maxLength=n,r.style.resize=t[`auto-resize`].value||t[`no-resize`].value?`none`:t.resize.value||`vertical`}),o.syncMergedAssistive({error:()=>t.error.value,helper:()=>t.helper.value,ref:_}),o.syncCounter({count:(0,u.computed)(()=>m.value.length),format:`merged`,maxLength:h,ref:v}),import(`@vielzeug/craftit`).then(({aria:e})=>{e(r,{describedby:()=>t.error.value?n.errorId:c,invalid:()=>!!t.error.value,labelledby:()=>t[`label-placement`].value===`outside`?f:l})}),o.setupFieldEvents(r,{onBlur:()=>n.triggerValidation(`blur`),onChange:(t,r)=>{e(`change`,{originalEvent:t,value:r}),n.triggerValidation(`change`)},onInput:(t,n)=>{i(),e(`input`,{originalEvent:t,value:n})}}),t[`auto-resize`].value&&requestAnimationFrame(i)}),u.html`
2
+ <div class="textarea-wrapper">
3
+ <label class="label-outside" for="${r}" id="${f}" ref=${p} hidden></label>
4
+ <div class="field">
5
+ <label class="label-inset" for="${r}" id="${l}" ref=${d} hidden></label>
6
+ <textarea
7
+ ref=${g}
8
+ id="${r}"
9
+ ${i.t({disabled:t.disabled,name:t.name,placeholder:t.placeholder,readOnly:t.readonly,required:t.required,value:m})}
10
+ aria-describedby="${c}"></textarea>
11
+ </div>
12
+ <span class="counter" aria-live="polite" ref=${v} hidden></span>
13
+ <div id="${c}" class="helper-text" aria-live="polite" ref=${_} hidden></div>
14
+ </div>
15
+ `},shadow:{delegatesFocus:!0},styles:[...r.formFieldMixins,e.sizeVariantMixin(c.TEXTAREA_SIZE_PRESET),t.disabledLoadingMixin(),n.forcedColorsFocusMixin(`textarea`),l.default],tag:`bit-textarea`});exports.TEXTAREA_TAG=d;
16
+ //# sourceMappingURL=textarea.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.cjs","names":[],"sources":["../src/inputs/textarea/textarea.ts"],"sourcesContent":["import { computed, defineComponent, effect, html, onMount, ref } from '@vielzeug/craftit';\nimport { attr } from '@vielzeug/craftit/directives';\n\nimport type { VisualVariant } from '../../types';\nimport type { TextFieldProps } from '../shared/base-props';\n\nimport { disabledLoadingMixin, forcedColorsFocusMixin, formFieldMixins, sizeVariantMixin } from '../../styles';\nimport { useTextField } from '../shared/composables';\nimport { TEXTAREA_SIZE_PRESET } from '../shared/design-presets';\nimport { setupFieldEvents, syncCounter, syncMergedAssistive } from '../shared/dom-sync';\nimport { parsePositiveNumber } from '../shared/utils';\nimport componentStyles from './textarea.css?inline';\n\n/** Textarea component properties */\n\nexport type BitTextareaEvents = {\n change: { originalEvent: Event; value: string };\n input: { originalEvent: Event; value: string };\n};\n\nexport type BitTextareaProps = TextFieldProps<Exclude<VisualVariant, 'glass' | 'frost' | 'text'>> & {\n /** Allow auto-grow with content */\n 'auto-resize'?: boolean;\n /** Maximum character count; shows a counter when set */\n maxlength?: number;\n /** Disable manual resize handle */\n 'no-resize'?: boolean;\n /** Resize direction override */\n resize?: 'none' | 'horizontal' | 'both' | 'vertical';\n /** Number of visible text rows */\n rows?: number;\n};\n\n/**\n * A multi-line text input with label, helper text, character counter, and auto-resize.\n *\n * @element bit-textarea\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - 'inset' | 'outside'\n * @attr {string} value - Current value\n * @attr {string} placeholder - Placeholder text\n * @attr {string} name - Form field name\n * @attr {number} rows - Visible row count\n * @attr {number} maxlength - Max character count (shows counter)\n * @attr {string} helper - Helper text below the textarea\n * @attr {string} error - Error message\n * @attr {boolean} disabled - Disable interaction\n * @attr {boolean} readonly - Read-only mode\n * @attr {boolean} required - Required field\n * @attr {boolean} no-resize - Disable manual resize\n * @attr {boolean} auto-resize - Grow with content\n * @attr {string} resize - Resize direction: 'none' | 'horizontal' | 'both' | 'vertical'\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 *\n * @fires input - Fired on every keystroke with current value\n * @fires change - Fired on blur with changed value\n *\n * @slot helper - Complex helper content\n */\nexport const TEXTAREA_TAG = defineComponent<BitTextareaProps, BitTextareaEvents>({\n formAssociated: true,\n props: {\n 'auto-resize': { default: false },\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 maxlength: { default: undefined },\n name: { default: '' },\n 'no-resize': { default: false },\n placeholder: { default: '' },\n readonly: { default: false },\n required: { default: false },\n resize: { default: undefined },\n rounded: { default: undefined },\n rows: { default: undefined },\n size: { default: undefined },\n value: { default: '' },\n variant: { default: undefined },\n },\n setup({ emit, props }) {\n const tf = useTextField(props, 'textarea');\n const {\n fieldId: textareaId,\n helperId,\n labelInsetId,\n labelInsetRef,\n labelOutsideId,\n labelOutsideRef,\n valueSignal,\n } = tf;\n const maxLen = computed<number | undefined>(() => props.maxlength.value);\n\n const textareaRef = ref<HTMLTextAreaElement>();\n const helperRef = ref<HTMLDivElement>();\n const counterRef = ref<HTMLSpanElement>();\n\n onMount(() => {\n const ta = textareaRef.value;\n\n if (!ta) return;\n\n const autoGrow = () => {\n if (!props['auto-resize'].value || !ta) return;\n\n ta.style.height = 'auto';\n ta.style.height = `${ta.scrollHeight}px`;\n };\n\n tf.mountLabelSync();\n\n effect(() => {\n const rows = parsePositiveNumber(props.rows.value);\n\n if (rows != null) ta.rows = rows;\n else ta.removeAttribute('rows');\n\n const max = parsePositiveNumber(maxLen.value);\n\n if (max != null) ta.maxLength = max;\n else ta.removeAttribute('maxlength');\n\n ta.style.resize =\n props['auto-resize'].value || props['no-resize'].value ? 'none' : props.resize.value || 'vertical';\n });\n\n syncMergedAssistive({\n error: () => props.error.value,\n helper: () => props.helper.value,\n ref: helperRef,\n });\n\n syncCounter({\n count: computed(() => valueSignal.value.length),\n format: 'merged',\n maxLength: maxLen,\n ref: counterRef,\n });\n\n // TODO: migrate aria() on inner elements to a future useA11yField() composable\n import('@vielzeug/craftit').then(({ aria }) => {\n aria(ta, {\n describedby: () => (props.error.value ? tf.errorId : helperId),\n invalid: () => !!props.error.value,\n labelledby: () => (props['label-placement'].value === 'outside' ? labelOutsideId : labelInsetId),\n });\n });\n\n setupFieldEvents(ta, {\n onBlur: () => tf.triggerValidation('blur'),\n onChange: (e, value) => {\n emit('change', { originalEvent: e, value });\n tf.triggerValidation('change');\n },\n onInput: (e, value) => {\n autoGrow();\n emit('input', { originalEvent: e, value });\n },\n });\n\n if (props['auto-resize'].value) requestAnimationFrame(autoGrow);\n });\n\n return html`\n <div class=\"textarea-wrapper\">\n <label class=\"label-outside\" for=\"${textareaId}\" id=\"${labelOutsideId}\" ref=${labelOutsideRef} hidden></label>\n <div class=\"field\">\n <label class=\"label-inset\" for=\"${textareaId}\" id=\"${labelInsetId}\" ref=${labelInsetRef} hidden></label>\n <textarea\n ref=${textareaRef}\n id=\"${textareaId}\"\n ${attr({\n disabled: props.disabled,\n name: props.name,\n placeholder: props.placeholder,\n readOnly: props.readonly,\n required: props.required,\n value: valueSignal,\n })}\n aria-describedby=\"${helperId}\"></textarea>\n </div>\n <span class=\"counter\" aria-live=\"polite\" ref=${counterRef} hidden></span>\n <div id=\"${helperId}\" class=\"helper-text\" aria-live=\"polite\" ref=${helperRef} hidden></div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [\n ...formFieldMixins,\n sizeVariantMixin(TEXTAREA_SIZE_PRESET),\n disabledLoadingMixin(),\n forcedColorsFocusMixin('textarea'),\n componentStyles,\n ],\n tag: 'bit-textarea',\n});\n"],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { sizeVariantMixin as e } from "./styles/mixins/shape.css.js";
2
+ import { disabledLoadingMixin as t } from "./styles/mixins/states.css.js";
3
+ import { forcedColorsFocusMixin as n } from "./styles/mixins/theme.css.js";
4
+ import { formFieldMixins as r } from "./styles/index.js";
5
+ import { t as i } from "./craftit/dist/directives/attr.js";
6
+ import "./craftit/dist/directives/index.js";
7
+ import { parsePositiveNumber as a } from "./inputs/shared/utils/field-values.js";
8
+ import { setupFieldEvents as o, syncCounter as s, syncMergedAssistive as c } from "./inputs/shared/dom-sync/field-sync.js";
9
+ import "./inputs/shared/dom-sync/index.js";
10
+ import { useTextField as l } from "./inputs/shared/composables/use-text-field.js";
11
+ import "./inputs/shared/composables/index.js";
12
+ import { TEXTAREA_SIZE_PRESET as u } from "./inputs/shared/design-presets.js";
13
+ import d from "./inputs/textarea/textarea.css?inline.js";
14
+ import { computed as f, defineComponent as p, effect as m, html as h, onMount as g, ref as _ } from "@vielzeug/craftit";
15
+ //#region src/inputs/textarea/textarea.ts
16
+ var v = p({
17
+ formAssociated: !0,
18
+ props: {
19
+ "auto-resize": { default: !1 },
20
+ color: { default: void 0 },
21
+ disabled: { default: !1 },
22
+ error: {
23
+ default: "",
24
+ omit: !0
25
+ },
26
+ fullwidth: { default: !1 },
27
+ helper: { default: "" },
28
+ label: { default: "" },
29
+ "label-placement": { default: "inset" },
30
+ maxlength: { default: void 0 },
31
+ name: { default: "" },
32
+ "no-resize": { default: !1 },
33
+ placeholder: { default: "" },
34
+ readonly: { default: !1 },
35
+ required: { default: !1 },
36
+ resize: { default: void 0 },
37
+ rounded: { default: void 0 },
38
+ rows: { default: void 0 },
39
+ size: { default: void 0 },
40
+ value: { default: "" },
41
+ variant: { default: void 0 }
42
+ },
43
+ setup({ emit: e, props: t }) {
44
+ let n = l(t, "textarea"), { fieldId: r, helperId: u, labelInsetId: d, labelInsetRef: p, labelOutsideId: v, labelOutsideRef: y, valueSignal: b } = n, x = f(() => t.maxlength.value), S = _(), C = _(), w = _();
45
+ return g(() => {
46
+ let r = S.value;
47
+ if (!r) return;
48
+ let i = () => {
49
+ !t["auto-resize"].value || !r || (r.style.height = "auto", r.style.height = `${r.scrollHeight}px`);
50
+ };
51
+ n.mountLabelSync(), m(() => {
52
+ let e = a(t.rows.value);
53
+ e == null ? r.removeAttribute("rows") : r.rows = e;
54
+ let n = a(x.value);
55
+ n == null ? r.removeAttribute("maxlength") : r.maxLength = n, r.style.resize = t["auto-resize"].value || t["no-resize"].value ? "none" : t.resize.value || "vertical";
56
+ }), c({
57
+ error: () => t.error.value,
58
+ helper: () => t.helper.value,
59
+ ref: C
60
+ }), s({
61
+ count: f(() => b.value.length),
62
+ format: "merged",
63
+ maxLength: x,
64
+ ref: w
65
+ }), import("@vielzeug/craftit").then(({ aria: e }) => {
66
+ e(r, {
67
+ describedby: () => t.error.value ? n.errorId : u,
68
+ invalid: () => !!t.error.value,
69
+ labelledby: () => t["label-placement"].value === "outside" ? v : d
70
+ });
71
+ }), o(r, {
72
+ onBlur: () => n.triggerValidation("blur"),
73
+ onChange: (t, r) => {
74
+ e("change", {
75
+ originalEvent: t,
76
+ value: r
77
+ }), n.triggerValidation("change");
78
+ },
79
+ onInput: (t, n) => {
80
+ i(), e("input", {
81
+ originalEvent: t,
82
+ value: n
83
+ });
84
+ }
85
+ }), t["auto-resize"].value && requestAnimationFrame(i);
86
+ }), h`
87
+ <div class="textarea-wrapper">
88
+ <label class="label-outside" for="${r}" id="${v}" ref=${y} hidden></label>
89
+ <div class="field">
90
+ <label class="label-inset" for="${r}" id="${d}" ref=${p} hidden></label>
91
+ <textarea
92
+ ref=${S}
93
+ id="${r}"
94
+ ${i({
95
+ disabled: t.disabled,
96
+ name: t.name,
97
+ placeholder: t.placeholder,
98
+ readOnly: t.readonly,
99
+ required: t.required,
100
+ value: b
101
+ })}
102
+ aria-describedby="${u}"></textarea>
103
+ </div>
104
+ <span class="counter" aria-live="polite" ref=${w} hidden></span>
105
+ <div id="${u}" class="helper-text" aria-live="polite" ref=${C} hidden></div>
106
+ </div>
107
+ `;
108
+ },
109
+ shadow: { delegatesFocus: !0 },
110
+ styles: [
111
+ ...r,
112
+ e(u),
113
+ t(),
114
+ n("textarea"),
115
+ d
116
+ ],
117
+ tag: "bit-textarea"
118
+ });
119
+ //#endregion
120
+ export { v as TEXTAREA_TAG };
121
+
122
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../src/inputs/textarea/textarea.ts"],"sourcesContent":["import { computed, defineComponent, effect, html, onMount, ref } from '@vielzeug/craftit';\nimport { attr } from '@vielzeug/craftit/directives';\n\nimport type { VisualVariant } from '../../types';\nimport type { TextFieldProps } from '../shared/base-props';\n\nimport { disabledLoadingMixin, forcedColorsFocusMixin, formFieldMixins, sizeVariantMixin } from '../../styles';\nimport { useTextField } from '../shared/composables';\nimport { TEXTAREA_SIZE_PRESET } from '../shared/design-presets';\nimport { setupFieldEvents, syncCounter, syncMergedAssistive } from '../shared/dom-sync';\nimport { parsePositiveNumber } from '../shared/utils';\nimport componentStyles from './textarea.css?inline';\n\n/** Textarea component properties */\n\nexport type BitTextareaEvents = {\n change: { originalEvent: Event; value: string };\n input: { originalEvent: Event; value: string };\n};\n\nexport type BitTextareaProps = TextFieldProps<Exclude<VisualVariant, 'glass' | 'frost' | 'text'>> & {\n /** Allow auto-grow with content */\n 'auto-resize'?: boolean;\n /** Maximum character count; shows a counter when set */\n maxlength?: number;\n /** Disable manual resize handle */\n 'no-resize'?: boolean;\n /** Resize direction override */\n resize?: 'none' | 'horizontal' | 'both' | 'vertical';\n /** Number of visible text rows */\n rows?: number;\n};\n\n/**\n * A multi-line text input with label, helper text, character counter, and auto-resize.\n *\n * @element bit-textarea\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - 'inset' | 'outside'\n * @attr {string} value - Current value\n * @attr {string} placeholder - Placeholder text\n * @attr {string} name - Form field name\n * @attr {number} rows - Visible row count\n * @attr {number} maxlength - Max character count (shows counter)\n * @attr {string} helper - Helper text below the textarea\n * @attr {string} error - Error message\n * @attr {boolean} disabled - Disable interaction\n * @attr {boolean} readonly - Read-only mode\n * @attr {boolean} required - Required field\n * @attr {boolean} no-resize - Disable manual resize\n * @attr {boolean} auto-resize - Grow with content\n * @attr {string} resize - Resize direction: 'none' | 'horizontal' | 'both' | 'vertical'\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 *\n * @fires input - Fired on every keystroke with current value\n * @fires change - Fired on blur with changed value\n *\n * @slot helper - Complex helper content\n */\nexport const TEXTAREA_TAG = defineComponent<BitTextareaProps, BitTextareaEvents>({\n formAssociated: true,\n props: {\n 'auto-resize': { default: false },\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 maxlength: { default: undefined },\n name: { default: '' },\n 'no-resize': { default: false },\n placeholder: { default: '' },\n readonly: { default: false },\n required: { default: false },\n resize: { default: undefined },\n rounded: { default: undefined },\n rows: { default: undefined },\n size: { default: undefined },\n value: { default: '' },\n variant: { default: undefined },\n },\n setup({ emit, props }) {\n const tf = useTextField(props, 'textarea');\n const {\n fieldId: textareaId,\n helperId,\n labelInsetId,\n labelInsetRef,\n labelOutsideId,\n labelOutsideRef,\n valueSignal,\n } = tf;\n const maxLen = computed<number | undefined>(() => props.maxlength.value);\n\n const textareaRef = ref<HTMLTextAreaElement>();\n const helperRef = ref<HTMLDivElement>();\n const counterRef = ref<HTMLSpanElement>();\n\n onMount(() => {\n const ta = textareaRef.value;\n\n if (!ta) return;\n\n const autoGrow = () => {\n if (!props['auto-resize'].value || !ta) return;\n\n ta.style.height = 'auto';\n ta.style.height = `${ta.scrollHeight}px`;\n };\n\n tf.mountLabelSync();\n\n effect(() => {\n const rows = parsePositiveNumber(props.rows.value);\n\n if (rows != null) ta.rows = rows;\n else ta.removeAttribute('rows');\n\n const max = parsePositiveNumber(maxLen.value);\n\n if (max != null) ta.maxLength = max;\n else ta.removeAttribute('maxlength');\n\n ta.style.resize =\n props['auto-resize'].value || props['no-resize'].value ? 'none' : props.resize.value || 'vertical';\n });\n\n syncMergedAssistive({\n error: () => props.error.value,\n helper: () => props.helper.value,\n ref: helperRef,\n });\n\n syncCounter({\n count: computed(() => valueSignal.value.length),\n format: 'merged',\n maxLength: maxLen,\n ref: counterRef,\n });\n\n // TODO: migrate aria() on inner elements to a future useA11yField() composable\n import('@vielzeug/craftit').then(({ aria }) => {\n aria(ta, {\n describedby: () => (props.error.value ? tf.errorId : helperId),\n invalid: () => !!props.error.value,\n labelledby: () => (props['label-placement'].value === 'outside' ? labelOutsideId : labelInsetId),\n });\n });\n\n setupFieldEvents(ta, {\n onBlur: () => tf.triggerValidation('blur'),\n onChange: (e, value) => {\n emit('change', { originalEvent: e, value });\n tf.triggerValidation('change');\n },\n onInput: (e, value) => {\n autoGrow();\n emit('input', { originalEvent: e, value });\n },\n });\n\n if (props['auto-resize'].value) requestAnimationFrame(autoGrow);\n });\n\n return html`\n <div class=\"textarea-wrapper\">\n <label class=\"label-outside\" for=\"${textareaId}\" id=\"${labelOutsideId}\" ref=${labelOutsideRef} hidden></label>\n <div class=\"field\">\n <label class=\"label-inset\" for=\"${textareaId}\" id=\"${labelInsetId}\" ref=${labelInsetRef} hidden></label>\n <textarea\n ref=${textareaRef}\n id=\"${textareaId}\"\n ${attr({\n disabled: props.disabled,\n name: props.name,\n placeholder: props.placeholder,\n readOnly: props.readonly,\n required: props.required,\n value: valueSignal,\n })}\n aria-describedby=\"${helperId}\"></textarea>\n </div>\n <span class=\"counter\" aria-live=\"polite\" ref=${counterRef} hidden></span>\n <div id=\"${helperId}\" class=\"helper-text\" aria-live=\"polite\" ref=${helperRef} hidden></div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [\n ...formFieldMixins,\n sizeVariantMixin(TEXTAREA_SIZE_PRESET),\n disabledLoadingMixin(),\n forcedColorsFocusMixin('textarea'),\n componentStyles,\n ],\n tag: 'bit-textarea',\n});\n"],"mappings":"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"}
package/dist/toast.cjs ADDED
@@ -0,0 +1,63 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./styles/mixins/accessibility.css.cjs`);require(`./styles/index.cjs`);const t=require(`./craftit/dist/directives/classes.cjs`),n=require(`./craftit/dist/directives/each.cjs`);require(`./craftit/dist/directives/index.cjs`);const r=require(`./utils/animation.cjs`),i=require(`./feedback/toast/toast.css?inline.cjs`);let a=require(`@vielzeug/craftit`);function o(e,t){return e.actions?.length?a.html`
2
+ <div slot="actions" class="toast-actions">
3
+ ${e.actions.map(n=>a.html`
4
+ <bit-button
5
+ size="sm"
6
+ color=${n.color||e.color||`primary`}
7
+ variant=${n.variant||`solid`}
8
+ @click=${()=>{n.onClick?.(),t()}}
9
+ >${n.label}</bit-button
10
+ >
11
+ `)}
12
+ </div>
13
+ `:``}var s=(0,a.defineComponent)({props:{max:{default:5},position:{default:`bottom-right`}},setup({emit:e,host:i,props:s}){let c=(0,a.signal)([]),l=(0,a.signal)(new Set),u=(0,a.ref)(),d=new Map,f=[],p=!1,m=(e,t)=>{let n=new Set(l.value);t?n.add(e):n.delete(e),l.value=n},h=(e,t)=>{let n=window.setTimeout(()=>{b(e),d.delete(e)},t);d.set(e,{remaining:t,startedAt:Date.now(),timeoutId:n})},g=!1,_=()=>{if(!g){g=!0;for(let[e,t]of d)clearTimeout(t.timeoutId),d.set(e,{...t,remaining:Math.max(0,t.remaining-(Date.now()-t.startedAt))})}},v=()=>{if(g){g=!1;for(let[e,t]of d)t.remaining<=0||h(e,t.remaining)}},y=t=>{let n=t.id||crypto.randomUUID(),r={dismissible:!0,duration:5e3,...t,id:n};return c.value=[...c.value,r].slice(-(s.max.value??5)),e(`add`,{id:n}),r.duration>0&&h(n,r.duration),n},b=e=>{let t=d.get(e);if(t&&(clearTimeout(t.timeoutId),d.delete(e)),!(l.value.has(e)||f.includes(e))){if(p){f.push(e);return}p=!0,x(e)}},x=t=>{if(l.value.has(t)){S();return}let n=c.value.find(e=>e.id===t),i=u.value?.querySelector(`[data-toast-id="${t}"]`),a=()=>{m(t,!1),c.value=c.value.filter(e=>e.id!==t),n?.onDismiss?.(),e(`dismiss`,{id:t}),S()};i?(m(t,!0),r.awaitExit(i,a)):a()},S=()=>{if(f.length===0){p=!1;return}x(f.shift())},C=(e,t)=>{if(c.value=c.value.map(n=>n.id===e?{...n,...t,id:e}:n),t.duration===void 0)return;let n=d.get(e);n&&clearTimeout(n.timeoutId),d.delete(e),t.duration>0&&h(e,t.duration)},w=()=>{for(let[,e]of d)clearTimeout(e.timeoutId);d.clear(),f.length=0;let e=c.value.map(e=>e.id).filter(e=>!l.value.has(e));e.length&&(f.push(...e),p||S())};(0,a.onMount)(()=>{let e=i;e.add=y,e.update=C,e.dismiss=b,e.clear=w});let T=e=>e.urgency??(e.color===`error`?`assertive`:`polite`),E=!1,D=!1,O=()=>_(),k=()=>{!E&&!D&&v()},A=e=>{D=e,i.classList.toggle(`hovered`,e),e?O():k()},j=e=>a.html`
14
+ <div
15
+ class=${t.n({exiting:()=>l.value.has(e.id),"toast-wrapper":!0})}
16
+ data-toast-id=${e.id}
17
+ part="toast-wrapper">
18
+ <bit-alert
19
+ color=${e.color||(e.urgency===`assertive`?`error`:`primary`)}
20
+ variant=${e.variant||`solid`}
21
+ size=${e.size||`md`}
22
+ rounded=${e.rounded||`md`}
23
+ ?dismissible=${e.dismissible}
24
+ ?horizontal=${e.horizontal}
25
+ heading=${e.heading||``}
26
+ @dismiss=${()=>b(e.id)}>
27
+ ${e.meta?a.html`<span slot="meta">${e.meta}</span>`:``} ${e.message}
28
+ ${o(e,()=>b(e.id))}
29
+ </bit-alert>
30
+ </div>
31
+ `;return a.html`
32
+ <div
33
+ class="toast-container"
34
+ ref=${u}
35
+ @pointerenter=${()=>A(!0)}
36
+ @pointerleave=${()=>A(!1)}
37
+ @focusin=${()=>{E=!0,O()}}
38
+ @focusout=${()=>{E=!1,k()}}
39
+ part="container">
40
+ <!-- Polite live region: normal informational toasts -->
41
+ <div
42
+ role="region"
43
+ aria-live="polite"
44
+ aria-relevant="additions removals"
45
+ aria-atomic="false"
46
+ aria-label="Notifications"
47
+ class="toast-live-region">
48
+ ${n.d(()=>c.value.filter(e=>T(e)===`polite`),j,void 0,{key:e=>e.id})}
49
+ </div>
50
+ <!-- Assertive live region: critical errors that interrupt immediately -->
51
+ <div
52
+ role="region"
53
+ aria-live="assertive"
54
+ aria-relevant="additions removals"
55
+ aria-atomic="false"
56
+ aria-label="Critical notifications"
57
+ class="toast-live-region">
58
+ ${n.d(()=>c.value.filter(e=>T(e)===`assertive`),j,void 0,{key:e=>e.id})}
59
+ </div>
60
+ <slot></slot>
61
+ </div>
62
+ `},styles:[e.reducedMotionMixin,i.default],tag:`bit-toast`}),c=()=>{let e=document.querySelector(`bit-toast`);return e||(e=document.createElement(`bit-toast`),document.body.appendChild(e)),e},l={add(e){return c().add(e)},clear(){c().clear()},configure(e){let t=c();e.position&&t.setAttribute(`position`,e.position),e.max!=null&&t.setAttribute(`max`,String(e.max))},async promise(e,t){let n=l.add({color:`primary`,dismissible:!1,duration:0,message:t.loading});try{let r=await e;return l.update(n,{color:`success`,dismissible:!0,duration:5e3,message:typeof t.success==`function`?t.success(r):t.success}),r}catch(e){throw l.update(n,{color:`error`,dismissible:!0,duration:5e3,message:typeof t.error==`function`?t.error(e):t.error}),e}},remove(e){c().dismiss(e)},update(e,t){c().update(e,t)}};exports.TOAST_TAG=s,exports.toast=l;
63
+ //# sourceMappingURL=toast.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.cjs","names":[],"sources":["../src/feedback/toast/toast.ts"],"sourcesContent":["import { defineComponent, html, onMount, ref, signal } from '@vielzeug/craftit';\nimport { classes, each } from '@vielzeug/craftit/directives';\n\nimport type { ComponentSize, RoundedSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { reducedMotionMixin } from '../../styles';\nimport { awaitExit } from '../../utils/animation';\nimport componentStyles from './toast.css?inline';\n\n/** Toast container properties */\n\nexport type BitToastEvents = {\n add: { id: string };\n dismiss: { id: string };\n};\n\nexport type BitToastProps = {\n max?: number;\n position?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n};\n\n/** Individual toast notification */\nexport type ToastItem = {\n actions?: Array<{\n color?: ThemeColor;\n label: string;\n onClick?: () => void;\n variant?: VisualVariant;\n }>;\n color?: ThemeColor;\n dismissible?: boolean;\n /** Auto-dismiss delay in ms. Set to 0 for persistent toasts (default: 5000) */\n duration?: number;\n heading?: string;\n /** Show message and actions side-by-side (horizontal layout) */\n horizontal?: boolean;\n /** Auto-generated via crypto.randomUUID() if omitted */\n id?: string;\n message: string;\n /** Metadata text (e.g. timestamp) shown in the alert meta slot */\n meta?: string;\n /** Called after the toast is fully dismissed and removed */\n onDismiss?: () => void;\n rounded?: RoundedSize | '';\n size?: ComponentSize;\n /**\n * Urgency level for screen readers.\n * - `'polite'` (default): uses `aria-live=\"polite\"` — announced after the user finishes their current action.\n * - `'assertive'`: uses `aria-live=\"assertive\"` — interrupts the user immediately. Use only for critical errors.\n */\n urgency?: 'polite' | 'assertive';\n variant?: 'solid' | 'flat' | 'bordered';\n};\n\ntype NormalizedToast = ToastItem & { id: string };\n\n/** Public API of the bit-toast element */\nexport interface ToastElement extends HTMLElement {\n add: (toast: ToastItem) => string;\n update: (id: string, updates: Partial<ToastItem>) => void;\n dismiss: (id: string) => void;\n clear: () => void;\n}\n\n/**\n * A toast notification container with Time Machine-style stacking animation.\n * Stacks up to 3 notifications with a 3D effect. Hover to expand all toasts.\n *\n * @element bit-toast\n *\n * @attr {string} position - 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'\n * @attr {number} max - Max toasts in DOM at once (default: 5)\n *\n * @fires add - When a toast is added `{ id }`\n * @fires dismiss - When a toast is dismissed `{ id }`\n *\n * @slot - Manually placed bit-alert elements\n *\n * @cssprop --toast-position - Position type (default: fixed)\n * @cssprop --toast-inset-top - Top inset\n * @cssprop --toast-inset-bottom - Bottom inset\n * @cssprop --toast-inset-left - Left inset\n * @cssprop --toast-inset-right - Right inset\n * @cssprop --toast-z-index - Z-index (default: 9999)\n * @cssprop --toast-max-width - Max width (default: 400px)\n * @cssprop --toast-gap - Gap between expanded toasts (default: 0.5rem)\n *\n * @example\n * ```html\n * <!-- Declarative: place once in HTML -->\n * <bit-toast position=\"bottom-right\"></bit-toast>\n *\n * <!-- Programmatic: use the singleton service -->\n * <script type=\"module\">\n * import { toast } from '@vielzeug/buildit';\n * toast.add({ message: 'Changes saved!', color: 'success' });\n * </script>\n * ```\n */\n/** Renders the actions slot for a toast item */\nfunction renderToastActions(toast: NormalizedToast, onDismiss: () => void) {\n if (!toast.actions?.length) return '';\n\n return html`\n <div slot=\"actions\" class=\"toast-actions\">\n ${toast.actions.map(\n (action) => html`\n <bit-button\n size=\"sm\"\n color=${action.color || toast.color || 'primary'}\n variant=${action.variant || 'solid'}\n @click=${() => {\n action.onClick?.();\n onDismiss();\n }}\n >${action.label}</bit-button\n >\n `,\n )}\n </div>\n `;\n}\n\nexport const TOAST_TAG = defineComponent<BitToastProps, BitToastEvents>({\n props: {\n max: { default: 5 },\n position: { default: 'bottom-right' },\n },\n setup({ emit, host, props }) {\n const toasts = signal<NormalizedToast[]>([]);\n const exitingIds = signal<Set<string>>(new Set());\n const containerRef = ref<HTMLDivElement>();\n const timers = new Map<\n string,\n {\n remaining: number;\n startedAt: number;\n timeoutId: number;\n }\n >();\n // Sequential dismiss queue — only one toast exits at a time so animations never overlap.\n const dismissQueue: string[] = [];\n let isDismissing = false;\n const setExiting = (id: string, value: boolean) => {\n const next = new Set(exitingIds.value);\n\n if (value) next.add(id);\n else next.delete(id);\n\n exitingIds.value = next;\n };\n const scheduleRemoval = (id: string, duration: number) => {\n const timeoutId = window.setTimeout(() => {\n removeToast(id);\n timers.delete(id);\n }, duration);\n\n timers.set(id, { remaining: duration, startedAt: Date.now(), timeoutId });\n };\n let isPaused = false;\n const pauseTimers = () => {\n if (isPaused) return;\n\n isPaused = true;\n for (const [id, t] of timers) {\n clearTimeout(t.timeoutId);\n timers.set(id, { ...t, remaining: Math.max(0, t.remaining - (Date.now() - t.startedAt)) });\n }\n };\n const resumeTimers = () => {\n if (!isPaused) return;\n\n isPaused = false;\n for (const [id, t] of timers) {\n if (t.remaining <= 0) continue;\n\n scheduleRemoval(id, t.remaining);\n }\n };\n const addToast = (toast: ToastItem): string => {\n const id = toast.id || crypto.randomUUID();\n const item: NormalizedToast = { dismissible: true, duration: 5000, ...toast, id };\n\n toasts.value = [...toasts.value, item].slice(-(props.max.value ?? 5));\n emit('add', { id });\n\n if (item.duration! > 0) scheduleRemoval(id, item.duration!);\n\n return id;\n };\n const removeToast = (id: string) => {\n // Cancel the auto-dismiss timer if one is running.\n const timer = timers.get(id);\n\n if (timer) {\n clearTimeout(timer.timeoutId);\n timers.delete(id);\n }\n\n // Skip if already exiting or already queued.\n if (exitingIds.value.has(id) || dismissQueue.includes(id)) return;\n\n if (isDismissing) {\n dismissQueue.push(id);\n\n return;\n }\n\n isDismissing = true;\n executeRemoval(id);\n };\n // Internal: actually animate and remove. Always called from processNextInQueue or directly\n // when the queue is empty.\n const executeRemoval = (id: string) => {\n // Guard: could have been removed by clearAll between queue entry and execution.\n if (exitingIds.value.has(id)) {\n processNextInQueue();\n\n return;\n }\n\n const item = toasts.value.find((t) => t.id === id);\n const wrapper = containerRef.value?.querySelector<HTMLElement>(`[data-toast-id=\"${id}\"]`);\n const finalize = () => {\n setExiting(id, false);\n toasts.value = toasts.value.filter((t) => t.id !== id);\n item?.onDismiss?.();\n emit('dismiss', { id });\n processNextInQueue();\n };\n\n if (wrapper) {\n setExiting(id, true);\n awaitExit(wrapper, finalize);\n } else {\n finalize();\n }\n };\n const processNextInQueue = () => {\n if (dismissQueue.length === 0) {\n isDismissing = false;\n\n return;\n }\n\n const nextId = dismissQueue.shift()!;\n\n executeRemoval(nextId);\n };\n const updateToast = (id: string, updates: Partial<ToastItem>) => {\n toasts.value = toasts.value.map((t) => (t.id === id ? { ...t, ...updates, id } : t));\n\n if (updates.duration === undefined) return;\n\n const timer = timers.get(id);\n\n if (timer) clearTimeout(timer.timeoutId);\n\n timers.delete(id);\n\n if (updates.duration > 0) scheduleRemoval(id, updates.duration);\n };\n const clearAll = () => {\n for (const [, t] of timers) clearTimeout(t.timeoutId);\n timers.clear();\n // Drain any pending queue entries and replace with the full current list so\n // they exit one-by-one in order.\n dismissQueue.length = 0;\n\n const ids = toasts.value.map((t) => t.id).filter((id) => !exitingIds.value.has(id));\n\n if (!ids.length) return;\n\n dismissQueue.push(...ids);\n\n if (!isDismissing) processNextInQueue();\n };\n\n onMount(() => {\n const el = host as ToastElement;\n\n el.add = addToast;\n el.update = updateToast;\n el.dismiss = removeToast;\n el.clear = clearAll;\n });\n\n const urgencyOf = (t: NormalizedToast) => t.urgency ?? (t.color === 'error' ? 'assertive' : 'polite');\n let focusPaused = false;\n let hoverPaused = false;\n const maybePause = () => pauseTimers();\n const maybeResume = () => {\n if (!focusPaused && !hoverPaused) resumeTimers();\n };\n const setHovered = (hovered: boolean) => {\n hoverPaused = hovered;\n host.classList.toggle('hovered', hovered);\n\n if (hovered) maybePause();\n else maybeResume();\n };\n const renderToastItem = (toast: NormalizedToast) => html`\n <div\n class=${classes({ exiting: () => exitingIds.value.has(toast.id), 'toast-wrapper': true })}\n data-toast-id=${toast.id}\n part=\"toast-wrapper\">\n <bit-alert\n color=${toast.color || (toast.urgency === 'assertive' ? 'error' : 'primary')}\n variant=${toast.variant || 'solid'}\n size=${toast.size || 'md'}\n rounded=${toast.rounded || 'md'}\n ?dismissible=${toast.dismissible}\n ?horizontal=${toast.horizontal}\n heading=${toast.heading || ''}\n @dismiss=${() => removeToast(toast.id)}>\n ${toast.meta ? html`<span slot=\"meta\">${toast.meta}</span>` : ''} ${toast.message}\n ${renderToastActions(toast, () => removeToast(toast.id))}\n </bit-alert>\n </div>\n `;\n\n return html`\n <div\n class=\"toast-container\"\n ref=${containerRef}\n @pointerenter=${() => setHovered(true)}\n @pointerleave=${() => setHovered(false)}\n @focusin=${() => {\n focusPaused = true;\n maybePause();\n }}\n @focusout=${() => {\n focusPaused = false;\n maybeResume();\n }}\n part=\"container\">\n <!-- Polite live region: normal informational toasts -->\n <div\n role=\"region\"\n aria-live=\"polite\"\n aria-relevant=\"additions removals\"\n aria-atomic=\"false\"\n aria-label=\"Notifications\"\n class=\"toast-live-region\">\n ${each(() => toasts.value.filter((t) => urgencyOf(t) === 'polite'), renderToastItem, undefined, {\n key: (toast) => toast.id,\n })}\n </div>\n <!-- Assertive live region: critical errors that interrupt immediately -->\n <div\n role=\"region\"\n aria-live=\"assertive\"\n aria-relevant=\"additions removals\"\n aria-atomic=\"false\"\n aria-label=\"Critical notifications\"\n class=\"toast-live-region\">\n ${each(() => toasts.value.filter((t) => urgencyOf(t) === 'assertive'), renderToastItem, undefined, {\n key: (toast) => toast.id,\n })}\n </div>\n <slot></slot>\n </div>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n tag: 'bit-toast',\n});\n\n// ─── Singleton toast service ─────────────────────────────────────────────────\n\nconst getHost = (): ToastElement => {\n let el = document.querySelector<ToastElement>('bit-toast');\n\n if (!el) {\n el = document.createElement('bit-toast') as ToastElement;\n document.body.appendChild(el);\n }\n\n return el;\n};\n\n/**\n * Singleton service for triggering toasts without direct DOM references.\n *\n * @example\n * ```ts\n * import { toast } from '@vielzeug/buildit';\n *\n * toast.add({ message: 'Saved!', color: 'success' });\n *\n * const id = toast.add({ message: 'Uploading…', duration: 0, dismissible: false });\n * toast.update(id, { message: 'Done!', color: 'success', duration: 3000, dismissible: true });\n *\n * await toast.promise(uploadFile(), {\n * loading: 'Uploading…',\n * success: (url) => `Uploaded to ${url}`,\n * error: 'Upload failed',\n * });\n * ```\n */\nexport const toast = {\n /** Add a toast and return its id */\n add(item: ToastItem): string {\n return getHost().add(item);\n },\n\n /** Dismiss all toasts (animated) */\n clear(): void {\n getHost().clear();\n },\n /** Configure the auto-created container. Call before the first `add()` if the defaults need to change. */\n configure(config: BitToastProps): void {\n const el = getHost();\n\n if (config.position) el.setAttribute('position', config.position);\n\n if (config.max != null) el.setAttribute('max', String(config.max));\n },\n\n /**\n * Shows a loading toast tied to a promise.\n * Updates to success/error when the promise settles.\n */\n async promise<T>(\n promise: Promise<T>,\n messages: {\n error: string | ((err: unknown) => string);\n loading: string;\n success: string | ((data: T) => string);\n },\n ): Promise<T> {\n const id = toast.add({ color: 'primary', dismissible: false, duration: 0, message: messages.loading });\n\n try {\n const data = await promise;\n\n toast.update(id, {\n color: 'success',\n dismissible: true,\n duration: 5000,\n message: typeof messages.success === 'function' ? messages.success(data) : messages.success,\n });\n\n return data;\n } catch (err) {\n toast.update(id, {\n color: 'error',\n dismissible: true,\n duration: 5000,\n message: typeof messages.error === 'function' ? messages.error(err) : messages.error,\n });\n throw err;\n }\n },\n\n /** Dismiss a toast by id */\n remove(id: string): void {\n getHost().dismiss(id);\n },\n\n /** Update an existing toast in-place */\n update(id: string, updates: Partial<ToastItem>): void {\n getHost().update(id, updates);\n },\n};\n"],"mappings":"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"}
package/dist/toast.js ADDED
@@ -0,0 +1,221 @@
1
+ import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
2
+ import "./styles/index.js";
3
+ import { n as t } from "./craftit/dist/directives/classes.js";
4
+ import { d as n } from "./craftit/dist/directives/each.js";
5
+ import "./craftit/dist/directives/index.js";
6
+ import { awaitExit as r } from "./utils/animation.js";
7
+ import i from "./feedback/toast/toast.css?inline.js";
8
+ import { defineComponent as a, html as o, onMount as s, ref as c, signal as l } from "@vielzeug/craftit";
9
+ //#region src/feedback/toast/toast.ts
10
+ function u(e, t) {
11
+ return e.actions?.length ? o`
12
+ <div slot="actions" class="toast-actions">
13
+ ${e.actions.map((n) => o`
14
+ <bit-button
15
+ size="sm"
16
+ color=${n.color || e.color || "primary"}
17
+ variant=${n.variant || "solid"}
18
+ @click=${() => {
19
+ n.onClick?.(), t();
20
+ }}
21
+ >${n.label}</bit-button
22
+ >
23
+ `)}
24
+ </div>
25
+ ` : "";
26
+ }
27
+ var d = a({
28
+ props: {
29
+ max: { default: 5 },
30
+ position: { default: "bottom-right" }
31
+ },
32
+ setup({ emit: e, host: i, props: a }) {
33
+ let d = l([]), f = l(/* @__PURE__ */ new Set()), p = c(), m = /* @__PURE__ */ new Map(), h = [], g = !1, _ = (e, t) => {
34
+ let n = new Set(f.value);
35
+ t ? n.add(e) : n.delete(e), f.value = n;
36
+ }, v = (e, t) => {
37
+ let n = window.setTimeout(() => {
38
+ C(e), m.delete(e);
39
+ }, t);
40
+ m.set(e, {
41
+ remaining: t,
42
+ startedAt: Date.now(),
43
+ timeoutId: n
44
+ });
45
+ }, y = !1, b = () => {
46
+ if (!y) {
47
+ y = !0;
48
+ for (let [e, t] of m) clearTimeout(t.timeoutId), m.set(e, {
49
+ ...t,
50
+ remaining: Math.max(0, t.remaining - (Date.now() - t.startedAt))
51
+ });
52
+ }
53
+ }, x = () => {
54
+ if (y) {
55
+ y = !1;
56
+ for (let [e, t] of m) t.remaining <= 0 || v(e, t.remaining);
57
+ }
58
+ }, S = (t) => {
59
+ let n = t.id || crypto.randomUUID(), r = {
60
+ dismissible: !0,
61
+ duration: 5e3,
62
+ ...t,
63
+ id: n
64
+ };
65
+ return d.value = [...d.value, r].slice(-(a.max.value ?? 5)), e("add", { id: n }), r.duration > 0 && v(n, r.duration), n;
66
+ }, C = (e) => {
67
+ let t = m.get(e);
68
+ if (t && (clearTimeout(t.timeoutId), m.delete(e)), !(f.value.has(e) || h.includes(e))) {
69
+ if (g) {
70
+ h.push(e);
71
+ return;
72
+ }
73
+ g = !0, w(e);
74
+ }
75
+ }, w = (t) => {
76
+ if (f.value.has(t)) {
77
+ T();
78
+ return;
79
+ }
80
+ let n = d.value.find((e) => e.id === t), i = p.value?.querySelector(`[data-toast-id="${t}"]`), a = () => {
81
+ _(t, !1), d.value = d.value.filter((e) => e.id !== t), n?.onDismiss?.(), e("dismiss", { id: t }), T();
82
+ };
83
+ i ? (_(t, !0), r(i, a)) : a();
84
+ }, T = () => {
85
+ if (h.length === 0) {
86
+ g = !1;
87
+ return;
88
+ }
89
+ w(h.shift());
90
+ }, E = (e, t) => {
91
+ if (d.value = d.value.map((n) => n.id === e ? {
92
+ ...n,
93
+ ...t,
94
+ id: e
95
+ } : n), t.duration === void 0) return;
96
+ let n = m.get(e);
97
+ n && clearTimeout(n.timeoutId), m.delete(e), t.duration > 0 && v(e, t.duration);
98
+ }, D = () => {
99
+ for (let [, e] of m) clearTimeout(e.timeoutId);
100
+ m.clear(), h.length = 0;
101
+ let e = d.value.map((e) => e.id).filter((e) => !f.value.has(e));
102
+ e.length && (h.push(...e), g || T());
103
+ };
104
+ s(() => {
105
+ let e = i;
106
+ e.add = S, e.update = E, e.dismiss = C, e.clear = D;
107
+ });
108
+ let O = (e) => e.urgency ?? (e.color === "error" ? "assertive" : "polite"), k = !1, A = !1, j = () => b(), M = () => {
109
+ !k && !A && x();
110
+ }, N = (e) => {
111
+ A = e, i.classList.toggle("hovered", e), e ? j() : M();
112
+ }, P = (e) => o`
113
+ <div
114
+ class=${t({
115
+ exiting: () => f.value.has(e.id),
116
+ "toast-wrapper": !0
117
+ })}
118
+ data-toast-id=${e.id}
119
+ part="toast-wrapper">
120
+ <bit-alert
121
+ color=${e.color || (e.urgency === "assertive" ? "error" : "primary")}
122
+ variant=${e.variant || "solid"}
123
+ size=${e.size || "md"}
124
+ rounded=${e.rounded || "md"}
125
+ ?dismissible=${e.dismissible}
126
+ ?horizontal=${e.horizontal}
127
+ heading=${e.heading || ""}
128
+ @dismiss=${() => C(e.id)}>
129
+ ${e.meta ? o`<span slot="meta">${e.meta}</span>` : ""} ${e.message}
130
+ ${u(e, () => C(e.id))}
131
+ </bit-alert>
132
+ </div>
133
+ `;
134
+ return o`
135
+ <div
136
+ class="toast-container"
137
+ ref=${p}
138
+ @pointerenter=${() => N(!0)}
139
+ @pointerleave=${() => N(!1)}
140
+ @focusin=${() => {
141
+ k = !0, j();
142
+ }}
143
+ @focusout=${() => {
144
+ k = !1, M();
145
+ }}
146
+ part="container">
147
+ <!-- Polite live region: normal informational toasts -->
148
+ <div
149
+ role="region"
150
+ aria-live="polite"
151
+ aria-relevant="additions removals"
152
+ aria-atomic="false"
153
+ aria-label="Notifications"
154
+ class="toast-live-region">
155
+ ${n(() => d.value.filter((e) => O(e) === "polite"), P, void 0, { key: (e) => e.id })}
156
+ </div>
157
+ <!-- Assertive live region: critical errors that interrupt immediately -->
158
+ <div
159
+ role="region"
160
+ aria-live="assertive"
161
+ aria-relevant="additions removals"
162
+ aria-atomic="false"
163
+ aria-label="Critical notifications"
164
+ class="toast-live-region">
165
+ ${n(() => d.value.filter((e) => O(e) === "assertive"), P, void 0, { key: (e) => e.id })}
166
+ </div>
167
+ <slot></slot>
168
+ </div>
169
+ `;
170
+ },
171
+ styles: [e, i],
172
+ tag: "bit-toast"
173
+ }), f = () => {
174
+ let e = document.querySelector("bit-toast");
175
+ return e || (e = document.createElement("bit-toast"), document.body.appendChild(e)), e;
176
+ }, p = {
177
+ add(e) {
178
+ return f().add(e);
179
+ },
180
+ clear() {
181
+ f().clear();
182
+ },
183
+ configure(e) {
184
+ let t = f();
185
+ e.position && t.setAttribute("position", e.position), e.max != null && t.setAttribute("max", String(e.max));
186
+ },
187
+ async promise(e, t) {
188
+ let n = p.add({
189
+ color: "primary",
190
+ dismissible: !1,
191
+ duration: 0,
192
+ message: t.loading
193
+ });
194
+ try {
195
+ let r = await e;
196
+ return p.update(n, {
197
+ color: "success",
198
+ dismissible: !0,
199
+ duration: 5e3,
200
+ message: typeof t.success == "function" ? t.success(r) : t.success
201
+ }), r;
202
+ } catch (e) {
203
+ throw p.update(n, {
204
+ color: "error",
205
+ dismissible: !0,
206
+ duration: 5e3,
207
+ message: typeof t.error == "function" ? t.error(e) : t.error
208
+ }), e;
209
+ }
210
+ },
211
+ remove(e) {
212
+ f().dismiss(e);
213
+ },
214
+ update(e, t) {
215
+ f().update(e, t);
216
+ }
217
+ };
218
+ //#endregion
219
+ export { d as TOAST_TAG, p as toast };
220
+
221
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","names":[],"sources":["../src/feedback/toast/toast.ts"],"sourcesContent":["import { defineComponent, html, onMount, ref, signal } from '@vielzeug/craftit';\nimport { classes, each } from '@vielzeug/craftit/directives';\n\nimport type { ComponentSize, RoundedSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { reducedMotionMixin } from '../../styles';\nimport { awaitExit } from '../../utils/animation';\nimport componentStyles from './toast.css?inline';\n\n/** Toast container properties */\n\nexport type BitToastEvents = {\n add: { id: string };\n dismiss: { id: string };\n};\n\nexport type BitToastProps = {\n max?: number;\n position?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n};\n\n/** Individual toast notification */\nexport type ToastItem = {\n actions?: Array<{\n color?: ThemeColor;\n label: string;\n onClick?: () => void;\n variant?: VisualVariant;\n }>;\n color?: ThemeColor;\n dismissible?: boolean;\n /** Auto-dismiss delay in ms. Set to 0 for persistent toasts (default: 5000) */\n duration?: number;\n heading?: string;\n /** Show message and actions side-by-side (horizontal layout) */\n horizontal?: boolean;\n /** Auto-generated via crypto.randomUUID() if omitted */\n id?: string;\n message: string;\n /** Metadata text (e.g. timestamp) shown in the alert meta slot */\n meta?: string;\n /** Called after the toast is fully dismissed and removed */\n onDismiss?: () => void;\n rounded?: RoundedSize | '';\n size?: ComponentSize;\n /**\n * Urgency level for screen readers.\n * - `'polite'` (default): uses `aria-live=\"polite\"` — announced after the user finishes their current action.\n * - `'assertive'`: uses `aria-live=\"assertive\"` — interrupts the user immediately. Use only for critical errors.\n */\n urgency?: 'polite' | 'assertive';\n variant?: 'solid' | 'flat' | 'bordered';\n};\n\ntype NormalizedToast = ToastItem & { id: string };\n\n/** Public API of the bit-toast element */\nexport interface ToastElement extends HTMLElement {\n add: (toast: ToastItem) => string;\n update: (id: string, updates: Partial<ToastItem>) => void;\n dismiss: (id: string) => void;\n clear: () => void;\n}\n\n/**\n * A toast notification container with Time Machine-style stacking animation.\n * Stacks up to 3 notifications with a 3D effect. Hover to expand all toasts.\n *\n * @element bit-toast\n *\n * @attr {string} position - 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right'\n * @attr {number} max - Max toasts in DOM at once (default: 5)\n *\n * @fires add - When a toast is added `{ id }`\n * @fires dismiss - When a toast is dismissed `{ id }`\n *\n * @slot - Manually placed bit-alert elements\n *\n * @cssprop --toast-position - Position type (default: fixed)\n * @cssprop --toast-inset-top - Top inset\n * @cssprop --toast-inset-bottom - Bottom inset\n * @cssprop --toast-inset-left - Left inset\n * @cssprop --toast-inset-right - Right inset\n * @cssprop --toast-z-index - Z-index (default: 9999)\n * @cssprop --toast-max-width - Max width (default: 400px)\n * @cssprop --toast-gap - Gap between expanded toasts (default: 0.5rem)\n *\n * @example\n * ```html\n * <!-- Declarative: place once in HTML -->\n * <bit-toast position=\"bottom-right\"></bit-toast>\n *\n * <!-- Programmatic: use the singleton service -->\n * <script type=\"module\">\n * import { toast } from '@vielzeug/buildit';\n * toast.add({ message: 'Changes saved!', color: 'success' });\n * </script>\n * ```\n */\n/** Renders the actions slot for a toast item */\nfunction renderToastActions(toast: NormalizedToast, onDismiss: () => void) {\n if (!toast.actions?.length) return '';\n\n return html`\n <div slot=\"actions\" class=\"toast-actions\">\n ${toast.actions.map(\n (action) => html`\n <bit-button\n size=\"sm\"\n color=${action.color || toast.color || 'primary'}\n variant=${action.variant || 'solid'}\n @click=${() => {\n action.onClick?.();\n onDismiss();\n }}\n >${action.label}</bit-button\n >\n `,\n )}\n </div>\n `;\n}\n\nexport const TOAST_TAG = defineComponent<BitToastProps, BitToastEvents>({\n props: {\n max: { default: 5 },\n position: { default: 'bottom-right' },\n },\n setup({ emit, host, props }) {\n const toasts = signal<NormalizedToast[]>([]);\n const exitingIds = signal<Set<string>>(new Set());\n const containerRef = ref<HTMLDivElement>();\n const timers = new Map<\n string,\n {\n remaining: number;\n startedAt: number;\n timeoutId: number;\n }\n >();\n // Sequential dismiss queue — only one toast exits at a time so animations never overlap.\n const dismissQueue: string[] = [];\n let isDismissing = false;\n const setExiting = (id: string, value: boolean) => {\n const next = new Set(exitingIds.value);\n\n if (value) next.add(id);\n else next.delete(id);\n\n exitingIds.value = next;\n };\n const scheduleRemoval = (id: string, duration: number) => {\n const timeoutId = window.setTimeout(() => {\n removeToast(id);\n timers.delete(id);\n }, duration);\n\n timers.set(id, { remaining: duration, startedAt: Date.now(), timeoutId });\n };\n let isPaused = false;\n const pauseTimers = () => {\n if (isPaused) return;\n\n isPaused = true;\n for (const [id, t] of timers) {\n clearTimeout(t.timeoutId);\n timers.set(id, { ...t, remaining: Math.max(0, t.remaining - (Date.now() - t.startedAt)) });\n }\n };\n const resumeTimers = () => {\n if (!isPaused) return;\n\n isPaused = false;\n for (const [id, t] of timers) {\n if (t.remaining <= 0) continue;\n\n scheduleRemoval(id, t.remaining);\n }\n };\n const addToast = (toast: ToastItem): string => {\n const id = toast.id || crypto.randomUUID();\n const item: NormalizedToast = { dismissible: true, duration: 5000, ...toast, id };\n\n toasts.value = [...toasts.value, item].slice(-(props.max.value ?? 5));\n emit('add', { id });\n\n if (item.duration! > 0) scheduleRemoval(id, item.duration!);\n\n return id;\n };\n const removeToast = (id: string) => {\n // Cancel the auto-dismiss timer if one is running.\n const timer = timers.get(id);\n\n if (timer) {\n clearTimeout(timer.timeoutId);\n timers.delete(id);\n }\n\n // Skip if already exiting or already queued.\n if (exitingIds.value.has(id) || dismissQueue.includes(id)) return;\n\n if (isDismissing) {\n dismissQueue.push(id);\n\n return;\n }\n\n isDismissing = true;\n executeRemoval(id);\n };\n // Internal: actually animate and remove. Always called from processNextInQueue or directly\n // when the queue is empty.\n const executeRemoval = (id: string) => {\n // Guard: could have been removed by clearAll between queue entry and execution.\n if (exitingIds.value.has(id)) {\n processNextInQueue();\n\n return;\n }\n\n const item = toasts.value.find((t) => t.id === id);\n const wrapper = containerRef.value?.querySelector<HTMLElement>(`[data-toast-id=\"${id}\"]`);\n const finalize = () => {\n setExiting(id, false);\n toasts.value = toasts.value.filter((t) => t.id !== id);\n item?.onDismiss?.();\n emit('dismiss', { id });\n processNextInQueue();\n };\n\n if (wrapper) {\n setExiting(id, true);\n awaitExit(wrapper, finalize);\n } else {\n finalize();\n }\n };\n const processNextInQueue = () => {\n if (dismissQueue.length === 0) {\n isDismissing = false;\n\n return;\n }\n\n const nextId = dismissQueue.shift()!;\n\n executeRemoval(nextId);\n };\n const updateToast = (id: string, updates: Partial<ToastItem>) => {\n toasts.value = toasts.value.map((t) => (t.id === id ? { ...t, ...updates, id } : t));\n\n if (updates.duration === undefined) return;\n\n const timer = timers.get(id);\n\n if (timer) clearTimeout(timer.timeoutId);\n\n timers.delete(id);\n\n if (updates.duration > 0) scheduleRemoval(id, updates.duration);\n };\n const clearAll = () => {\n for (const [, t] of timers) clearTimeout(t.timeoutId);\n timers.clear();\n // Drain any pending queue entries and replace with the full current list so\n // they exit one-by-one in order.\n dismissQueue.length = 0;\n\n const ids = toasts.value.map((t) => t.id).filter((id) => !exitingIds.value.has(id));\n\n if (!ids.length) return;\n\n dismissQueue.push(...ids);\n\n if (!isDismissing) processNextInQueue();\n };\n\n onMount(() => {\n const el = host as ToastElement;\n\n el.add = addToast;\n el.update = updateToast;\n el.dismiss = removeToast;\n el.clear = clearAll;\n });\n\n const urgencyOf = (t: NormalizedToast) => t.urgency ?? (t.color === 'error' ? 'assertive' : 'polite');\n let focusPaused = false;\n let hoverPaused = false;\n const maybePause = () => pauseTimers();\n const maybeResume = () => {\n if (!focusPaused && !hoverPaused) resumeTimers();\n };\n const setHovered = (hovered: boolean) => {\n hoverPaused = hovered;\n host.classList.toggle('hovered', hovered);\n\n if (hovered) maybePause();\n else maybeResume();\n };\n const renderToastItem = (toast: NormalizedToast) => html`\n <div\n class=${classes({ exiting: () => exitingIds.value.has(toast.id), 'toast-wrapper': true })}\n data-toast-id=${toast.id}\n part=\"toast-wrapper\">\n <bit-alert\n color=${toast.color || (toast.urgency === 'assertive' ? 'error' : 'primary')}\n variant=${toast.variant || 'solid'}\n size=${toast.size || 'md'}\n rounded=${toast.rounded || 'md'}\n ?dismissible=${toast.dismissible}\n ?horizontal=${toast.horizontal}\n heading=${toast.heading || ''}\n @dismiss=${() => removeToast(toast.id)}>\n ${toast.meta ? html`<span slot=\"meta\">${toast.meta}</span>` : ''} ${toast.message}\n ${renderToastActions(toast, () => removeToast(toast.id))}\n </bit-alert>\n </div>\n `;\n\n return html`\n <div\n class=\"toast-container\"\n ref=${containerRef}\n @pointerenter=${() => setHovered(true)}\n @pointerleave=${() => setHovered(false)}\n @focusin=${() => {\n focusPaused = true;\n maybePause();\n }}\n @focusout=${() => {\n focusPaused = false;\n maybeResume();\n }}\n part=\"container\">\n <!-- Polite live region: normal informational toasts -->\n <div\n role=\"region\"\n aria-live=\"polite\"\n aria-relevant=\"additions removals\"\n aria-atomic=\"false\"\n aria-label=\"Notifications\"\n class=\"toast-live-region\">\n ${each(() => toasts.value.filter((t) => urgencyOf(t) === 'polite'), renderToastItem, undefined, {\n key: (toast) => toast.id,\n })}\n </div>\n <!-- Assertive live region: critical errors that interrupt immediately -->\n <div\n role=\"region\"\n aria-live=\"assertive\"\n aria-relevant=\"additions removals\"\n aria-atomic=\"false\"\n aria-label=\"Critical notifications\"\n class=\"toast-live-region\">\n ${each(() => toasts.value.filter((t) => urgencyOf(t) === 'assertive'), renderToastItem, undefined, {\n key: (toast) => toast.id,\n })}\n </div>\n <slot></slot>\n </div>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n tag: 'bit-toast',\n});\n\n// ─── Singleton toast service ─────────────────────────────────────────────────\n\nconst getHost = (): ToastElement => {\n let el = document.querySelector<ToastElement>('bit-toast');\n\n if (!el) {\n el = document.createElement('bit-toast') as ToastElement;\n document.body.appendChild(el);\n }\n\n return el;\n};\n\n/**\n * Singleton service for triggering toasts without direct DOM references.\n *\n * @example\n * ```ts\n * import { toast } from '@vielzeug/buildit';\n *\n * toast.add({ message: 'Saved!', color: 'success' });\n *\n * const id = toast.add({ message: 'Uploading…', duration: 0, dismissible: false });\n * toast.update(id, { message: 'Done!', color: 'success', duration: 3000, dismissible: true });\n *\n * await toast.promise(uploadFile(), {\n * loading: 'Uploading…',\n * success: (url) => `Uploaded to ${url}`,\n * error: 'Upload failed',\n * });\n * ```\n */\nexport const toast = {\n /** Add a toast and return its id */\n add(item: ToastItem): string {\n return getHost().add(item);\n },\n\n /** Dismiss all toasts (animated) */\n clear(): void {\n getHost().clear();\n },\n /** Configure the auto-created container. Call before the first `add()` if the defaults need to change. */\n configure(config: BitToastProps): void {\n const el = getHost();\n\n if (config.position) el.setAttribute('position', config.position);\n\n if (config.max != null) el.setAttribute('max', String(config.max));\n },\n\n /**\n * Shows a loading toast tied to a promise.\n * Updates to success/error when the promise settles.\n */\n async promise<T>(\n promise: Promise<T>,\n messages: {\n error: string | ((err: unknown) => string);\n loading: string;\n success: string | ((data: T) => string);\n },\n ): Promise<T> {\n const id = toast.add({ color: 'primary', dismissible: false, duration: 0, message: messages.loading });\n\n try {\n const data = await promise;\n\n toast.update(id, {\n color: 'success',\n dismissible: true,\n duration: 5000,\n message: typeof messages.success === 'function' ? messages.success(data) : messages.success,\n });\n\n return data;\n } catch (err) {\n toast.update(id, {\n color: 'error',\n dismissible: true,\n duration: 5000,\n message: typeof messages.error === 'function' ? messages.error(err) : messages.error,\n });\n throw err;\n }\n },\n\n /** Dismiss a toast by id */\n remove(id: string): void {\n getHost().dismiss(id);\n },\n\n /** Update an existing toast in-place */\n update(id: string, updates: Partial<ToastItem>): void {\n getHost().update(id, updates);\n },\n};\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./styles/mixins/theme.css.cjs`);require(`./styles/index.cjs`);const t=require(`./overlay/tooltip/tooltip.css?inline.cjs`);let n=require(`@vielzeug/craftit`),r=require(`@vielzeug/floatit`);var i=8,a=4,o=(0,n.defineComponent)({props:{"close-delay":{default:0},content:{default:``},delay:{default:0},disabled:{default:!1},open:{default:void 0},placement:{default:`top`},size:{default:void 0},trigger:{default:`hover,focus`},variant:{default:void 0}},setup({host:e,props:t}){let o=(0,n.signal)(!1),s=(0,n.signal)(`top`),c=null,l=null,u=null,d=null,f=(0,n.createId)(`tooltip`),p=(0,n.computed)(()=>String(t.trigger.value).split(`,`).map(e=>e.trim()).filter(Boolean));function m(){return(e.shadowRoot?.querySelector(`slot:not([name])`))?.assignedElements({flatten:!0})?.[0]??null}function h(){if(!d)return;let e=m();e&&(0,r.computePosition)(e,d,{middleware:[(0,r.offset)(i),(0,r.flip)(),(0,r.shift)({padding:6})],placement:t.placement.value}).then(({placement:e,x:t,y:n})=>{if(!d)return;let r=e.split(`-`)[0],i=r===`left`?t-a:t;d.style.left=`${i}px`,d.style.top=`${n}px`,s.value=r})}function g(){t.open.value!==void 0||t.disabled.value||!t.content.value&&!(((e.shadowRoot?.querySelector(`slot[name="content"]`))?.assignedNodes({flatten:!0}).length??0)>0)||(u&&=(clearTimeout(u),null),l&&clearTimeout(l),l=setTimeout(()=>{o.value=!0,d&&!d.matches(`:popover-open`)&&d.showPopover();let e=m();e&&d?(c?.(),c=(0,r.autoUpdate)(e,d,h)):requestAnimationFrame(()=>h())},Number(t.delay.value)||0))}function _(){if(t.open.value!==void 0)return;l&&=(clearTimeout(l),null);let e=Number(t[`close-delay`].value)||0;e>0?(u&&clearTimeout(u),u=setTimeout(()=>{u=null,v()},e)):v()}function v(){c?.(),c=null,o.value=!1,d?.matches(`:popover-open`)&&d.hidePopover()}function y(){o.value?_():g()}(0,n.onMount)(()=>{let i=e.shadowRoot?.querySelector(`slot:not([name])`);if(!i)return;let a=()=>{s();let e=i.assignedElements({flatten:!0})[0];if(!e)return;e.setAttribute(`aria-describedby`,f);let t=p.value;t.includes(`hover`)&&(e.addEventListener(`pointerenter`,g),e.addEventListener(`pointerleave`,_)),t.includes(`focus`)&&(e.addEventListener(`focusin`,g),e.addEventListener(`focusout`,_)),t.includes(`click`)&&e.addEventListener(`click`,y),document.addEventListener(`keydown`,b)},s=()=>{let e=i.assignedElements({flatten:!0})[0];e&&(e.removeAttribute(`aria-describedby`),e.removeEventListener(`pointerenter`,g),e.removeEventListener(`pointerleave`,_),e.removeEventListener(`focusin`,g),e.removeEventListener(`focusout`,_),e.removeEventListener(`click`,y),document.removeEventListener(`keydown`,b))};return(0,n.onSlotChange)(`default`,a),(0,n.watch)(t.open,e=>{if(e!=null)if(e){o.value=!0,d&&!d.matches(`:popover-open`)&&d.showPopover();let e=m();e&&d?(c?.(),c=(0,r.autoUpdate)(e,d,h)):requestAnimationFrame(()=>h())}else v()}),()=>{s(),l&&clearTimeout(l),u&&clearTimeout(u),c?.(),c=null,d?.matches(`:popover-open`)&&d.hidePopover()}});function b(e){e.key===`Escape`&&_()}return n.html`
2
+ <slot></slot>
3
+ <div
4
+ class="tooltip"
5
+ part="tooltip"
6
+ id="${f}"
7
+ role="tooltip"
8
+ popover="manual"
9
+ ref=${e=>{d=e}}
10
+ :data-placement="${s}"
11
+ :aria-hidden="${()=>String(!o.value)}">
12
+ <slot name="content">${()=>t.content.value}</slot>
13
+ </div>
14
+ `},styles:[e.forcedColorsMixin,t.default],tag:`bit-tooltip`});exports.TOOLTIP_TAG=o;
15
+ //# sourceMappingURL=tooltip.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.cjs","names":[],"sources":["../src/overlay/tooltip/tooltip.ts"],"sourcesContent":["import type { Placement } from '@vielzeug/floatit';\n\nimport { computed, createId, defineComponent, html, onMount, onSlotChange, signal, watch } from '@vielzeug/craftit';\nimport { autoUpdate, computePosition, flip, offset, shift } from '@vielzeug/floatit';\n\nimport type { ComponentSize } from '../../types';\n\nimport { forcedColorsMixin } from '../../styles';\n\ntype TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\ntype TooltipTrigger = 'hover' | 'focus' | 'click';\n\nconst TOOLTIP_OFFSET = 8; // gap from trigger to tooltip edge\nconst LEFT_GAP_COMPENSATION = 4; // left placement looks visually tighter in practice\n\nimport styles from './tooltip.css?inline';\n\n/** Tooltip component properties */\nexport type BitTooltipProps = {\n /** Hide delay in ms (useful to keep tooltip open when moving focus between trigger and tooltip) */\n 'close-delay'?: number;\n /** Tooltip text content */\n content?: string;\n /** Show delay in ms */\n delay?: number;\n /** Disable the tooltip */\n disabled?: boolean;\n /** Controlled open state. When provided, the tooltip acts as a controlled component and ignores trigger events for open/close. */\n open?: boolean;\n /** Preferred placement relative to trigger */\n placement?: TooltipPlacement;\n /** Tooltip size */\n size?: ComponentSize;\n /** Which trigger(s) show/hide the tooltip — comma-separated if multiple, e.g. \"hover,focus\" */\n trigger?: string;\n /** Visual variant: 'dark' (default) or 'light' */\n variant?: 'dark' | 'light';\n};\n\n/**\n * A lightweight tooltip shown on hover/focus/click relative to the slotted trigger.\n *\n * @element bit-tooltip\n *\n * @attr {string} content - Tooltip text content\n * @attr {string} placement - 'top' | 'bottom' | 'left' | 'right' (default: 'top')\n * @attr {string} trigger - 'hover' | 'focus' | 'click' or comma-separated combination\n * @attr {number} delay - Show delay in milliseconds (default: 0)\n * @attr {string} size - Size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - 'dark' (default) | 'light'\n * @attr {boolean} disabled - Disable the tooltip\n *\n * @slot - Trigger element that the tooltip is anchored to\n * @slot content - Complex tooltip content (overrides the `content` attribute)\n *\n * @cssprop --tooltip-max-width - Max width of the tooltip bubble\n *\n * @example\n * ```html\n * <bit-tooltip content=\"Copy to clipboard\">\n * <button>Copy</button>\n * </bit-tooltip>\n *\n * <bit-tooltip placement=\"right\" trigger=\"focus,hover\" content=\"Required field\">\n * <input type=\"text\" />\n * </bit-tooltip>\n * ```\n */\nexport const TOOLTIP_TAG = defineComponent<BitTooltipProps>({\n props: {\n 'close-delay': { default: 0 },\n content: { default: '' },\n delay: { default: 0 },\n disabled: { default: false },\n open: { default: undefined },\n placement: { default: 'top' },\n size: { default: undefined },\n trigger: { default: 'hover,focus' },\n variant: { default: undefined },\n },\n setup({ host, props }) {\n const visible = signal(false);\n const activePlacement = signal<TooltipPlacement>('top');\n let autoUpdateCleanup: (() => void) | null = null;\n let showTimer: ReturnType<typeof setTimeout> | null = null;\n let hideTimer: ReturnType<typeof setTimeout> | null = null;\n let tooltipEl: HTMLElement | null = null;\n const tooltipId = createId('tooltip');\n const triggers = computed<TooltipTrigger[]>(() =>\n String(props.trigger.value)\n .split(',')\n .map((t: string) => t.trim() as TooltipTrigger)\n .filter(Boolean),\n );\n\n function getTriggerEl(): Element | null {\n // First slotted element is the trigger\n const slot = host.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n const assigned = slot?.assignedElements({ flatten: true });\n\n return assigned?.[0] ?? null;\n }\n function updatePosition() {\n if (!tooltipEl) return;\n\n const triggerEl = getTriggerEl();\n\n if (!triggerEl) return;\n\n computePosition(triggerEl, tooltipEl, {\n middleware: [offset(TOOLTIP_OFFSET), flip(), shift({ padding: 6 })],\n placement: props.placement.value as Placement,\n }).then(({ placement, x, y }) => {\n if (!tooltipEl) return;\n\n const side = placement.split('-')[0] as TooltipPlacement;\n const adjustedX = side === 'left' ? x - LEFT_GAP_COMPENSATION : x;\n\n tooltipEl.style.left = `${adjustedX}px`;\n tooltipEl.style.top = `${y}px`;\n\n activePlacement.value = side;\n });\n }\n function show() {\n if (props.open.value !== undefined) return; // controlled mode\n\n const hasSlottedContent = () => {\n const contentSlot = host.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"content\"]');\n\n return (contentSlot?.assignedNodes({ flatten: true }).length ?? 0) > 0;\n };\n\n if (props.disabled.value || (!props.content.value && !hasSlottedContent())) return;\n\n if (hideTimer) {\n clearTimeout(hideTimer);\n hideTimer = null;\n }\n\n if (showTimer) clearTimeout(showTimer);\n\n showTimer = setTimeout(\n () => {\n visible.value = true;\n\n if (tooltipEl && !tooltipEl.matches(':popover-open')) {\n tooltipEl.showPopover();\n }\n\n // Start autoUpdate: repositions on scroll, resize, and reference size change\n const triggerEl = getTriggerEl();\n\n if (triggerEl && tooltipEl) {\n autoUpdateCleanup?.();\n autoUpdateCleanup = autoUpdate(triggerEl, tooltipEl, updatePosition);\n } else {\n requestAnimationFrame(() => updatePosition());\n }\n },\n Number(props.delay.value) || 0,\n );\n }\n function hide() {\n if (props.open.value !== undefined) return; // controlled mode\n\n if (showTimer) {\n clearTimeout(showTimer);\n showTimer = null;\n }\n\n const closeDelay = Number(props['close-delay'].value) || 0;\n\n if (closeDelay > 0) {\n if (hideTimer) clearTimeout(hideTimer);\n\n hideTimer = setTimeout(() => {\n hideTimer = null;\n _doHide();\n }, closeDelay);\n } else {\n _doHide();\n }\n }\n function _doHide() {\n autoUpdateCleanup?.();\n autoUpdateCleanup = null;\n visible.value = false;\n\n if (tooltipEl?.matches(':popover-open')) {\n tooltipEl.hidePopover();\n }\n }\n function toggleClick() {\n if (visible.value) hide();\n else show();\n }\n onMount(() => {\n const slot = host.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n\n if (!slot) return;\n\n const bindTriggerEvents = () => {\n unbindTriggerEvents(); // clean up previous bindings\n\n const triggerEl = slot.assignedElements({ flatten: true })[0] as HTMLElement | undefined;\n\n if (!triggerEl) return;\n\n triggerEl.setAttribute('aria-describedby', tooltipId);\n\n const t = triggers.value;\n\n if (t.includes('hover')) {\n triggerEl.addEventListener('pointerenter', show);\n triggerEl.addEventListener('pointerleave', hide);\n }\n\n if (t.includes('focus')) {\n triggerEl.addEventListener('focusin', show);\n triggerEl.addEventListener('focusout', hide);\n }\n\n if (t.includes('click')) {\n triggerEl.addEventListener('click', toggleClick);\n }\n\n // Keyboard escape to dismiss\n document.addEventListener('keydown', handleKeydown);\n };\n const unbindTriggerEvents = () => {\n const triggerEl = slot.assignedElements({ flatten: true })[0] as HTMLElement | undefined;\n\n if (!triggerEl) return;\n\n triggerEl.removeAttribute('aria-describedby');\n triggerEl.removeEventListener('pointerenter', show);\n triggerEl.removeEventListener('pointerleave', hide);\n triggerEl.removeEventListener('focusin', show);\n triggerEl.removeEventListener('focusout', hide);\n triggerEl.removeEventListener('click', toggleClick);\n document.removeEventListener('keydown', handleKeydown);\n };\n\n onSlotChange('default', bindTriggerEvents);\n // Controlled mode: watch the `open` prop and show/hide accordingly\n watch(props.open, (openVal) => {\n if (openVal === undefined || openVal === null) return;\n\n if (openVal) {\n visible.value = true;\n\n if (tooltipEl && !tooltipEl.matches(':popover-open')) tooltipEl.showPopover();\n\n const triggerEl = getTriggerEl();\n\n if (triggerEl && tooltipEl) {\n autoUpdateCleanup?.();\n autoUpdateCleanup = autoUpdate(triggerEl, tooltipEl, updatePosition);\n } else {\n requestAnimationFrame(() => updatePosition());\n }\n } else {\n _doHide();\n }\n });\n\n return () => {\n unbindTriggerEvents();\n\n if (showTimer) clearTimeout(showTimer);\n\n if (hideTimer) clearTimeout(hideTimer);\n\n autoUpdateCleanup?.();\n autoUpdateCleanup = null;\n\n if (tooltipEl?.matches(':popover-open')) {\n tooltipEl.hidePopover();\n }\n };\n });\n function handleKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') hide();\n }\n\n return html`\n <slot></slot>\n <div\n class=\"tooltip\"\n part=\"tooltip\"\n id=\"${tooltipId}\"\n role=\"tooltip\"\n popover=\"manual\"\n ref=${(el: HTMLElement) => {\n tooltipEl = el;\n }}\n :data-placement=\"${activePlacement}\"\n :aria-hidden=\"${() => String(!visible.value)}\">\n <slot name=\"content\">${() => props.content.value}</slot>\n </div>\n `;\n },\n styles: [forcedColorsMixin, styles],\n tag: 'bit-tooltip',\n});\n"],"mappings":"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"}