@vielzeug/refine 1.5.4 → 1.8.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 (375) hide show
  1. package/dist/accordion.cjs +1 -1
  2. package/dist/accordion.cjs.map +1 -1
  3. package/dist/accordion.js +30 -28
  4. package/dist/accordion.js.map +1 -1
  5. package/dist/async.cjs +11 -11
  6. package/dist/async.cjs.map +1 -1
  7. package/dist/async.js +1 -2
  8. package/dist/async.js.map +1 -1
  9. package/dist/button-group.cjs.map +1 -1
  10. package/dist/button-group.js.map +1 -1
  11. package/dist/button.cjs +1 -1
  12. package/dist/button.cjs.map +1 -1
  13. package/dist/button.js +1 -0
  14. package/dist/button.js.map +1 -1
  15. package/dist/calendar.cjs +26 -26
  16. package/dist/calendar.cjs.map +1 -1
  17. package/dist/calendar.js +4 -5
  18. package/dist/calendar.js.map +1 -1
  19. package/dist/checkbox-group.cjs +9 -9
  20. package/dist/checkbox-group.cjs.map +1 -1
  21. package/dist/checkbox-group.js +50 -58
  22. package/dist/checkbox-group.js.map +1 -1
  23. package/dist/code-window.cjs +4 -4
  24. package/dist/code-window.cjs.map +1 -1
  25. package/dist/code-window.js +1 -2
  26. package/dist/code-window.js.map +1 -1
  27. package/dist/combobox.cjs +29 -28
  28. package/dist/combobox.cjs.map +1 -1
  29. package/dist/combobox.js +201 -195
  30. package/dist/combobox.js.map +1 -1
  31. package/dist/command-palette.cjs +6 -6
  32. package/dist/command-palette.cjs.map +1 -1
  33. package/dist/command-palette.js +46 -47
  34. package/dist/command-palette.js.map +1 -1
  35. package/dist/content/card/card.css.cjs +1 -1
  36. package/dist/content/card/card.css.cjs.map +1 -1
  37. package/dist/content/card/card.css.js +1 -1
  38. package/dist/content/card/card.css.js.map +1 -1
  39. package/dist/content/chat-message/chat-message.css.cjs +1 -1
  40. package/dist/content/chat-message/chat-message.css.cjs.map +1 -1
  41. package/dist/content/chat-message/chat-message.css.js +1 -1
  42. package/dist/content/chat-message/chat-message.css.js.map +1 -1
  43. package/dist/content/code-window/code-window.d.ts.map +1 -1
  44. package/dist/content/icon/icon.d.ts.map +1 -1
  45. package/dist/content/index.d.ts +4 -0
  46. package/dist/content/index.d.ts.map +1 -1
  47. package/dist/content/list/_list-item-reveal.cjs +2 -0
  48. package/dist/content/list/_list-item-reveal.cjs.map +1 -0
  49. package/dist/content/list/_list-item-reveal.d.ts +25 -0
  50. package/dist/content/list/_list-item-reveal.d.ts.map +1 -0
  51. package/dist/content/list/_list-item-reveal.js +33 -0
  52. package/dist/content/list/_list-item-reveal.js.map +1 -0
  53. package/dist/content/list/list-item.css.cjs +2 -0
  54. package/dist/content/list/list-item.css.cjs.map +1 -0
  55. package/dist/content/list/list-item.css.js +6 -0
  56. package/dist/content/list/list-item.css.js.map +1 -0
  57. package/dist/content/list/list-item.d.ts +111 -0
  58. package/dist/content/list/list-item.d.ts.map +1 -0
  59. package/dist/content/list/list.css.cjs +2 -0
  60. package/dist/content/list/list.css.cjs.map +1 -0
  61. package/dist/content/list/list.css.js +6 -0
  62. package/dist/content/list/list.css.js.map +1 -0
  63. package/dist/content/list/list.d.ts +93 -0
  64. package/dist/content/list/list.d.ts.map +1 -0
  65. package/dist/custom-elements.json +5693 -5090
  66. package/dist/datagrid.cjs +2 -2
  67. package/dist/datagrid.js +206 -206
  68. package/dist/datagrid.js.map +1 -1
  69. package/dist/date-picker.cjs +2 -1
  70. package/dist/date-picker.cjs.map +1 -1
  71. package/dist/date-picker.js +2 -0
  72. package/dist/date-picker.js.map +1 -1
  73. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  74. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  75. package/dist/drawer.cjs +1 -1
  76. package/dist/drawer.cjs.map +1 -1
  77. package/dist/drawer.js +47 -48
  78. package/dist/drawer.js.map +1 -1
  79. package/dist/feedback/async/async.d.ts.map +1 -1
  80. package/dist/feedback/progress/progress.d.ts.map +1 -1
  81. package/dist/file-input.cjs +108 -42
  82. package/dist/file-input.cjs.map +1 -1
  83. package/dist/file-input.js +215 -156
  84. package/dist/file-input.js.map +1 -1
  85. package/dist/headless/aria-reflection.cjs +2 -0
  86. package/dist/headless/aria-reflection.cjs.map +1 -0
  87. package/dist/headless/aria-reflection.d.ts +27 -0
  88. package/dist/headless/aria-reflection.d.ts.map +1 -0
  89. package/dist/headless/aria-reflection.js +18 -0
  90. package/dist/headless/aria-reflection.js.map +1 -0
  91. package/dist/headless/checkable.cjs +1 -1
  92. package/dist/headless/checkable.cjs.map +1 -1
  93. package/dist/headless/checkable.d.ts +2 -10
  94. package/dist/headless/checkable.d.ts.map +1 -1
  95. package/dist/headless/checkable.js +29 -29
  96. package/dist/headless/checkable.js.map +1 -1
  97. package/dist/headless/choice-field.cjs +1 -1
  98. package/dist/headless/choice-field.cjs.map +1 -1
  99. package/dist/headless/choice-field.d.ts +2 -7
  100. package/dist/headless/choice-field.d.ts.map +1 -1
  101. package/dist/headless/choice-field.js +37 -37
  102. package/dist/headless/choice-field.js.map +1 -1
  103. package/dist/headless/field-base.cjs +1 -1
  104. package/dist/headless/field-base.cjs.map +1 -1
  105. package/dist/headless/field-base.d.ts +17 -0
  106. package/dist/headless/field-base.d.ts.map +1 -1
  107. package/dist/headless/field-base.js +21 -6
  108. package/dist/headless/field-base.js.map +1 -1
  109. package/dist/headless/focus.cjs +1 -1
  110. package/dist/headless/focus.cjs.map +1 -1
  111. package/dist/headless/focus.d.ts +7 -0
  112. package/dist/headless/focus.d.ts.map +1 -1
  113. package/dist/headless/focus.js +6 -6
  114. package/dist/headless/focus.js.map +1 -1
  115. package/dist/headless/index.d.ts +4 -2
  116. package/dist/headless/index.d.ts.map +1 -1
  117. package/dist/headless/nav.cjs +1 -1
  118. package/dist/headless/nav.cjs.map +1 -1
  119. package/dist/headless/nav.d.ts +12 -0
  120. package/dist/headless/nav.d.ts.map +1 -1
  121. package/dist/headless/nav.js +68 -50
  122. package/dist/headless/nav.js.map +1 -1
  123. package/dist/headless/overlay.cjs +1 -1
  124. package/dist/headless/overlay.cjs.map +1 -1
  125. package/dist/headless/overlay.d.ts +2 -0
  126. package/dist/headless/overlay.d.ts.map +1 -1
  127. package/dist/headless/overlay.js +8 -5
  128. package/dist/headless/overlay.js.map +1 -1
  129. package/dist/headless/ref-callback.cjs +2 -0
  130. package/dist/headless/ref-callback.cjs.map +1 -0
  131. package/dist/headless/ref-callback.d.ts +26 -0
  132. package/dist/headless/ref-callback.d.ts.map +1 -0
  133. package/dist/headless/ref-callback.js +13 -0
  134. package/dist/headless/ref-callback.js.map +1 -0
  135. package/dist/headless/swipe.cjs +1 -1
  136. package/dist/headless/swipe.cjs.map +1 -1
  137. package/dist/headless/swipe.d.ts +2 -0
  138. package/dist/headless/swipe.d.ts.map +1 -1
  139. package/dist/headless/swipe.js +26 -21
  140. package/dist/headless/swipe.js.map +1 -1
  141. package/dist/headless.cjs +1 -1
  142. package/dist/headless.js +28 -26
  143. package/dist/icon.cjs +1 -1
  144. package/dist/icon.cjs.map +1 -1
  145. package/dist/icon.js +35 -38
  146. package/dist/icon.js.map +1 -1
  147. package/dist/index.cjs +1 -1
  148. package/dist/index.js +63 -61
  149. package/dist/input.cjs +29 -26
  150. package/dist/input.cjs.map +1 -1
  151. package/dist/input.js +91 -79
  152. package/dist/input.js.map +1 -1
  153. package/dist/inputs/button/button.css.cjs +1 -1
  154. package/dist/inputs/button/button.css.cjs.map +1 -1
  155. package/dist/inputs/button/button.css.js +1 -1
  156. package/dist/inputs/button/button.css.js.map +1 -1
  157. package/dist/inputs/button/button.d.ts +8 -0
  158. package/dist/inputs/button/button.d.ts.map +1 -1
  159. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  160. package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
  161. package/dist/inputs/checkbox/checkbox.css.cjs.map +1 -1
  162. package/dist/inputs/checkbox/checkbox.css.js +1 -1
  163. package/dist/inputs/checkbox/checkbox.css.js.map +1 -1
  164. package/dist/inputs/combobox/combobox.d.ts +1 -0
  165. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  166. package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
  167. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  168. package/dist/inputs/date-picker/date-picker.css.js +1 -1
  169. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  170. package/dist/inputs/date-picker/date-picker.d.ts +6 -0
  171. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  172. package/dist/inputs/file-input/file-input-upload.cjs +2 -0
  173. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -0
  174. package/dist/inputs/file-input/file-input-upload.d.ts +76 -0
  175. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -0
  176. package/dist/inputs/file-input/file-input-upload.js +145 -0
  177. package/dist/inputs/file-input/file-input-upload.js.map +1 -0
  178. package/dist/inputs/file-input/file-input.css.cjs +1 -1
  179. package/dist/inputs/file-input/file-input.css.cjs.map +1 -1
  180. package/dist/inputs/file-input/file-input.css.js +1 -1
  181. package/dist/inputs/file-input/file-input.css.js.map +1 -1
  182. package/dist/inputs/file-input/file-input.d.ts +54 -1
  183. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  184. package/dist/inputs/input/input.css.cjs +1 -1
  185. package/dist/inputs/input/input.css.cjs.map +1 -1
  186. package/dist/inputs/input/input.css.js +1 -1
  187. package/dist/inputs/input/input.css.js.map +1 -1
  188. package/dist/inputs/input/input.d.ts +13 -0
  189. package/dist/inputs/input/input.d.ts.map +1 -1
  190. package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
  191. package/dist/inputs/message-composer/message-composer.css.cjs.map +1 -1
  192. package/dist/inputs/message-composer/message-composer.css.js +1 -1
  193. package/dist/inputs/message-composer/message-composer.css.js.map +1 -1
  194. package/dist/inputs/message-composer/message-composer.d.ts +7 -0
  195. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  196. package/dist/inputs/number-input/number-input.css.cjs +1 -1
  197. package/dist/inputs/number-input/number-input.css.cjs.map +1 -1
  198. package/dist/inputs/number-input/number-input.css.js +1 -1
  199. package/dist/inputs/number-input/number-input.css.js.map +1 -1
  200. package/dist/inputs/number-input/number-input.d.ts +15 -0
  201. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  202. package/dist/inputs/otp-input/otp-input.css.cjs +1 -1
  203. package/dist/inputs/otp-input/otp-input.css.cjs.map +1 -1
  204. package/dist/inputs/otp-input/otp-input.css.js +1 -1
  205. package/dist/inputs/otp-input/otp-input.css.js.map +1 -1
  206. package/dist/inputs/radio/radio.d.ts.map +1 -1
  207. package/dist/inputs/select/select.d.ts +1 -0
  208. package/dist/inputs/select/select.d.ts.map +1 -1
  209. package/dist/inputs/shared/index.d.ts +1 -1
  210. package/dist/inputs/shared/index.d.ts.map +1 -1
  211. package/dist/inputs/shared/templates.cjs +26 -3
  212. package/dist/inputs/shared/templates.cjs.map +1 -1
  213. package/dist/inputs/shared/templates.d.ts +20 -0
  214. package/dist/inputs/shared/templates.d.ts.map +1 -1
  215. package/dist/inputs/shared/templates.js +29 -5
  216. package/dist/inputs/shared/templates.js.map +1 -1
  217. package/dist/inputs/switch/switch.css.cjs +1 -1
  218. package/dist/inputs/switch/switch.css.cjs.map +1 -1
  219. package/dist/inputs/switch/switch.css.js +1 -1
  220. package/dist/inputs/switch/switch.css.js.map +1 -1
  221. package/dist/inputs/switch/switch.d.ts.map +1 -1
  222. package/dist/inputs/textarea/textarea.css.cjs +1 -1
  223. package/dist/inputs/textarea/textarea.css.cjs.map +1 -1
  224. package/dist/inputs/textarea/textarea.css.js +1 -1
  225. package/dist/inputs/textarea/textarea.css.js.map +1 -1
  226. package/dist/inputs/textarea/textarea.d.ts +14 -0
  227. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  228. package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
  229. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
  230. package/dist/inputs/time-picker/time-picker.css.js +1 -1
  231. package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
  232. package/dist/inputs/time-picker/time-picker.d.ts +6 -0
  233. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  234. package/dist/list-item.cjs +22 -0
  235. package/dist/list-item.cjs.map +1 -0
  236. package/dist/list-item.js +91 -0
  237. package/dist/list-item.js.map +1 -0
  238. package/dist/list.cjs +2 -0
  239. package/dist/list.cjs.map +1 -0
  240. package/dist/list.js +64 -0
  241. package/dist/list.js.map +1 -0
  242. package/dist/menu.cjs +4 -4
  243. package/dist/menu.cjs.map +1 -1
  244. package/dist/menu.js +60 -59
  245. package/dist/menu.js.map +1 -1
  246. package/dist/message-composer.cjs +14 -20
  247. package/dist/message-composer.cjs.map +1 -1
  248. package/dist/message-composer.js +63 -64
  249. package/dist/message-composer.js.map +1 -1
  250. package/dist/number-input.cjs +5 -3
  251. package/dist/number-input.cjs.map +1 -1
  252. package/dist/number-input.js +8 -4
  253. package/dist/number-input.js.map +1 -1
  254. package/dist/otp-input.cjs +9 -9
  255. package/dist/otp-input.cjs.map +1 -1
  256. package/dist/otp-input.js +70 -62
  257. package/dist/otp-input.js.map +1 -1
  258. package/dist/overlay/menu/menu-item.css.cjs +1 -1
  259. package/dist/overlay/menu/menu-item.css.cjs.map +1 -1
  260. package/dist/overlay/menu/menu-item.css.js +1 -1
  261. package/dist/overlay/menu/menu-item.css.js.map +1 -1
  262. package/dist/overlay/menu/menu-separator.css.cjs +1 -1
  263. package/dist/overlay/menu/menu-separator.css.cjs.map +1 -1
  264. package/dist/overlay/menu/menu-separator.css.js +1 -1
  265. package/dist/overlay/menu/menu-separator.css.js.map +1 -1
  266. package/dist/overlay/menu/menu.css.cjs +1 -1
  267. package/dist/overlay/menu/menu.css.cjs.map +1 -1
  268. package/dist/overlay/menu/menu.css.js +1 -1
  269. package/dist/overlay/menu/menu.css.js.map +1 -1
  270. package/dist/overlay/shared/use-dialog.cjs +1 -1
  271. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  272. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  273. package/dist/overlay/shared/use-dialog.js +7 -6
  274. package/dist/overlay/shared/use-dialog.js.map +1 -1
  275. package/dist/progress.cjs +13 -13
  276. package/dist/progress.cjs.map +1 -1
  277. package/dist/progress.js +3 -4
  278. package/dist/progress.js.map +1 -1
  279. package/dist/radio-group.cjs +11 -11
  280. package/dist/radio-group.cjs.map +1 -1
  281. package/dist/radio-group.js +63 -70
  282. package/dist/radio-group.js.map +1 -1
  283. package/dist/radio.cjs +4 -4
  284. package/dist/radio.cjs.map +1 -1
  285. package/dist/radio.js +58 -58
  286. package/dist/radio.js.map +1 -1
  287. package/dist/rating.cjs.map +1 -1
  288. package/dist/rating.js.map +1 -1
  289. package/dist/refine.cjs +502 -309
  290. package/dist/refine.cjs.map +1 -1
  291. package/dist/refine.iife.js +562 -369
  292. package/dist/refine.iife.js.map +1 -1
  293. package/dist/refine.js +558 -365
  294. package/dist/refine.js.map +1 -1
  295. package/dist/select.cjs +21 -21
  296. package/dist/select.cjs.map +1 -1
  297. package/dist/select.js +135 -127
  298. package/dist/select.js.map +1 -1
  299. package/dist/shared/size-presets.cjs +1 -1
  300. package/dist/shared/size-presets.cjs.map +1 -1
  301. package/dist/shared/size-presets.d.ts +74 -0
  302. package/dist/shared/size-presets.d.ts.map +1 -1
  303. package/dist/shared/size-presets.js +48 -1
  304. package/dist/shared/size-presets.js.map +1 -1
  305. package/dist/shared/types.d.ts +5 -0
  306. package/dist/shared/types.d.ts.map +1 -1
  307. package/dist/styles/index.cjs +1 -1
  308. package/dist/styles/index.cjs.map +1 -1
  309. package/dist/styles/index.d.ts +1 -0
  310. package/dist/styles/index.d.ts.map +1 -1
  311. package/dist/styles/index.js +5 -4
  312. package/dist/styles/index.js.map +1 -1
  313. package/dist/styles/mixins/field-variants.css.cjs +85 -0
  314. package/dist/styles/mixins/field-variants.css.cjs.map +1 -0
  315. package/dist/styles/mixins/field-variants.css.d.ts +66 -0
  316. package/dist/styles/mixins/field-variants.css.d.ts.map +1 -0
  317. package/dist/styles/mixins/field-variants.css.js +90 -0
  318. package/dist/styles/mixins/field-variants.css.js.map +1 -0
  319. package/dist/switch.cjs +3 -3
  320. package/dist/switch.cjs.map +1 -1
  321. package/dist/switch.js +38 -36
  322. package/dist/switch.js.map +1 -1
  323. package/dist/tab-item.cjs +8 -8
  324. package/dist/tab-item.cjs.map +1 -1
  325. package/dist/tab-item.js +38 -28
  326. package/dist/tab-item.js.map +1 -1
  327. package/dist/tab-panel.cjs +7 -7
  328. package/dist/tab-panel.cjs.map +1 -1
  329. package/dist/tab-panel.js +33 -26
  330. package/dist/tab-panel.js.map +1 -1
  331. package/dist/tabs.cjs +4 -4
  332. package/dist/tabs.cjs.map +1 -1
  333. package/dist/tabs.js +64 -60
  334. package/dist/tabs.js.map +1 -1
  335. package/dist/testing/index.d.ts +15 -60
  336. package/dist/testing/index.d.ts.map +1 -1
  337. package/dist/testing.cjs +1 -1
  338. package/dist/testing.cjs.map +1 -1
  339. package/dist/testing.js +7 -24
  340. package/dist/testing.js.map +1 -1
  341. package/dist/textarea.cjs +15 -18
  342. package/dist/textarea.cjs.map +1 -1
  343. package/dist/textarea.js +83 -74
  344. package/dist/textarea.js.map +1 -1
  345. package/dist/time-picker.cjs +34 -31
  346. package/dist/time-picker.cjs.map +1 -1
  347. package/dist/time-picker.js +121 -109
  348. package/dist/time-picker.js.map +1 -1
  349. package/package.json +22 -9
  350. package/dist/headless/dialog-focus.cjs +0 -2
  351. package/dist/headless/dialog-focus.cjs.map +0 -1
  352. package/dist/headless/dialog-focus.d.ts +0 -40
  353. package/dist/headless/dialog-focus.d.ts.map +0 -1
  354. package/dist/headless/dialog-focus.js +0 -22
  355. package/dist/headless/dialog-focus.js.map +0 -1
  356. package/dist/headless/focus-trap.cjs +0 -2
  357. package/dist/headless/focus-trap.cjs.map +0 -1
  358. package/dist/headless/focus-trap.d.ts +0 -45
  359. package/dist/headless/focus-trap.d.ts.map +0 -1
  360. package/dist/headless/focus-trap.js +0 -51
  361. package/dist/headless/focus-trap.js.map +0 -1
  362. package/dist/keymap/dist/_dev.cjs +0 -2
  363. package/dist/keymap/dist/_dev.cjs.map +0 -1
  364. package/dist/keymap/dist/_dev.js +0 -4
  365. package/dist/keymap/dist/_dev.js.map +0 -1
  366. package/dist/keymap/dist/format.cjs +0 -1
  367. package/dist/keymap/dist/format.js +0 -1
  368. package/dist/keymap/dist/index.cjs +0 -1
  369. package/dist/keymap/dist/index.js +0 -4
  370. package/dist/keymap/dist/keymap.cjs +0 -2
  371. package/dist/keymap/dist/keymap.cjs.map +0 -1
  372. package/dist/keymap/dist/keymap.js +0 -221
  373. package/dist/keymap/dist/keymap.js.map +0 -1
  374. package/dist/keymap/dist/layer.cjs +0 -1
  375. package/dist/keymap/dist/layer.js +0 -1
package/dist/input.cjs CHANGED
@@ -1,6 +1,6 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/shape.css.cjs"),t=require("./styles/mixins/theme.css.cjs"),n=require("./styles/index.cjs"),r=require("./shared/prop-bundles.cjs"),i=require("./shared/size-presets.cjs"),a=require("./headless/ore.cjs"),o=require("./headless/text-field.cjs"),s=require("./inputs/shared/field-binding.cjs"),c=require("./inputs/shared/form-context.cjs"),l=require("./inputs/input/input.css.cjs");let u=require("@vielzeug/ore"),d=require("@vielzeug/ore/directives"),f=require("@vielzeug/ripple"),p=require("@vielzeug/ore/forms");var m=[`text`,`email`,`password`,`search`,`url`,`tel`,`number`,`date`,`time`,`datetime-local`,`month`,`week`],h=`ore-input`;(0,u.define)(h,{formAssociated:!0,props:{...r.themableBundle,...r.sizableBundle,...r.disablableBundle,...r.roundableBundle,autocomplete:u.prop.string(),clearable:u.prop.bool(!1),error:u.prop.string(),fullwidth:u.prop.bool(!1),helper:u.prop.string(),inputmode:u.prop.string(),label:u.prop.string(),"label-placement":u.prop.oneOf([`inset`,`outside`],`inset`),maxlength:u.prop.json(void 0),minlength:u.prop.json(void 0),name:u.prop.string(),pattern:u.prop.string(),placeholder:u.prop.string(),readonly:u.prop.bool(!1),ref:u.prop.json(void 0),required:u.prop.bool(!1),type:u.prop.oneOf(m,`text`),value:u.prop.string(),variant:u.prop.string()},setup(e){let t=(0,u.useEmit)(),n=(0,u.useSlots)(),r=(0,u.inject)(c.FORM_CTX),i=c.useFormContext(e,r),l=(0,f.signal)(!1),m=(0,u.ref)(),h=(0,f.computed)(()=>!!e.label.value||n.has(`label`).value),g=a.lifecycleSignal(u.onCleanup),_=o.createTextField({disabled:i.disabled,error:e.error,hasLabel:h,helper:e.helper,label:e.label,labelPlacement:e[`label-placement`],maxLength:e.maxlength,onChange:(e,n)=>{t(`change`,{originalEvent:e,value:n})},onInput:(e,n)=>{t(`input`,{originalEvent:e,value:n})},prefix:`input`,readonly:e.readonly,required:e.required,signal:g,validateOn:r?.validateOn,value:e.value});_.attachFormField((0,p.useField)({disabled:_.disabled,onReset:_.reset,toFormValue:e=>e,validationMessage:_.validationMessage,validity:_.validity,value:_.value}));let{ariaDescribedBy:v,ariaErrorMessage:y,ariaInvalid:b,ariaLabelledBy:x,assistiveId:S,clear:C,counter:w,errorId:T,errorText:E,fieldId:D,helperText:O,labelId:k,labelVisible:A,value:j,wire:M}=_;return(0,u.onElement)(m,t=>{M(t,g),e.ref.value?.(t);let n=(0,f.watch)(e.ref,e=>{e?.(t)});return()=>{n.dispose(),e.ref.value?.(null)}}),(0,u.bind)({attr:{error:s.errorAttr(E),"has-value":()=>j.value?!0:void 0,size:i.size,variant:i.variant}}),u.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/shape.css.cjs"),t=require("./styles/mixins/theme.css.cjs"),n=require("./styles/mixins/field-variants.css.cjs"),r=require("./styles/index.cjs"),i=require("./shared/prop-bundles.cjs"),a=require("./shared/size-presets.cjs"),o=require("./headless/ore.cjs"),s=require("./headless/ref-callback.cjs"),c=require("./headless/text-field.cjs"),l=require("./inputs/shared/field-binding.cjs"),u=require("./inputs/shared/form-context.cjs"),d=require("./inputs/shared/templates.cjs"),f=require("./inputs/input/input.css.cjs");let p=require("@vielzeug/ore"),m=require("@vielzeug/ripple"),h=require("@vielzeug/ore/forms"),g=require("@vielzeug/ore/directives");var _=[`text`,`email`,`password`,`search`,`url`,`tel`,`number`,`date`,`time`,`datetime-local`,`month`,`week`],v=`ore-input`;(0,p.define)(v,{formAssociated:!0,props:{...i.themableBundle,...i.sizableBundle,...i.disablableBundle,...i.roundableBundle,autocomplete:p.prop.string(),clearable:p.prop.bool(!1),error:p.prop.string(),fullwidth:p.prop.bool(!1),helper:p.prop.string(),inputmode:p.prop.string(),label:p.prop.string(),"label-placement":p.prop.oneOf([`inset`,`outside`],`inset`),loading:p.prop.bool(!1),maxlength:p.prop.json(void 0),minlength:p.prop.json(void 0),name:p.prop.string(),pattern:p.prop.string(),placeholder:p.prop.string(),readonly:p.prop.bool(!1),ref:p.prop.data(),required:p.prop.bool(!1),success:p.prop.bool(!1),type:p.prop.oneOf(_,`text`),value:p.prop.string(),variant:p.prop.string()},setup(e){let t=(0,p.useEmit)(),n=(0,p.useSlots)(),r=(0,p.inject)(u.FORM_CTX),i=u.useFormContext(e,r),a=(0,m.signal)(!1),f=(0,p.ref)(),_=(0,m.computed)(()=>!!e.label.value||n.has(`label`).value),v=(0,m.computed)(()=>i.disabled.value||e.loading.value),y=o.lifecycleSignal(p.onCleanup),b=c.createTextField({disabled:v,error:e.error,hasLabel:_,helper:e.helper,label:e.label,labelPlacement:e[`label-placement`],maxLength:e.maxlength,onChange:(e,n)=>{t(`change`,{originalEvent:e,value:n})},onInput:(e,n)=>{t(`input`,{originalEvent:e,value:n})},prefix:`input`,readonly:e.readonly,required:e.required,signal:y,validateOn:r?.validateOn,value:e.value});b.attachFormField((0,h.useField)({disabled:b.disabled,onReset:b.reset,toFormValue:e=>e,validationMessage:b.validationMessage,validity:b.validity,value:b.value}));let{ariaDescribedBy:x,ariaErrorMessage:S,ariaInvalid:C,ariaLabelledBy:w,assistiveId:T,clear:E,counter:D,errorId:O,errorText:k,fieldId:A,helperText:j,labelId:M,labelVisible:N,value:P,wire:F}=b;return(0,p.onElement)(f,t=>{F(t,y);let n=s.bindRefCallback(e.ref,t);return()=>{n()}}),(0,p.bind)({attr:{error:l.errorAttr(k),"has-value":()=>P.value?!0:void 0,size:i.size,success:()=>e.success.value&&!k.value?!0:void 0,variant:i.variant}}),p.html`
2
2
  <div class="input-wrapper" part="wrapper">
3
- <label class="label" for="${D}" id="${k}" part="label" ?hidden="${()=>!A.value}"
3
+ <label class="label" for="${A}" id="${M}" part="label" ?hidden="${()=>!N.value}"
4
4
  ><slot name="label">${e.label}</slot></label
5
5
  >
6
6
  <div class="field" part="field">
@@ -8,8 +8,8 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
8
8
  <slot name="prefix"></slot>
9
9
  <input
10
10
  part="input"
11
- id="${D}"
12
- :type="${()=>e.type.value===`password`&&l.value?`text`:e.type.value??`text`}"
11
+ id="${A}"
12
+ :type="${()=>e.type.value===`password`&&a.value?`text`:e.type.value??`text`}"
13
13
  :name="${e.name}"
14
14
  :placeholder="${e.placeholder}"
15
15
  :autocomplete="${e.autocomplete}"
@@ -17,51 +17,54 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
17
17
  :maxlength="${e.maxlength}"
18
18
  :minlength="${e.minlength}"
19
19
  :pattern="${e.pattern}"
20
- ?disabled="${e.disabled}"
20
+ ?disabled="${v}"
21
21
  ?readonly="${e.readonly}"
22
22
  ?required="${e.required}"
23
- :value="${(0,d.live)(j)}"
24
- :aria-labelledby="${x}"
25
- :aria-describedby="${v}"
26
- :aria-errormessage="${y}"
27
- :aria-invalid="${b}"
28
- ref="${m}" />
23
+ :value="${(0,g.live)(P)}"
24
+ :aria-labelledby="${w}"
25
+ :aria-describedby="${x}"
26
+ :aria-errormessage="${S}"
27
+ :aria-invalid="${C}"
28
+ :aria-busy="${()=>e.loading.value?`true`:null}"
29
+ ref="${f}" />
29
30
  <slot name="suffix"></slot>
31
+ ${d.renderStatusIcon(k)}
32
+ <span class="field-spinner" part="spinner" role="status" aria-label="Loading"></span>
30
33
  <button
31
34
  class="pwd-toggle-btn"
32
35
  part="pwd-toggle"
33
36
  type="button"
34
- :aria-label="${()=>l.value?`Hide password`:`Show password`}"
35
- :aria-pressed="${()=>String(l.value)}"
37
+ :aria-label="${()=>a.value?`Hide password`:`Show password`}"
38
+ :aria-pressed="${()=>String(a.value)}"
36
39
  :tabindex="${()=>e.type.value===`password`?`0`:`-1`}"
37
- @click="${()=>{l.value=!l.value,m.value?.focus()}}">
38
- ${()=>l.value?u.html`<ore-icon name="eye-off" size="14" stroke-width="2" aria-hidden="true"></ore-icon>`:u.html`<ore-icon name="eye" size="14" stroke-width="2" aria-hidden="true"></ore-icon>`}
40
+ @click="${()=>{a.value=!a.value,f.value?.focus()}}">
41
+ ${()=>a.value?p.html`<ore-icon name="eye-off" size="14" stroke-width="2" aria-hidden="true"></ore-icon>`:p.html`<ore-icon name="eye" size="14" stroke-width="2" aria-hidden="true"></ore-icon>`}
39
42
  </button>
40
43
  <button
41
44
  aria-label="Clear"
42
45
  class="clear-btn"
43
46
  part="clear"
44
47
  type="button"
45
- :tabindex="${()=>j.value?`0`:`-1`}"
46
- @click="${e=>{C(e),m.value?.focus()}}">
48
+ :tabindex="${()=>P.value?`0`:`-1`}"
49
+ @click="${e=>{E(e),f.value?.focus()}}">
47
50
  <ore-icon aria-hidden="true" name="x" size="12" stroke-width="2.5"></ore-icon>
48
51
  </button>
49
52
  </div>
50
53
  </div>
51
- <div class="helper-text" aria-live="polite" id="${S}" part="helper" ?hidden="${()=>!!E.value||!O.value}">
52
- <slot name="helper">${()=>O.value}</slot>
54
+ <div class="helper-text" aria-live="polite" id="${T}" part="helper" ?hidden="${()=>!!k.value||!j.value}">
55
+ <slot name="helper">${()=>j.value}</slot>
53
56
  </div>
54
- <div class="helper-text" id="${T}" role="alert" part="error" ?hidden="${()=>!E.value}">
55
- <slot name="error">${()=>E.value}</slot>
57
+ <div class="helper-text" id="${O}" role="alert" part="error" ?hidden="${()=>!k.value}">
58
+ <slot name="error">${()=>k.value}</slot>
56
59
  </div>
57
60
  <div
58
61
  class="char-counter"
59
62
  part="char-counter"
60
- :data-near-limit="${()=>w?.value.counterNearLimit&&!w?.value.counterAtLimit?``:null}"
61
- :data-at-limit="${()=>w?.value.counterAtLimit?``:null}"
62
- ?hidden="${()=>!w}">
63
- ${()=>w?.value.counterText??``}
63
+ :data-near-limit="${()=>D?.value.counterNearLimit&&!D?.value.counterAtLimit?``:null}"
64
+ :data-at-limit="${()=>D?.value.counterAtLimit?``:null}"
65
+ ?hidden="${()=>!D}">
66
+ ${()=>D?.value.counterText??``}
64
67
  </div>
65
68
  </div>
66
- `},shadow:{delegatesFocus:!0},styles:[...n.fieldMixins,e.sizeVariantMixin(i.FIELD_SIZE_PRESET),t.forcedColorsFocusMixin(`input`),l.default]}),exports.INPUT_TAG=h;
69
+ `},shadow:{delegatesFocus:!0},styles:[...r.fieldMixins,e.sizeVariantMixin(a.FIELD_SIZE_PRESET),t.forcedColorsFocusMixin(`input`),f.default,n.fieldVariantMixin({container:`.field`,text:`input`,tokenPrefix:`input`})]}),exports.INPUT_TAG=v;
67
70
  //# sourceMappingURL=input.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.cjs","names":[],"sources":["../src/inputs/input/input.ts"],"sourcesContent":["import { define, html, inject, prop, ref, bind, onCleanup, onElement, useEmit, useSlots } from '@vielzeug/ore';\nimport { live } from '@vielzeug/ore/directives';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { TextFieldProps } from '../../shared';\nimport type { InputType, VisualVariant } from '../../types';\n\nimport { lifecycleSignal, createTextField } from '../../headless';\nimport { disablableBundle, FIELD_SIZE_PRESET, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport '../../content/icon/icon';\nimport { fieldMixins, forcedColorsFocusMixin, sizeVariantMixin } from '../../styles';\nimport { errorAttr } from '../shared/field-binding';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport componentStyles from './input.css?inline';\n\n/** Input component properties */\n\nexport type OreInputEvents = {\n change: { originalEvent: Event; value: string };\n input: { originalEvent: Event; value: string };\n};\n\nexport type OreInputProps = TextFieldProps<Exclude<VisualVariant, 'frost'>> & {\n /** Autocomplete hint */\n autocomplete?: string;\n /** Show a clear (×) button when the field has a value */\n clearable?: boolean;\n /** Virtual keyboard hint for mobile devices */\n inputmode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n /** Maximum character length — shows a counter below the input */\n maxlength?: number;\n /** Minimum character length */\n minlength?: number;\n /** HTML pattern attribute for client-side validation */\n pattern?: string;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts. Intended for composed components that\n * need imperative access to the raw input element.\n * Set as a JS property: `bitInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** HTML input type */\n type?: InputType;\n};\n\nconst VALID_INPUT_TYPES = [\n 'text',\n 'email',\n 'password',\n 'search',\n 'url',\n 'tel',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n] as const;\n\n/**\n * A customizable text input component with multiple variants, label placements, and form features.\n *\n * @element ore-input\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - Label placement: 'inset' | 'outside'\n * @attr {string} type - HTML input type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search'\n * @attr {string} value - Current input value\n * @attr {string} placeholder - Placeholder text\n * @attr {string} name - Form field name\n * @attr {string} helper - Helper text displayed below the input (fallback when the `helper` slot is empty)\n * @attr {string} error - Error message — marks the field as invalid (fallback when the `error` slot is empty)\n * @attr {boolean} disabled - Disable input interaction\n * @attr {boolean} readonly - Make the input read-only\n * @attr {boolean} required - Mark the field as required\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text'\n * @attr {string} size - Input size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n *\n * @fires input - Emitted when input value changes (on every keystroke). detail: { value: string; originalEvent: Event }\n * @fires change - Emitted when input loses focus with changed value. detail: { value: string; originalEvent: Event }\n *\n * @slot prefix - Content before the input (e.g., icons)\n * @slot suffix - Content after the input (e.g., clear button, validation icon)\n * @slot label - Replaces the label text — slotted content takes precedence over the `label` prop\n * @slot helper - Replaces the helper text — slotted content takes precedence over the `helper` prop\n * @slot error - Replaces the error text — slotted content takes precedence over the `error` prop\n *\n * @part wrapper - The input wrapper element\n * @part label - The label element (inset or outside)\n * @part field - The field container element\n * @part input-row - The input row container element\n * @part input - The input element\n * @part helper - The helper text element\n *\n * @cssprop --input-bg - Background color\n * @cssprop --input-color - Text color\n * @cssprop --input-border-color - Border color\n * @cssprop --input-placeholder-color - Placeholder text color\n * @cssprop --input-radius - Border radius\n * @cssprop --input-padding - Inner padding (block inline)\n * @cssprop --input-gap - Gap between prefix/suffix icons and input text\n * @cssprop --input-font-size - Font size\n * @cssprop --input-height - Field height\n * @cssprop --input-hover-bg - Field background on hover (flat/ghost variants)\n * @cssprop --input-hover-border-color - Field border on hover (flat/bordered variants)\n * @cssprop --input-focus-bg - Field background when focused (flat variant)\n * @cssprop --input-focus-border-color - Field border when focused (flat/text variants)\n *\n * @example\n * ```html\n * <ore-input type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n * <ore-input label=\"Name\" variant=\"bordered\" color=\"primary\" />\n * ```\n */\nexport const INPUT_TAG = 'ore-input' as const;\ndefine<OreInputProps>(INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n autocomplete: prop.string(),\n clearable: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n inputmode: prop.string<'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n maxlength: prop.json(undefined as number | undefined),\n minlength: prop.json(undefined as number | undefined),\n name: prop.string(),\n pattern: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.json(undefined as ((el: HTMLInputElement | null) => void) | null | undefined),\n required: prop.bool(false),\n type: prop.oneOf(VALID_INPUT_TYPES, 'text'),\n value: prop.string(),\n variant: prop.string<'flat' | 'text' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const emit = useEmit<OreInputEvents>();\n const slots = useSlots();\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const showPassword = signal(false);\n const inputRef = ref<HTMLInputElement>();\n\n const hasLabel = computed(() => !!props.label.value || slots.has('label').value);\n\n const abortSignal = lifecycleSignal(onCleanup);\n const tf = createTextField({\n disabled: fCtxProps.disabled,\n error: props.error,\n hasLabel,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n maxLength: props.maxlength,\n onChange: (event: Event, value: string) => {\n emit('change', { originalEvent: event, value });\n },\n onInput: (event: Event, value: string) => {\n emit('input', { originalEvent: event, value });\n },\n prefix: 'input',\n readonly: props.readonly,\n required: props.required,\n signal: abortSignal,\n validateOn: formCtx?.validateOn,\n value: props.value,\n });\n\n tf.attachFormField(\n useField<string>({\n disabled: tf.disabled,\n onReset: tf.reset,\n toFormValue: (v) => v,\n validationMessage: tf.validationMessage,\n validity: tf.validity,\n value: tf.value,\n }),\n );\n\n const {\n ariaDescribedBy,\n ariaErrorMessage,\n ariaInvalid,\n ariaLabelledBy,\n assistiveId,\n clear: clearValue,\n counter,\n errorId,\n errorText,\n fieldId: inputId,\n helperText,\n labelId,\n labelVisible,\n value: fieldValue,\n wire,\n } = tf;\n\n onElement(inputRef, (el) => {\n wire(el, abortSignal);\n\n // Immediate fire for when the prop is already set on mount.\n props.ref.value?.(el);\n\n // Reactive watcher so that if props.ref is set *after* the inner\n // <input> mounts (e.g. parent sets it via a ref callback after render),\n // the new callback still receives the live element.\n const sub = watch(props.ref, (cb) => {\n cb?.(el);\n });\n\n return () => {\n sub.dispose();\n props.ref.value?.(null);\n };\n });\n\n const clear = (event?: Event): void => {\n clearValue(event);\n inputRef.value?.focus();\n };\n\n const resolvedInputType = (): string =>\n props.type.value === 'password' && showPassword.value ? 'text' : (props.type.value ?? 'text');\n\n bind({\n attr: {\n error: errorAttr(errorText),\n 'has-value': () => (fieldValue.value ? true : undefined),\n size: fCtxProps.size,\n variant: fCtxProps.variant,\n },\n });\n\n const labelHidden = () => !labelVisible.value;\n const passwordToggleLabel = () => (showPassword.value ? 'Hide password' : 'Show password');\n const passwordTogglePressed = () => String(showPassword.value);\n const passwordToggleIcon = () =>\n showPassword.value\n ? html`<ore-icon name=\"eye-off\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`\n : html`<ore-icon name=\"eye\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`;\n const helperHidden = () => !!errorText.value || !helperText.value;\n const errorHidden = () => !errorText.value;\n const counterNearLimit = () => (counter?.value.counterNearLimit && !counter?.value.counterAtLimit ? '' : null);\n const counterAtLimit = () => (counter?.value.counterAtLimit ? '' : null);\n const counterHidden = () => !counter;\n const counterText = () => counter?.value.counterText ?? '';\n\n const clearTabIndex = () => (fieldValue.value ? '0' : '-1');\n const pwdToggleTabIndex = () => (props.type.value === 'password' ? '0' : '-1');\n\n const togglePassword = () => {\n showPassword.value = !showPassword.value;\n inputRef.value?.focus();\n };\n\n return html`\n <div class=\"input-wrapper\" part=\"wrapper\">\n <label class=\"label\" for=\"${inputId}\" id=\"${labelId}\" part=\"label\" ?hidden=\"${labelHidden}\"\n ><slot name=\"label\">${props.label}</slot></label\n >\n <div class=\"field\" part=\"field\">\n <div class=\"input-row\" part=\"input-row\">\n <slot name=\"prefix\"></slot>\n <input\n part=\"input\"\n id=\"${inputId}\"\n :type=\"${resolvedInputType}\"\n :name=\"${props.name}\"\n :placeholder=\"${props.placeholder}\"\n :autocomplete=\"${props.autocomplete}\"\n :inputmode=\"${props.inputmode}\"\n :maxlength=\"${props.maxlength}\"\n :minlength=\"${props.minlength}\"\n :pattern=\"${props.pattern}\"\n ?disabled=\"${props.disabled}\"\n ?readonly=\"${props.readonly}\"\n ?required=\"${props.required}\"\n :value=\"${live(fieldValue)}\"\n :aria-labelledby=\"${ariaLabelledBy}\"\n :aria-describedby=\"${ariaDescribedBy}\"\n :aria-errormessage=\"${ariaErrorMessage}\"\n :aria-invalid=\"${ariaInvalid}\"\n ref=\"${inputRef}\" />\n <slot name=\"suffix\"></slot>\n <button\n class=\"pwd-toggle-btn\"\n part=\"pwd-toggle\"\n type=\"button\"\n :aria-label=\"${passwordToggleLabel}\"\n :aria-pressed=\"${passwordTogglePressed}\"\n :tabindex=\"${pwdToggleTabIndex}\"\n @click=\"${togglePassword}\">\n ${passwordToggleIcon}\n </button>\n <button\n aria-label=\"Clear\"\n class=\"clear-btn\"\n part=\"clear\"\n type=\"button\"\n :tabindex=\"${clearTabIndex}\"\n @click=\"${clear}\">\n <ore-icon aria-hidden=\"true\" name=\"x\" size=\"12\" stroke-width=\"2.5\"></ore-icon>\n </button>\n </div>\n </div>\n <div class=\"helper-text\" aria-live=\"polite\" id=\"${assistiveId}\" part=\"helper\" ?hidden=\"${helperHidden}\">\n <slot name=\"helper\">${() => helperText.value}</slot>\n </div>\n <div class=\"helper-text\" id=\"${errorId}\" role=\"alert\" part=\"error\" ?hidden=\"${errorHidden}\">\n <slot name=\"error\">${() => errorText.value}</slot>\n </div>\n <div\n class=\"char-counter\"\n part=\"char-counter\"\n :data-near-limit=\"${counterNearLimit}\"\n :data-at-limit=\"${counterAtLimit}\"\n ?hidden=\"${counterHidden}\">\n ${counterText}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [...fieldMixins, sizeVariantMixin(FIELD_SIZE_PRESET), forcedColorsFocusMixin('input'), componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"input.cjs","names":[],"sources":["../src/inputs/input/input.ts"],"sourcesContent":["import { define, html, inject, prop, ref, bind, onCleanup, onElement, useEmit, useSlots } from '@vielzeug/ore';\nimport { live } from '@vielzeug/ore/directives';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, signal } from '@vielzeug/ripple';\n\nimport type { TextFieldProps } from '../../shared';\nimport type { InputType, VisualVariant } from '../../types';\n\nimport { bindRefCallback, lifecycleSignal, createTextField } from '../../headless';\nimport { disablableBundle, FIELD_SIZE_PRESET, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport '../../content/icon/icon';\nimport { fieldMixins, fieldVariantMixin, forcedColorsFocusMixin, sizeVariantMixin } from '../../styles';\nimport { errorAttr } from '../shared/field-binding';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport { renderStatusIcon } from '../shared/templates';\nimport componentStyles from './input.css?inline';\n\n/** Input component properties */\n\nexport type OreInputEvents = {\n change: { originalEvent: Event; value: string };\n input: { originalEvent: Event; value: string };\n};\n\nexport type OreInputProps = TextFieldProps<Exclude<VisualVariant, 'frost'>> & {\n /** Autocomplete hint */\n autocomplete?: string;\n /** Show a clear (×) button when the field has a value */\n clearable?: boolean;\n /** Virtual keyboard hint for mobile devices */\n inputmode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n /**\n * Shows an inline spinner inside the field and forces the inner `<input>` into\n * `disabled` for the duration — use while an async validation/submission request\n * is in flight (e.g. checking username availability) to prevent double-submits.\n */\n loading?: boolean;\n /** Maximum character length — shows a counter below the input */\n maxlength?: number;\n /** Minimum character length */\n minlength?: number;\n /** HTML pattern attribute for client-side validation */\n pattern?: string;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts. Intended for composed components that\n * need imperative access to the raw input element.\n * Set as a JS property: `bitInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** HTML input type */\n type?: InputType;\n};\n\nconst VALID_INPUT_TYPES = [\n 'text',\n 'email',\n 'password',\n 'search',\n 'url',\n 'tel',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n] as const;\n\n/**\n * A customizable text input component with multiple variants, label placements, and form features.\n *\n * @element ore-input\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - Label placement: 'inset' | 'outside'\n * @attr {string} type - HTML input type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search'\n * @attr {string} value - Current input value\n * @attr {string} placeholder - Placeholder text\n * @attr {string} name - Form field name\n * @attr {string} helper - Helper text displayed below the input (fallback when the `helper` slot is empty)\n * @attr {string} error - Error message — marks the field as invalid (fallback when the `error` slot is empty)\n * @attr {boolean} disabled - Disable input interaction\n * @attr {boolean} readonly - Make the input read-only\n * @attr {boolean} required - Mark the field as required\n * @attr {boolean} loading - Show an inline spinner and force the field disabled\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text'\n * @attr {string} size - Input size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n *\n * @fires input - Emitted when input value changes (on every keystroke). detail: { value: string; originalEvent: Event }\n * @fires change - Emitted when input loses focus with changed value. detail: { value: string; originalEvent: Event }\n *\n * @slot prefix - Content before the input (e.g., icons)\n * @slot suffix - Content after the input (e.g., clear button, validation icon)\n * @slot label - Replaces the label text — slotted content takes precedence over the `label` prop\n * @slot helper - Replaces the helper text — slotted content takes precedence over the `helper` prop\n * @slot error - Replaces the error text — slotted content takes precedence over the `error` prop\n *\n * @part wrapper - The input wrapper element\n * @part label - The label element (inset or outside)\n * @part field - The field container element\n * @part input-row - The input row container element\n * @part input - The input element\n * @part status-icon - The inline error/success icon shown inside the field\n * @part spinner - The inline loading spinner shown inside the field while `loading`\n * @part helper - The helper text element\n *\n * @cssprop --input-bg - Background color\n * @cssprop --input-color - Text color\n * @cssprop --input-border-color - Border color\n * @cssprop --input-placeholder-color - Placeholder text color\n * @cssprop --input-radius - Border radius\n * @cssprop --input-padding - Inner padding (block inline)\n * @cssprop --input-gap - Gap between prefix/suffix icons and input text\n * @cssprop --input-font-size - Font size\n * @cssprop --input-height - Field height\n * @cssprop --input-hover-bg - Field background on hover (flat/ghost variants)\n * @cssprop --input-hover-border-color - Field border on hover (flat/bordered variants)\n * @cssprop --input-focus-bg - Field background when focused (flat variant)\n * @cssprop --input-focus-border-color - Field border when focused (flat/text variants)\n *\n * @example\n * ```html\n * <ore-input type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n * <ore-input label=\"Name\" variant=\"bordered\" color=\"primary\" />\n * <ore-input label=\"Username\" error=\"That username is taken\" />\n * <ore-input label=\"Username\" success />\n * <ore-input label=\"Username\" loading />\n * ```\n */\nexport const INPUT_TAG = 'ore-input' as const;\ndefine<OreInputProps>(INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n autocomplete: prop.string(),\n clearable: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n inputmode: prop.string<'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n loading: prop.bool(false),\n maxlength: prop.json(undefined as number | undefined),\n minlength: prop.json(undefined as number | undefined),\n name: prop.string(),\n pattern: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.data<((el: HTMLInputElement | null) => void) | null>(),\n required: prop.bool(false),\n success: prop.bool(false),\n type: prop.oneOf(VALID_INPUT_TYPES, 'text'),\n value: prop.string(),\n variant: prop.string<'flat' | 'text' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const emit = useEmit<OreInputEvents>();\n const slots = useSlots();\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const showPassword = signal(false);\n const inputRef = ref<HTMLInputElement>();\n\n const hasLabel = computed(() => !!props.label.value || slots.has('label').value);\n // `loading` behaves like a temporary `disabled` — forces the inner <input> out of\n // constraint validation and interaction for the duration, layered on top of any real\n // `disabled` prop or form-context disabling already folded into `fCtxProps.disabled`.\n const isDisabled = computed(() => fCtxProps.disabled.value || props.loading.value);\n\n const abortSignal = lifecycleSignal(onCleanup);\n const tf = createTextField({\n disabled: isDisabled,\n error: props.error,\n hasLabel,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n maxLength: props.maxlength,\n onChange: (event: Event, value: string) => {\n emit('change', { originalEvent: event, value });\n },\n onInput: (event: Event, value: string) => {\n emit('input', { originalEvent: event, value });\n },\n prefix: 'input',\n readonly: props.readonly,\n required: props.required,\n signal: abortSignal,\n validateOn: formCtx?.validateOn,\n value: props.value,\n });\n\n tf.attachFormField(\n useField<string>({\n disabled: tf.disabled,\n onReset: tf.reset,\n toFormValue: (v) => v,\n validationMessage: tf.validationMessage,\n validity: tf.validity,\n value: tf.value,\n }),\n );\n\n const {\n ariaDescribedBy,\n ariaErrorMessage,\n ariaInvalid,\n ariaLabelledBy,\n assistiveId,\n clear: clearValue,\n counter,\n errorId,\n errorText,\n fieldId: inputId,\n helperText,\n labelId,\n labelVisible,\n value: fieldValue,\n wire,\n } = tf;\n\n onElement(inputRef, (el) => {\n wire(el, abortSignal);\n\n const unwireRef = bindRefCallback(props.ref, el);\n\n return () => {\n unwireRef();\n };\n });\n\n const clear = (event?: Event): void => {\n clearValue(event);\n inputRef.value?.focus();\n };\n\n const resolvedInputType = (): string =>\n props.type.value === 'password' && showPassword.value ? 'text' : (props.type.value ?? 'text');\n\n bind({\n attr: {\n error: errorAttr(errorText),\n 'has-value': () => (fieldValue.value ? true : undefined),\n size: fCtxProps.size,\n // Reflects `success` only once `error` is confirmed empty — keeps the two host\n // attributes mutually exclusive even if a consumer sets both props at once.\n success: () => (props.success.value && !errorText.value ? true : undefined),\n variant: fCtxProps.variant,\n },\n });\n\n const labelHidden = () => !labelVisible.value;\n const passwordToggleLabel = () => (showPassword.value ? 'Hide password' : 'Show password');\n const passwordTogglePressed = () => String(showPassword.value);\n const passwordToggleIcon = () =>\n showPassword.value\n ? html`<ore-icon name=\"eye-off\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`\n : html`<ore-icon name=\"eye\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`;\n const helperHidden = () => !!errorText.value || !helperText.value;\n const errorHidden = () => !errorText.value;\n const counterNearLimit = () => (counter?.value.counterNearLimit && !counter?.value.counterAtLimit ? '' : null);\n const counterAtLimit = () => (counter?.value.counterAtLimit ? '' : null);\n const counterHidden = () => !counter;\n const counterText = () => counter?.value.counterText ?? '';\n\n const clearTabIndex = () => (fieldValue.value ? '0' : '-1');\n const pwdToggleTabIndex = () => (props.type.value === 'password' ? '0' : '-1');\n\n const togglePassword = () => {\n showPassword.value = !showPassword.value;\n inputRef.value?.focus();\n };\n\n return html`\n <div class=\"input-wrapper\" part=\"wrapper\">\n <label class=\"label\" for=\"${inputId}\" id=\"${labelId}\" part=\"label\" ?hidden=\"${labelHidden}\"\n ><slot name=\"label\">${props.label}</slot></label\n >\n <div class=\"field\" part=\"field\">\n <div class=\"input-row\" part=\"input-row\">\n <slot name=\"prefix\"></slot>\n <input\n part=\"input\"\n id=\"${inputId}\"\n :type=\"${resolvedInputType}\"\n :name=\"${props.name}\"\n :placeholder=\"${props.placeholder}\"\n :autocomplete=\"${props.autocomplete}\"\n :inputmode=\"${props.inputmode}\"\n :maxlength=\"${props.maxlength}\"\n :minlength=\"${props.minlength}\"\n :pattern=\"${props.pattern}\"\n ?disabled=\"${isDisabled}\"\n ?readonly=\"${props.readonly}\"\n ?required=\"${props.required}\"\n :value=\"${live(fieldValue)}\"\n :aria-labelledby=\"${ariaLabelledBy}\"\n :aria-describedby=\"${ariaDescribedBy}\"\n :aria-errormessage=\"${ariaErrorMessage}\"\n :aria-invalid=\"${ariaInvalid}\"\n :aria-busy=\"${() => (props.loading.value ? 'true' : null)}\"\n ref=\"${inputRef}\" />\n <slot name=\"suffix\"></slot>\n ${renderStatusIcon(errorText)}\n <span class=\"field-spinner\" part=\"spinner\" role=\"status\" aria-label=\"Loading\"></span>\n <button\n class=\"pwd-toggle-btn\"\n part=\"pwd-toggle\"\n type=\"button\"\n :aria-label=\"${passwordToggleLabel}\"\n :aria-pressed=\"${passwordTogglePressed}\"\n :tabindex=\"${pwdToggleTabIndex}\"\n @click=\"${togglePassword}\">\n ${passwordToggleIcon}\n </button>\n <button\n aria-label=\"Clear\"\n class=\"clear-btn\"\n part=\"clear\"\n type=\"button\"\n :tabindex=\"${clearTabIndex}\"\n @click=\"${clear}\">\n <ore-icon aria-hidden=\"true\" name=\"x\" size=\"12\" stroke-width=\"2.5\"></ore-icon>\n </button>\n </div>\n </div>\n <div class=\"helper-text\" aria-live=\"polite\" id=\"${assistiveId}\" part=\"helper\" ?hidden=\"${helperHidden}\">\n <slot name=\"helper\">${() => helperText.value}</slot>\n </div>\n <div class=\"helper-text\" id=\"${errorId}\" role=\"alert\" part=\"error\" ?hidden=\"${errorHidden}\">\n <slot name=\"error\">${() => errorText.value}</slot>\n </div>\n <div\n class=\"char-counter\"\n part=\"char-counter\"\n :data-near-limit=\"${counterNearLimit}\"\n :data-at-limit=\"${counterAtLimit}\"\n ?hidden=\"${counterHidden}\">\n ${counterText}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [\n ...fieldMixins,\n sizeVariantMixin(FIELD_SIZE_PRESET),\n forcedColorsFocusMixin('input'),\n componentStyles,\n // Must come after `componentStyles` — `@layer` precedence is fixed by which layer name is\n // *first* referenced across this whole array, and `componentStyles` is what establishes\n // `refine.base` (the unconditional `--_bg`/`--_border-color` defaults this mixin's\n // `refine.variants` rules need to win over). Placed earlier, `refine.variants` would end up\n // registered as the *lower*-priority layer, and every variant would silently render as the\n // base default — exactly the bug this ordering fixes.\n fieldVariantMixin({ container: '.field', text: 'input', tokenPrefix: 'input' }),\n ],\n});\n"],"mappings":"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"}
package/dist/input.js CHANGED
@@ -1,19 +1,22 @@
1
1
  import { sizeVariantMixin as e } from "./styles/mixins/shape.css.js";
2
2
  import { forcedColorsFocusMixin as t } from "./styles/mixins/theme.css.js";
3
- import { fieldMixins as n } from "./styles/index.js";
4
- import { disablableBundle as r, roundableBundle as i, sizableBundle as a, themableBundle as o } from "./shared/prop-bundles.js";
5
- import { FIELD_SIZE_PRESET as s } from "./shared/size-presets.js";
6
- import { lifecycleSignal as c } from "./headless/ore.js";
7
- import { createTextField as l } from "./headless/text-field.js";
8
- import { errorAttr as u } from "./inputs/shared/field-binding.js";
9
- import { FORM_CTX as d, useFormContext as f } from "./inputs/shared/form-context.js";
10
- import p from "./inputs/input/input.css.js";
11
- import { bind as m, define as h, html as g, inject as _, onCleanup as v, onElement as y, prop as b, ref as x, useEmit as S, useSlots as C } from "@vielzeug/ore";
12
- import { live as w } from "@vielzeug/ore/directives";
13
- import { computed as T, signal as E, watch as D } from "@vielzeug/ripple";
14
- import { useField as O } from "@vielzeug/ore/forms";
3
+ import { fieldVariantMixin as n } from "./styles/mixins/field-variants.css.js";
4
+ import { fieldMixins as r } from "./styles/index.js";
5
+ import { disablableBundle as i, roundableBundle as a, sizableBundle as o, themableBundle as s } from "./shared/prop-bundles.js";
6
+ import { FIELD_SIZE_PRESET as c } from "./shared/size-presets.js";
7
+ import { lifecycleSignal as l } from "./headless/ore.js";
8
+ import { bindRefCallback as u } from "./headless/ref-callback.js";
9
+ import { createTextField as d } from "./headless/text-field.js";
10
+ import { errorAttr as f } from "./inputs/shared/field-binding.js";
11
+ import { FORM_CTX as p, useFormContext as m } from "./inputs/shared/form-context.js";
12
+ import { renderStatusIcon as h } from "./inputs/shared/templates.js";
13
+ import g from "./inputs/input/input.css.js";
14
+ import { bind as _, define as v, html as y, inject as b, onCleanup as x, onElement as S, prop as C, ref as w, useEmit as T, useSlots as E } from "@vielzeug/ore";
15
+ import { computed as D, signal as O } from "@vielzeug/ripple";
16
+ import { useField as k } from "@vielzeug/ore/forms";
17
+ import { live as A } from "@vielzeug/ore/directives";
15
18
  //#region src/inputs/input/input.ts
16
- var k = [
19
+ var j = [
17
20
  "text",
18
21
  "email",
19
22
  "password",
@@ -26,37 +29,39 @@ var k = [
26
29
  "datetime-local",
27
30
  "month",
28
31
  "week"
29
- ], A = "ore-input";
30
- h(A, {
32
+ ], M = "ore-input";
33
+ v(M, {
31
34
  formAssociated: !0,
32
35
  props: {
36
+ ...s,
33
37
  ...o,
34
- ...a,
35
- ...r,
36
38
  ...i,
37
- autocomplete: b.string(),
38
- clearable: b.bool(!1),
39
- error: b.string(),
40
- fullwidth: b.bool(!1),
41
- helper: b.string(),
42
- inputmode: b.string(),
43
- label: b.string(),
44
- "label-placement": b.oneOf(["inset", "outside"], "inset"),
45
- maxlength: b.json(void 0),
46
- minlength: b.json(void 0),
47
- name: b.string(),
48
- pattern: b.string(),
49
- placeholder: b.string(),
50
- readonly: b.bool(!1),
51
- ref: b.json(void 0),
52
- required: b.bool(!1),
53
- type: b.oneOf(k, "text"),
54
- value: b.string(),
55
- variant: b.string()
39
+ ...a,
40
+ autocomplete: C.string(),
41
+ clearable: C.bool(!1),
42
+ error: C.string(),
43
+ fullwidth: C.bool(!1),
44
+ helper: C.string(),
45
+ inputmode: C.string(),
46
+ label: C.string(),
47
+ "label-placement": C.oneOf(["inset", "outside"], "inset"),
48
+ loading: C.bool(!1),
49
+ maxlength: C.json(void 0),
50
+ minlength: C.json(void 0),
51
+ name: C.string(),
52
+ pattern: C.string(),
53
+ placeholder: C.string(),
54
+ readonly: C.bool(!1),
55
+ ref: C.data(),
56
+ required: C.bool(!1),
57
+ success: C.bool(!1),
58
+ type: C.oneOf(j, "text"),
59
+ value: C.string(),
60
+ variant: C.string()
56
61
  },
57
62
  setup(e) {
58
- let t = S(), n = C(), r = _(d), i = f(e, r), a = E(!1), o = x(), s = T(() => !!e.label.value || n.has("label").value), p = c(v), h = l({
59
- disabled: i.disabled,
63
+ let t = T(), n = E(), r = b(p), i = m(e, r), a = O(!1), o = w(), s = D(() => !!e.label.value || n.has("label").value), c = D(() => i.disabled.value || e.loading.value), g = l(x), v = d({
64
+ disabled: c,
60
65
  error: e.error,
61
66
  hasLabel: s,
62
67
  helper: e.helper,
@@ -78,35 +83,34 @@ h(A, {
78
83
  prefix: "input",
79
84
  readonly: e.readonly,
80
85
  required: e.required,
81
- signal: p,
86
+ signal: g,
82
87
  validateOn: r?.validateOn,
83
88
  value: e.value
84
89
  });
85
- h.attachFormField(O({
86
- disabled: h.disabled,
87
- onReset: h.reset,
90
+ v.attachFormField(k({
91
+ disabled: v.disabled,
92
+ onReset: v.reset,
88
93
  toFormValue: (e) => e,
89
- validationMessage: h.validationMessage,
90
- validity: h.validity,
91
- value: h.value
94
+ validationMessage: v.validationMessage,
95
+ validity: v.validity,
96
+ value: v.value
92
97
  }));
93
- let { ariaDescribedBy: b, ariaErrorMessage: k, ariaInvalid: A, ariaLabelledBy: j, assistiveId: M, clear: N, counter: P, errorId: F, errorText: I, fieldId: L, helperText: R, labelId: z, labelVisible: B, value: V, wire: H } = h;
94
- return y(o, (t) => {
95
- H(t, p), e.ref.value?.(t);
96
- let n = D(e.ref, (e) => {
97
- e?.(t);
98
- });
98
+ let { ariaDescribedBy: C, ariaErrorMessage: j, ariaInvalid: M, ariaLabelledBy: N, assistiveId: P, clear: F, counter: I, errorId: L, errorText: R, fieldId: z, helperText: B, labelId: V, labelVisible: H, value: U, wire: W } = v;
99
+ return S(o, (t) => {
100
+ W(t, g);
101
+ let n = u(e.ref, t);
99
102
  return () => {
100
- n.dispose(), e.ref.value?.(null);
103
+ n();
101
104
  };
102
- }), m({ attr: {
103
- error: u(I),
104
- "has-value": () => V.value ? !0 : void 0,
105
+ }), _({ attr: {
106
+ error: f(R),
107
+ "has-value": () => U.value ? !0 : void 0,
105
108
  size: i.size,
109
+ success: () => e.success.value && !R.value ? !0 : void 0,
106
110
  variant: i.variant
107
- } }), g`
111
+ } }), y`
108
112
  <div class="input-wrapper" part="wrapper">
109
- <label class="label" for="${L}" id="${z}" part="label" ?hidden="${() => !B.value}"
113
+ <label class="label" for="${z}" id="${V}" part="label" ?hidden="${() => !H.value}"
110
114
  ><slot name="label">${e.label}</slot></label
111
115
  >
112
116
  <div class="field" part="field">
@@ -114,7 +118,7 @@ h(A, {
114
118
  <slot name="prefix"></slot>
115
119
  <input
116
120
  part="input"
117
- id="${L}"
121
+ id="${z}"
118
122
  :type="${() => e.type.value === "password" && a.value ? "text" : e.type.value ?? "text"}"
119
123
  :name="${e.name}"
120
124
  :placeholder="${e.placeholder}"
@@ -123,16 +127,19 @@ h(A, {
123
127
  :maxlength="${e.maxlength}"
124
128
  :minlength="${e.minlength}"
125
129
  :pattern="${e.pattern}"
126
- ?disabled="${e.disabled}"
130
+ ?disabled="${c}"
127
131
  ?readonly="${e.readonly}"
128
132
  ?required="${e.required}"
129
- :value="${w(V)}"
130
- :aria-labelledby="${j}"
131
- :aria-describedby="${b}"
132
- :aria-errormessage="${k}"
133
- :aria-invalid="${A}"
133
+ :value="${A(U)}"
134
+ :aria-labelledby="${N}"
135
+ :aria-describedby="${C}"
136
+ :aria-errormessage="${j}"
137
+ :aria-invalid="${M}"
138
+ :aria-busy="${() => e.loading.value ? "true" : null}"
134
139
  ref="${o}" />
135
140
  <slot name="suffix"></slot>
141
+ ${h(R)}
142
+ <span class="field-spinner" part="spinner" role="status" aria-label="Loading"></span>
136
143
  <button
137
144
  class="pwd-toggle-btn"
138
145
  part="pwd-toggle"
@@ -143,47 +150,52 @@ h(A, {
143
150
  @click="${() => {
144
151
  a.value = !a.value, o.value?.focus();
145
152
  }}">
146
- ${() => a.value ? g`<ore-icon name="eye-off" size="14" stroke-width="2" aria-hidden="true"></ore-icon>` : g`<ore-icon name="eye" size="14" stroke-width="2" aria-hidden="true"></ore-icon>`}
153
+ ${() => a.value ? y`<ore-icon name="eye-off" size="14" stroke-width="2" aria-hidden="true"></ore-icon>` : y`<ore-icon name="eye" size="14" stroke-width="2" aria-hidden="true"></ore-icon>`}
147
154
  </button>
148
155
  <button
149
156
  aria-label="Clear"
150
157
  class="clear-btn"
151
158
  part="clear"
152
159
  type="button"
153
- :tabindex="${() => V.value ? "0" : "-1"}"
160
+ :tabindex="${() => U.value ? "0" : "-1"}"
154
161
  @click="${(e) => {
155
- N(e), o.value?.focus();
162
+ F(e), o.value?.focus();
156
163
  }}">
157
164
  <ore-icon aria-hidden="true" name="x" size="12" stroke-width="2.5"></ore-icon>
158
165
  </button>
159
166
  </div>
160
167
  </div>
161
- <div class="helper-text" aria-live="polite" id="${M}" part="helper" ?hidden="${() => !!I.value || !R.value}">
162
- <slot name="helper">${() => R.value}</slot>
168
+ <div class="helper-text" aria-live="polite" id="${P}" part="helper" ?hidden="${() => !!R.value || !B.value}">
169
+ <slot name="helper">${() => B.value}</slot>
163
170
  </div>
164
- <div class="helper-text" id="${F}" role="alert" part="error" ?hidden="${() => !I.value}">
165
- <slot name="error">${() => I.value}</slot>
171
+ <div class="helper-text" id="${L}" role="alert" part="error" ?hidden="${() => !R.value}">
172
+ <slot name="error">${() => R.value}</slot>
166
173
  </div>
167
174
  <div
168
175
  class="char-counter"
169
176
  part="char-counter"
170
- :data-near-limit="${() => P?.value.counterNearLimit && !P?.value.counterAtLimit ? "" : null}"
171
- :data-at-limit="${() => P?.value.counterAtLimit ? "" : null}"
172
- ?hidden="${() => !P}">
173
- ${() => P?.value.counterText ?? ""}
177
+ :data-near-limit="${() => I?.value.counterNearLimit && !I?.value.counterAtLimit ? "" : null}"
178
+ :data-at-limit="${() => I?.value.counterAtLimit ? "" : null}"
179
+ ?hidden="${() => !I}">
180
+ ${() => I?.value.counterText ?? ""}
174
181
  </div>
175
182
  </div>
176
183
  `;
177
184
  },
178
185
  shadow: { delegatesFocus: !0 },
179
186
  styles: [
180
- ...n,
181
- e(s),
187
+ ...r,
188
+ e(c),
182
189
  t("input"),
183
- p
190
+ g,
191
+ n({
192
+ container: ".field",
193
+ text: "input",
194
+ tokenPrefix: "input"
195
+ })
184
196
  ]
185
197
  });
186
198
  //#endregion
187
- export { A as INPUT_TAG };
199
+ export { M as INPUT_TAG };
188
200
 
189
201
  //# sourceMappingURL=input.js.map
package/dist/input.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","names":[],"sources":["../src/inputs/input/input.ts"],"sourcesContent":["import { define, html, inject, prop, ref, bind, onCleanup, onElement, useEmit, useSlots } from '@vielzeug/ore';\nimport { live } from '@vielzeug/ore/directives';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { TextFieldProps } from '../../shared';\nimport type { InputType, VisualVariant } from '../../types';\n\nimport { lifecycleSignal, createTextField } from '../../headless';\nimport { disablableBundle, FIELD_SIZE_PRESET, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport '../../content/icon/icon';\nimport { fieldMixins, forcedColorsFocusMixin, sizeVariantMixin } from '../../styles';\nimport { errorAttr } from '../shared/field-binding';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport componentStyles from './input.css?inline';\n\n/** Input component properties */\n\nexport type OreInputEvents = {\n change: { originalEvent: Event; value: string };\n input: { originalEvent: Event; value: string };\n};\n\nexport type OreInputProps = TextFieldProps<Exclude<VisualVariant, 'frost'>> & {\n /** Autocomplete hint */\n autocomplete?: string;\n /** Show a clear (×) button when the field has a value */\n clearable?: boolean;\n /** Virtual keyboard hint for mobile devices */\n inputmode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n /** Maximum character length — shows a counter below the input */\n maxlength?: number;\n /** Minimum character length */\n minlength?: number;\n /** HTML pattern attribute for client-side validation */\n pattern?: string;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts. Intended for composed components that\n * need imperative access to the raw input element.\n * Set as a JS property: `bitInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** HTML input type */\n type?: InputType;\n};\n\nconst VALID_INPUT_TYPES = [\n 'text',\n 'email',\n 'password',\n 'search',\n 'url',\n 'tel',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n] as const;\n\n/**\n * A customizable text input component with multiple variants, label placements, and form features.\n *\n * @element ore-input\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - Label placement: 'inset' | 'outside'\n * @attr {string} type - HTML input type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search'\n * @attr {string} value - Current input value\n * @attr {string} placeholder - Placeholder text\n * @attr {string} name - Form field name\n * @attr {string} helper - Helper text displayed below the input (fallback when the `helper` slot is empty)\n * @attr {string} error - Error message — marks the field as invalid (fallback when the `error` slot is empty)\n * @attr {boolean} disabled - Disable input interaction\n * @attr {boolean} readonly - Make the input read-only\n * @attr {boolean} required - Mark the field as required\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text'\n * @attr {string} size - Input size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n *\n * @fires input - Emitted when input value changes (on every keystroke). detail: { value: string; originalEvent: Event }\n * @fires change - Emitted when input loses focus with changed value. detail: { value: string; originalEvent: Event }\n *\n * @slot prefix - Content before the input (e.g., icons)\n * @slot suffix - Content after the input (e.g., clear button, validation icon)\n * @slot label - Replaces the label text — slotted content takes precedence over the `label` prop\n * @slot helper - Replaces the helper text — slotted content takes precedence over the `helper` prop\n * @slot error - Replaces the error text — slotted content takes precedence over the `error` prop\n *\n * @part wrapper - The input wrapper element\n * @part label - The label element (inset or outside)\n * @part field - The field container element\n * @part input-row - The input row container element\n * @part input - The input element\n * @part helper - The helper text element\n *\n * @cssprop --input-bg - Background color\n * @cssprop --input-color - Text color\n * @cssprop --input-border-color - Border color\n * @cssprop --input-placeholder-color - Placeholder text color\n * @cssprop --input-radius - Border radius\n * @cssprop --input-padding - Inner padding (block inline)\n * @cssprop --input-gap - Gap between prefix/suffix icons and input text\n * @cssprop --input-font-size - Font size\n * @cssprop --input-height - Field height\n * @cssprop --input-hover-bg - Field background on hover (flat/ghost variants)\n * @cssprop --input-hover-border-color - Field border on hover (flat/bordered variants)\n * @cssprop --input-focus-bg - Field background when focused (flat variant)\n * @cssprop --input-focus-border-color - Field border when focused (flat/text variants)\n *\n * @example\n * ```html\n * <ore-input type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n * <ore-input label=\"Name\" variant=\"bordered\" color=\"primary\" />\n * ```\n */\nexport const INPUT_TAG = 'ore-input' as const;\ndefine<OreInputProps>(INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n autocomplete: prop.string(),\n clearable: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n inputmode: prop.string<'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n maxlength: prop.json(undefined as number | undefined),\n minlength: prop.json(undefined as number | undefined),\n name: prop.string(),\n pattern: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.json(undefined as ((el: HTMLInputElement | null) => void) | null | undefined),\n required: prop.bool(false),\n type: prop.oneOf(VALID_INPUT_TYPES, 'text'),\n value: prop.string(),\n variant: prop.string<'flat' | 'text' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const emit = useEmit<OreInputEvents>();\n const slots = useSlots();\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const showPassword = signal(false);\n const inputRef = ref<HTMLInputElement>();\n\n const hasLabel = computed(() => !!props.label.value || slots.has('label').value);\n\n const abortSignal = lifecycleSignal(onCleanup);\n const tf = createTextField({\n disabled: fCtxProps.disabled,\n error: props.error,\n hasLabel,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n maxLength: props.maxlength,\n onChange: (event: Event, value: string) => {\n emit('change', { originalEvent: event, value });\n },\n onInput: (event: Event, value: string) => {\n emit('input', { originalEvent: event, value });\n },\n prefix: 'input',\n readonly: props.readonly,\n required: props.required,\n signal: abortSignal,\n validateOn: formCtx?.validateOn,\n value: props.value,\n });\n\n tf.attachFormField(\n useField<string>({\n disabled: tf.disabled,\n onReset: tf.reset,\n toFormValue: (v) => v,\n validationMessage: tf.validationMessage,\n validity: tf.validity,\n value: tf.value,\n }),\n );\n\n const {\n ariaDescribedBy,\n ariaErrorMessage,\n ariaInvalid,\n ariaLabelledBy,\n assistiveId,\n clear: clearValue,\n counter,\n errorId,\n errorText,\n fieldId: inputId,\n helperText,\n labelId,\n labelVisible,\n value: fieldValue,\n wire,\n } = tf;\n\n onElement(inputRef, (el) => {\n wire(el, abortSignal);\n\n // Immediate fire for when the prop is already set on mount.\n props.ref.value?.(el);\n\n // Reactive watcher so that if props.ref is set *after* the inner\n // <input> mounts (e.g. parent sets it via a ref callback after render),\n // the new callback still receives the live element.\n const sub = watch(props.ref, (cb) => {\n cb?.(el);\n });\n\n return () => {\n sub.dispose();\n props.ref.value?.(null);\n };\n });\n\n const clear = (event?: Event): void => {\n clearValue(event);\n inputRef.value?.focus();\n };\n\n const resolvedInputType = (): string =>\n props.type.value === 'password' && showPassword.value ? 'text' : (props.type.value ?? 'text');\n\n bind({\n attr: {\n error: errorAttr(errorText),\n 'has-value': () => (fieldValue.value ? true : undefined),\n size: fCtxProps.size,\n variant: fCtxProps.variant,\n },\n });\n\n const labelHidden = () => !labelVisible.value;\n const passwordToggleLabel = () => (showPassword.value ? 'Hide password' : 'Show password');\n const passwordTogglePressed = () => String(showPassword.value);\n const passwordToggleIcon = () =>\n showPassword.value\n ? html`<ore-icon name=\"eye-off\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`\n : html`<ore-icon name=\"eye\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`;\n const helperHidden = () => !!errorText.value || !helperText.value;\n const errorHidden = () => !errorText.value;\n const counterNearLimit = () => (counter?.value.counterNearLimit && !counter?.value.counterAtLimit ? '' : null);\n const counterAtLimit = () => (counter?.value.counterAtLimit ? '' : null);\n const counterHidden = () => !counter;\n const counterText = () => counter?.value.counterText ?? '';\n\n const clearTabIndex = () => (fieldValue.value ? '0' : '-1');\n const pwdToggleTabIndex = () => (props.type.value === 'password' ? '0' : '-1');\n\n const togglePassword = () => {\n showPassword.value = !showPassword.value;\n inputRef.value?.focus();\n };\n\n return html`\n <div class=\"input-wrapper\" part=\"wrapper\">\n <label class=\"label\" for=\"${inputId}\" id=\"${labelId}\" part=\"label\" ?hidden=\"${labelHidden}\"\n ><slot name=\"label\">${props.label}</slot></label\n >\n <div class=\"field\" part=\"field\">\n <div class=\"input-row\" part=\"input-row\">\n <slot name=\"prefix\"></slot>\n <input\n part=\"input\"\n id=\"${inputId}\"\n :type=\"${resolvedInputType}\"\n :name=\"${props.name}\"\n :placeholder=\"${props.placeholder}\"\n :autocomplete=\"${props.autocomplete}\"\n :inputmode=\"${props.inputmode}\"\n :maxlength=\"${props.maxlength}\"\n :minlength=\"${props.minlength}\"\n :pattern=\"${props.pattern}\"\n ?disabled=\"${props.disabled}\"\n ?readonly=\"${props.readonly}\"\n ?required=\"${props.required}\"\n :value=\"${live(fieldValue)}\"\n :aria-labelledby=\"${ariaLabelledBy}\"\n :aria-describedby=\"${ariaDescribedBy}\"\n :aria-errormessage=\"${ariaErrorMessage}\"\n :aria-invalid=\"${ariaInvalid}\"\n ref=\"${inputRef}\" />\n <slot name=\"suffix\"></slot>\n <button\n class=\"pwd-toggle-btn\"\n part=\"pwd-toggle\"\n type=\"button\"\n :aria-label=\"${passwordToggleLabel}\"\n :aria-pressed=\"${passwordTogglePressed}\"\n :tabindex=\"${pwdToggleTabIndex}\"\n @click=\"${togglePassword}\">\n ${passwordToggleIcon}\n </button>\n <button\n aria-label=\"Clear\"\n class=\"clear-btn\"\n part=\"clear\"\n type=\"button\"\n :tabindex=\"${clearTabIndex}\"\n @click=\"${clear}\">\n <ore-icon aria-hidden=\"true\" name=\"x\" size=\"12\" stroke-width=\"2.5\"></ore-icon>\n </button>\n </div>\n </div>\n <div class=\"helper-text\" aria-live=\"polite\" id=\"${assistiveId}\" part=\"helper\" ?hidden=\"${helperHidden}\">\n <slot name=\"helper\">${() => helperText.value}</slot>\n </div>\n <div class=\"helper-text\" id=\"${errorId}\" role=\"alert\" part=\"error\" ?hidden=\"${errorHidden}\">\n <slot name=\"error\">${() => errorText.value}</slot>\n </div>\n <div\n class=\"char-counter\"\n part=\"char-counter\"\n :data-near-limit=\"${counterNearLimit}\"\n :data-at-limit=\"${counterAtLimit}\"\n ?hidden=\"${counterHidden}\">\n ${counterText}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [...fieldMixins, sizeVariantMixin(FIELD_SIZE_PRESET), forcedColorsFocusMixin('input'), componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"input.js","names":[],"sources":["../src/inputs/input/input.ts"],"sourcesContent":["import { define, html, inject, prop, ref, bind, onCleanup, onElement, useEmit, useSlots } from '@vielzeug/ore';\nimport { live } from '@vielzeug/ore/directives';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, signal } from '@vielzeug/ripple';\n\nimport type { TextFieldProps } from '../../shared';\nimport type { InputType, VisualVariant } from '../../types';\n\nimport { bindRefCallback, lifecycleSignal, createTextField } from '../../headless';\nimport { disablableBundle, FIELD_SIZE_PRESET, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport '../../content/icon/icon';\nimport { fieldMixins, fieldVariantMixin, forcedColorsFocusMixin, sizeVariantMixin } from '../../styles';\nimport { errorAttr } from '../shared/field-binding';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport { renderStatusIcon } from '../shared/templates';\nimport componentStyles from './input.css?inline';\n\n/** Input component properties */\n\nexport type OreInputEvents = {\n change: { originalEvent: Event; value: string };\n input: { originalEvent: Event; value: string };\n};\n\nexport type OreInputProps = TextFieldProps<Exclude<VisualVariant, 'frost'>> & {\n /** Autocomplete hint */\n autocomplete?: string;\n /** Show a clear (×) button when the field has a value */\n clearable?: boolean;\n /** Virtual keyboard hint for mobile devices */\n inputmode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';\n /**\n * Shows an inline spinner inside the field and forces the inner `<input>` into\n * `disabled` for the duration — use while an async validation/submission request\n * is in flight (e.g. checking username availability) to prevent double-submits.\n */\n loading?: boolean;\n /** Maximum character length — shows a counter below the input */\n maxlength?: number;\n /** Minimum character length */\n minlength?: number;\n /** HTML pattern attribute for client-side validation */\n pattern?: string;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts. Intended for composed components that\n * need imperative access to the raw input element.\n * Set as a JS property: `bitInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** HTML input type */\n type?: InputType;\n};\n\nconst VALID_INPUT_TYPES = [\n 'text',\n 'email',\n 'password',\n 'search',\n 'url',\n 'tel',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n] as const;\n\n/**\n * A customizable text input component with multiple variants, label placements, and form features.\n *\n * @element ore-input\n *\n * @attr {string} label - Label text\n * @attr {string} label-placement - Label placement: 'inset' | 'outside'\n * @attr {string} type - HTML input type: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search'\n * @attr {string} value - Current input value\n * @attr {string} placeholder - Placeholder text\n * @attr {string} name - Form field name\n * @attr {string} helper - Helper text displayed below the input (fallback when the `helper` slot is empty)\n * @attr {string} error - Error message — marks the field as invalid (fallback when the `error` slot is empty)\n * @attr {boolean} disabled - Disable input interaction\n * @attr {boolean} readonly - Make the input read-only\n * @attr {boolean} required - Mark the field as required\n * @attr {boolean} loading - Show an inline spinner and force the field disabled\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost' | 'text'\n * @attr {string} size - Input size: 'sm' | 'md' | 'lg'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n *\n * @fires input - Emitted when input value changes (on every keystroke). detail: { value: string; originalEvent: Event }\n * @fires change - Emitted when input loses focus with changed value. detail: { value: string; originalEvent: Event }\n *\n * @slot prefix - Content before the input (e.g., icons)\n * @slot suffix - Content after the input (e.g., clear button, validation icon)\n * @slot label - Replaces the label text — slotted content takes precedence over the `label` prop\n * @slot helper - Replaces the helper text — slotted content takes precedence over the `helper` prop\n * @slot error - Replaces the error text — slotted content takes precedence over the `error` prop\n *\n * @part wrapper - The input wrapper element\n * @part label - The label element (inset or outside)\n * @part field - The field container element\n * @part input-row - The input row container element\n * @part input - The input element\n * @part status-icon - The inline error/success icon shown inside the field\n * @part spinner - The inline loading spinner shown inside the field while `loading`\n * @part helper - The helper text element\n *\n * @cssprop --input-bg - Background color\n * @cssprop --input-color - Text color\n * @cssprop --input-border-color - Border color\n * @cssprop --input-placeholder-color - Placeholder text color\n * @cssprop --input-radius - Border radius\n * @cssprop --input-padding - Inner padding (block inline)\n * @cssprop --input-gap - Gap between prefix/suffix icons and input text\n * @cssprop --input-font-size - Font size\n * @cssprop --input-height - Field height\n * @cssprop --input-hover-bg - Field background on hover (flat/ghost variants)\n * @cssprop --input-hover-border-color - Field border on hover (flat/bordered variants)\n * @cssprop --input-focus-bg - Field background when focused (flat variant)\n * @cssprop --input-focus-border-color - Field border when focused (flat/text variants)\n *\n * @example\n * ```html\n * <ore-input type=\"email\" label=\"Email\" placeholder=\"you@example.com\" />\n * <ore-input label=\"Name\" variant=\"bordered\" color=\"primary\" />\n * <ore-input label=\"Username\" error=\"That username is taken\" />\n * <ore-input label=\"Username\" success />\n * <ore-input label=\"Username\" loading />\n * ```\n */\nexport const INPUT_TAG = 'ore-input' as const;\ndefine<OreInputProps>(INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n autocomplete: prop.string(),\n clearable: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n inputmode: prop.string<'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'>(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n loading: prop.bool(false),\n maxlength: prop.json(undefined as number | undefined),\n minlength: prop.json(undefined as number | undefined),\n name: prop.string(),\n pattern: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.data<((el: HTMLInputElement | null) => void) | null>(),\n required: prop.bool(false),\n success: prop.bool(false),\n type: prop.oneOf(VALID_INPUT_TYPES, 'text'),\n value: prop.string(),\n variant: prop.string<'flat' | 'text' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const emit = useEmit<OreInputEvents>();\n const slots = useSlots();\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const showPassword = signal(false);\n const inputRef = ref<HTMLInputElement>();\n\n const hasLabel = computed(() => !!props.label.value || slots.has('label').value);\n // `loading` behaves like a temporary `disabled` — forces the inner <input> out of\n // constraint validation and interaction for the duration, layered on top of any real\n // `disabled` prop or form-context disabling already folded into `fCtxProps.disabled`.\n const isDisabled = computed(() => fCtxProps.disabled.value || props.loading.value);\n\n const abortSignal = lifecycleSignal(onCleanup);\n const tf = createTextField({\n disabled: isDisabled,\n error: props.error,\n hasLabel,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n maxLength: props.maxlength,\n onChange: (event: Event, value: string) => {\n emit('change', { originalEvent: event, value });\n },\n onInput: (event: Event, value: string) => {\n emit('input', { originalEvent: event, value });\n },\n prefix: 'input',\n readonly: props.readonly,\n required: props.required,\n signal: abortSignal,\n validateOn: formCtx?.validateOn,\n value: props.value,\n });\n\n tf.attachFormField(\n useField<string>({\n disabled: tf.disabled,\n onReset: tf.reset,\n toFormValue: (v) => v,\n validationMessage: tf.validationMessage,\n validity: tf.validity,\n value: tf.value,\n }),\n );\n\n const {\n ariaDescribedBy,\n ariaErrorMessage,\n ariaInvalid,\n ariaLabelledBy,\n assistiveId,\n clear: clearValue,\n counter,\n errorId,\n errorText,\n fieldId: inputId,\n helperText,\n labelId,\n labelVisible,\n value: fieldValue,\n wire,\n } = tf;\n\n onElement(inputRef, (el) => {\n wire(el, abortSignal);\n\n const unwireRef = bindRefCallback(props.ref, el);\n\n return () => {\n unwireRef();\n };\n });\n\n const clear = (event?: Event): void => {\n clearValue(event);\n inputRef.value?.focus();\n };\n\n const resolvedInputType = (): string =>\n props.type.value === 'password' && showPassword.value ? 'text' : (props.type.value ?? 'text');\n\n bind({\n attr: {\n error: errorAttr(errorText),\n 'has-value': () => (fieldValue.value ? true : undefined),\n size: fCtxProps.size,\n // Reflects `success` only once `error` is confirmed empty — keeps the two host\n // attributes mutually exclusive even if a consumer sets both props at once.\n success: () => (props.success.value && !errorText.value ? true : undefined),\n variant: fCtxProps.variant,\n },\n });\n\n const labelHidden = () => !labelVisible.value;\n const passwordToggleLabel = () => (showPassword.value ? 'Hide password' : 'Show password');\n const passwordTogglePressed = () => String(showPassword.value);\n const passwordToggleIcon = () =>\n showPassword.value\n ? html`<ore-icon name=\"eye-off\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`\n : html`<ore-icon name=\"eye\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>`;\n const helperHidden = () => !!errorText.value || !helperText.value;\n const errorHidden = () => !errorText.value;\n const counterNearLimit = () => (counter?.value.counterNearLimit && !counter?.value.counterAtLimit ? '' : null);\n const counterAtLimit = () => (counter?.value.counterAtLimit ? '' : null);\n const counterHidden = () => !counter;\n const counterText = () => counter?.value.counterText ?? '';\n\n const clearTabIndex = () => (fieldValue.value ? '0' : '-1');\n const pwdToggleTabIndex = () => (props.type.value === 'password' ? '0' : '-1');\n\n const togglePassword = () => {\n showPassword.value = !showPassword.value;\n inputRef.value?.focus();\n };\n\n return html`\n <div class=\"input-wrapper\" part=\"wrapper\">\n <label class=\"label\" for=\"${inputId}\" id=\"${labelId}\" part=\"label\" ?hidden=\"${labelHidden}\"\n ><slot name=\"label\">${props.label}</slot></label\n >\n <div class=\"field\" part=\"field\">\n <div class=\"input-row\" part=\"input-row\">\n <slot name=\"prefix\"></slot>\n <input\n part=\"input\"\n id=\"${inputId}\"\n :type=\"${resolvedInputType}\"\n :name=\"${props.name}\"\n :placeholder=\"${props.placeholder}\"\n :autocomplete=\"${props.autocomplete}\"\n :inputmode=\"${props.inputmode}\"\n :maxlength=\"${props.maxlength}\"\n :minlength=\"${props.minlength}\"\n :pattern=\"${props.pattern}\"\n ?disabled=\"${isDisabled}\"\n ?readonly=\"${props.readonly}\"\n ?required=\"${props.required}\"\n :value=\"${live(fieldValue)}\"\n :aria-labelledby=\"${ariaLabelledBy}\"\n :aria-describedby=\"${ariaDescribedBy}\"\n :aria-errormessage=\"${ariaErrorMessage}\"\n :aria-invalid=\"${ariaInvalid}\"\n :aria-busy=\"${() => (props.loading.value ? 'true' : null)}\"\n ref=\"${inputRef}\" />\n <slot name=\"suffix\"></slot>\n ${renderStatusIcon(errorText)}\n <span class=\"field-spinner\" part=\"spinner\" role=\"status\" aria-label=\"Loading\"></span>\n <button\n class=\"pwd-toggle-btn\"\n part=\"pwd-toggle\"\n type=\"button\"\n :aria-label=\"${passwordToggleLabel}\"\n :aria-pressed=\"${passwordTogglePressed}\"\n :tabindex=\"${pwdToggleTabIndex}\"\n @click=\"${togglePassword}\">\n ${passwordToggleIcon}\n </button>\n <button\n aria-label=\"Clear\"\n class=\"clear-btn\"\n part=\"clear\"\n type=\"button\"\n :tabindex=\"${clearTabIndex}\"\n @click=\"${clear}\">\n <ore-icon aria-hidden=\"true\" name=\"x\" size=\"12\" stroke-width=\"2.5\"></ore-icon>\n </button>\n </div>\n </div>\n <div class=\"helper-text\" aria-live=\"polite\" id=\"${assistiveId}\" part=\"helper\" ?hidden=\"${helperHidden}\">\n <slot name=\"helper\">${() => helperText.value}</slot>\n </div>\n <div class=\"helper-text\" id=\"${errorId}\" role=\"alert\" part=\"error\" ?hidden=\"${errorHidden}\">\n <slot name=\"error\">${() => errorText.value}</slot>\n </div>\n <div\n class=\"char-counter\"\n part=\"char-counter\"\n :data-near-limit=\"${counterNearLimit}\"\n :data-at-limit=\"${counterAtLimit}\"\n ?hidden=\"${counterHidden}\">\n ${counterText}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [\n ...fieldMixins,\n sizeVariantMixin(FIELD_SIZE_PRESET),\n forcedColorsFocusMixin('input'),\n componentStyles,\n // Must come after `componentStyles` — `@layer` precedence is fixed by which layer name is\n // *first* referenced across this whole array, and `componentStyles` is what establishes\n // `refine.base` (the unconditional `--_bg`/`--_border-color` defaults this mixin's\n // `refine.variants` rules need to win over). Placed earlier, `refine.variants` would end up\n // registered as the *lower*-priority layer, and every variant would silently render as the\n // base default — exactly the bug this ordering fixes.\n fieldVariantMixin({ container: '.field', text: 'input', tokenPrefix: 'input' }),\n ],\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsDA,IAAM,IAAoB;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAkEa,IAAY;AACzB,EAAsB,GAAW;CAC/B,gBAAgB;CAChB,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,cAAc,EAAK,OAAO;EAC1B,WAAW,EAAK,KAAK,EAAK;EAC1B,OAAO,EAAK,OAAO;EACnB,WAAW,EAAK,KAAK,EAAK;EAC1B,QAAQ,EAAK,OAAO;EACpB,WAAW,EAAK,OAAqF;EACrG,OAAO,EAAK,OAAO;EACnB,mBAAmB,EAAK,MAAM,CAAC,SAAS,SAAS,GAAY,OAAO;EACpE,SAAS,EAAK,KAAK,EAAK;EACxB,WAAW,EAAK,KAAK,KAAA,CAA+B;EACpD,WAAW,EAAK,KAAK,KAAA,CAA+B;EACpD,MAAM,EAAK,OAAO;EAClB,SAAS,EAAK,OAAO;EACrB,aAAa,EAAK,OAAO;EACzB,UAAU,EAAK,KAAK,EAAK;EACzB,KAAK,EAAK,KAAqD;EAC/D,UAAU,EAAK,KAAK,EAAK;EACzB,SAAS,EAAK,KAAK,EAAK;EACxB,MAAM,EAAK,MAAM,GAAmB,MAAM;EAC1C,OAAO,EAAK,OAAO;EACnB,SAAS,EAAK,OAAqE;CACrF;CACA,MAAM,GAAO;EACX,IAAM,IAAO,EAAwB,GAC/B,IAAQ,EAAS,GAEjB,IAAU,EAAO,CAAQ,GACzB,IAAY,EAAe,GAAO,CAAO,GACzC,IAAe,EAAO,EAAK,GAC3B,IAAW,EAAsB,GAEjC,IAAW,QAAe,CAAC,CAAC,EAAM,MAAM,SAAS,EAAM,IAAI,OAAO,CAAC,CAAC,KAAK,GAIzE,IAAa,QAAe,EAAU,SAAS,SAAS,EAAM,QAAQ,KAAK,GAE3E,IAAc,EAAgB,CAAS,GACvC,IAAK,EAAgB;GACzB,UAAU;GACV,OAAO,EAAM;GACb;GACA,QAAQ,EAAM;GACd,OAAO,EAAM;GACb,gBAAgB,EAAM;GACtB,WAAW,EAAM;GACjB,WAAW,GAAc,MAAkB;IACzC,EAAK,UAAU;KAAE,eAAe;KAAO;IAAM,CAAC;GAChD;GACA,UAAU,GAAc,MAAkB;IACxC,EAAK,SAAS;KAAE,eAAe;KAAO;IAAM,CAAC;GAC/C;GACA,QAAQ;GACR,UAAU,EAAM;GAChB,UAAU,EAAM;GAChB,QAAQ;GACR,YAAY,GAAS;GACrB,OAAO,EAAM;EACf,CAAC;EAED,EAAG,gBACD,EAAiB;GACf,UAAU,EAAG;GACb,SAAS,EAAG;GACZ,cAAc,MAAM;GACpB,mBAAmB,EAAG;GACtB,UAAU,EAAG;GACb,OAAO,EAAG;EACZ,CAAC,CACH;EAEA,IAAM,EACJ,oBACA,qBACA,gBACA,mBACA,gBACA,OAAO,GACP,YACA,YACA,cACA,SAAS,GACT,eACA,YACA,iBACA,OAAO,GACP,YACE;EAsDJ,OApDA,EAAU,IAAW,MAAO;GAC1B,EAAK,GAAI,CAAW;GAEpB,IAAM,IAAY,EAAgB,EAAM,KAAK,CAAE;GAE/C,aAAa;IACX,EAAU;GACZ;EACF,CAAC,GAUD,EAAK,EACH,MAAM;GACJ,OAAO,EAAU,CAAS;GAC1B,mBAAoB,EAAW,QAAQ,KAAO,KAAA;GAC9C,MAAM,EAAU;GAGhB,eAAgB,EAAM,QAAQ,SAAS,CAAC,EAAU,QAAQ,KAAO,KAAA;GACjE,SAAS,EAAU;EACrB,EACF,CAAC,GAwBM,CAAI;;oCAEqB,EAAQ,QAAQ,EAAQ,gCAxB9B,CAAC,EAAa,MAwBsD;gCAClE,EAAM,MAAM;;;;;;;oBAOxB,EAAQ;6BA9CtB,EAAM,KAAK,UAAU,cAAc,EAAa,QAAQ,SAAU,EAAM,KAAK,SAAS,OA+CnD;uBAClB,EAAM,KAAK;8BACJ,EAAM,YAAY;+BACjB,EAAM,aAAa;4BACtB,EAAM,UAAU;4BAChB,EAAM,UAAU;4BAChB,EAAM,UAAU;0BAClB,EAAM,QAAQ;2BACb,EAAW;2BACX,EAAM,SAAS;2BACf,EAAM,SAAS;wBAClB,EAAK,CAAU,EAAE;kCACP,EAAe;mCACd,EAAgB;oCACf,EAAiB;+BACtB,EAAY;kCACR,EAAM,QAAQ,QAAQ,SAAS,KAAM;qBACnD,EAAS;;cAEhB,EAAiB,CAAS,EAAE;;;;;;mCAnDH,EAAa,QAAQ,kBAAkB,gBAyD7B;qCAxDT,OAAO,EAAa,KAAK,EAyDZ;iCA5ChB,EAAM,KAAK,UAAU,aAAa,MAAM,KA6ChC;8BA3CZ;GAE3B,AADA,EAAa,QAAQ,CAAC,EAAa,OACnC,EAAS,OAAO,MAAM;EACxB,EAyCmC;sBAzDjC,EAAa,QACT,CAAI,uFACJ,CAAI,iFAwDqB;;;;;;;iCAhDF,EAAW,QAAQ,MAAM,KAuDjB;yBAzFtB,MAAwB;GAErC,AADA,EAAW,CAAK,GAChB,EAAS,OAAO,MAAM;EACxB,EAuF0B;;;;;0DAK4B,EAAY,iCApEvC,CAAC,CAAC,EAAU,SAAS,CAAC,EAAW,MAoE8C;sCACxE,EAAW,MAAM;;uCAEhB,EAAQ,6CAtEjB,CAAC,EAAU,MAsEyD;qCAC7D,EAAU,MAAM;;;;;oCAtEjB,GAAS,MAAM,oBAAoB,CAAC,GAAS,MAAM,iBAAiB,KAAK,KA2E9D;kCA1Eb,GAAS,MAAM,iBAAiB,KAAK,KA2E5B;2BA1EX,CAAC,EA2EE;kBA1EL,GAAS,MAAM,eAAe,GA2EpC;;;;CAItB;CACA,QAAQ,EAAE,gBAAgB,GAAK;CAC/B,QAAQ;EACN,GAAG;EACH,EAAiB,CAAiB;EAClC,EAAuB,OAAO;EAC9B;EAOA,EAAkB;GAAE,WAAW;GAAU,MAAM;GAAS,aAAa;EAAQ,CAAC;CAChF;AACF,CAAC"}
@@ -1,2 +1,2 @@
1
- var e=`@layer refine.base{:host{--_bg:var(--button-bg,var(--color-contrast-100));--_color:var(--button-color,var(--color-contrast-900));--_border-color:var(--button-border-color,var(--color-contrast-300));--_radius:var(--button-radius,var(--rounded-lg));align-items:center;justify-content:var(--button-justify,center);display:inline-flex}:host([disabled]) a,:host([loading]) a{pointer-events:none;cursor:not-allowed}:host([loading]) a{cursor:wait}[part=button]{box-sizing:border-box;gap:var(--_gap,var(--size-2));align-items:center;justify-content:var(--button-justify,center);width:100%;min-width:0;height:var(--_height,var(--size-10));min-height:var(--_touch-target);padding:var(--_padding,var(--size-2) var(--size-4));font-size:var(--_font-size,var(--text-sm));font-weight:var(--font-medium);line-height:var(--_line-height,var(--leading-normal));color:var(--_color);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--_bg);border:var(--button-border,var(--border)) solid var(--_border-color);border-top-width:var(--button-border-top,var(--button-border,var(--border)));border-bottom-width:var(--button-border-bottom,var(--button-border,var(--border)));border-radius:var(--_radius);transition:var(--_motion-transition,background var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), color var(--transition-normal), transform .12s var(--ease-spring));display:flex;position:relative}[part=button]:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-width:var(--button-border-start,var(--button-border,var(--border)));border-right-width:var(--button-border-end,var(--button-border,var(--border)))}[part=button]:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-width:var(--button-border-start,var(--button-border,var(--border)));border-left-width:var(--button-border-end,var(--button-border,var(--border)))}[part=button]:focus-visible{outline:none}@keyframes spin{to{transform:rotate(360deg)}}.loader{border:var(--border-2) solid currentcolor;width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border-radius:50%;position:absolute}.loader:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}.content{text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;align-items:center;min-width:0;max-width:100%;display:inline-flex;overflow:hidden}::slotted([slot=prefix]),::slotted([slot=suffix]){flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}::slotted(svg){width:var(--_icon-size,var(--leading-6));height:var(--_icon-size,var(--leading-6));flex-shrink:0}}@layer refine.overrides{:host([fullwidth]){width:100%;display:flex}:host([rounded][icon-only]) [part=button]{border-radius:50%}:host([loading]) .content{visibility:hidden}[part=button]:focus-visible{box-shadow:var(--_theme-shadow), var(--_theme-halo);outline:none}[part=button]:hover,[part=button]:active{border-color:var(--_hover-border-color,var(--_theme-focus));box-shadow:var(--_theme-shadow), var(--_theme-halo)}:host([variant=ghost]) [part=button]:hover,:host([variant=text]) [part=button]:hover{box-shadow:none;border-color:#0000;transform:none}:host([variant=ghost]) [part=button]:active,:host([variant=text]) [part=button]:active{box-shadow:none;border-color:#0000}[part=button]:active{transform:translateY(1px)}}@layer refine.variants{:host([icon-only]) [part=button]{aspect-ratio:1;padding:0}:host(:not([variant])),:host([variant=solid]){--_bg:var(--button-bg,var(--_theme-base));--_color:var(--button-color,var(--_theme-contrast));--_border-color:var(--button-border-color,var(--_theme-base));--_hover-bg:var(--_theme-focus);--_active-bg:color-mix(in oklch, var(--_theme-focus) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=flat]){--_bg:var(--button-bg,color-mix(in oklch, var(--_theme-backdrop) 25%, var(--color-contrast-100)));--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,color-mix(in oklch, var(--_theme-focus) 20%, transparent));--_hover-bg:var(--_theme-focus);--_hover-color:var(--_theme-contrast);--_active-bg:color-mix(in oklch, var(--_theme-focus) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=flat]) [part=button]{box-shadow:var(--inset-shadow-2xs)}:host([variant=flat]) [part=button]:hover{box-shadow:var(--inset-shadow-xs)}:host([variant=flat]) [part=button]:active{box-shadow:var(--inset-shadow-sm)}:host([variant=bordered]){--_bg:var(--button-bg,var(--_theme-backdrop));--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,var(--_theme-border));--_hover-bg:var(--_theme-focus);--_hover-color:var(--_theme-contrast);--_hover-border-color:var(--_theme-focus);--_active-bg:color-mix(in oklch, var(--_theme-focus) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=bordered]) [part=button],:host([variant=bordered]) [part=button]:hover{box-shadow:var(--inset-shadow-xs)}:host([variant=bordered]) [part=button]:active{box-shadow:var(--inset-shadow-sm)}:host([variant=outline]){--_bg:var(--button-bg,transparent);--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,var(--_theme-base));--_hover-bg:var(--_theme-backdrop);--_hover-border-color:var(--_theme-focus);--_active-bg:color-mix(in oklch, var(--_theme-base) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=ghost]){--_bg:var(--button-bg,transparent);--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,transparent);--_hover-bg:var(--_theme-backdrop);--_active-bg:color-mix(in oklch, var(--_theme-base) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=ghost]) [part=button]{border-width:0}:host([variant=text]){--_bg:var(--button-bg,transparent);--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,transparent);--_hover-color:var(--_theme-focus);--_active-color:color-mix(in oklch, var(--_theme-focus) 85%, black)}:host([variant=text]) [part=button]{border-width:0}:host([variant=frost]:not([color])){--_hover-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--color-canvas) 70%, transparent));--_hover-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 40%, transparent));--_active-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--color-canvas) 70%, transparent));--_active-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 40%, transparent))}:host([variant=frost][color]){--_hover-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));--_hover-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 65%, transparent));--_active-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));--_active-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 65%, transparent))}[part=button]:hover{color:var(--_hover-color,var(--_color));background:var(--_hover-bg,var(--_bg));border-color:var(--_hover-border-color,var(--_border-color))}[part=button]:active{color:var(--_active-color,var(--_color));background:var(--_active-bg,var(--_bg));border-color:var(--_active-border-color,var(--_border-color));box-shadow:var(--inset-shadow-2xs)}}`;exports.default=e;
1
+ var e=`@layer refine.base{:host{--_bg:var(--button-bg,var(--color-contrast-100));--_color:var(--button-color,var(--color-contrast-900));--_border-color:var(--button-border-color,var(--color-contrast-300));--_radius:var(--button-radius,var(--rounded-lg));align-items:center;justify-content:var(--button-justify,center);display:inline-flex}:host([disabled]) a,:host([loading]) a{pointer-events:none;cursor:not-allowed}:host([loading]) a{cursor:wait}[part=button]{box-sizing:border-box;gap:var(--_gap,var(--size-2));align-items:center;justify-content:var(--button-justify,center);width:100%;min-width:0;height:var(--_height,var(--size-10));min-height:var(--_touch-target);padding:var(--_padding,var(--size-2) var(--size-4));font-size:var(--_font-size,var(--text-sm));font-weight:var(--font-medium);line-height:var(--_line-height,var(--leading-normal));color:var(--_color);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--_bg);border:var(--button-border,var(--border)) solid var(--_border-color);border-top-width:var(--button-border-top,var(--button-border,var(--border)));border-bottom-width:var(--button-border-bottom,var(--button-border,var(--border)));border-radius:var(--_radius);transition:var(--_motion-transition,background var(--transition-normal), border-color var(--transition-normal), box-shadow var(--transition-normal), color var(--transition-normal), transform .12s var(--ease-spring));display:flex;position:relative}[part=button]:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-width:var(--button-border-start,var(--button-border,var(--border)));border-right-width:var(--button-border-end,var(--button-border,var(--border)))}[part=button]:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-width:var(--button-border-start,var(--button-border,var(--border)));border-left-width:var(--button-border-end,var(--button-border,var(--border)))}[part=button]:focus-visible{outline:none}@keyframes spin{to{transform:rotate(360deg)}}.loader{border:var(--border-2) solid currentcolor;width:1em;height:1em;animation:var(--_motion-animation,spin var(--transition-loader) infinite);border-radius:50%;position:absolute}.loader:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-color:#0000}.loader:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}.content{text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;align-items:center;min-width:0;max-width:100%;display:inline-flex;overflow:hidden}::slotted([slot=prefix]),::slotted([slot=suffix]){flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}::slotted(svg){width:var(--_icon-size,var(--leading-6));height:var(--_icon-size,var(--leading-6));flex-shrink:0}}@layer refine.overrides{:host([fullwidth]){width:100%;display:flex}:host([fullheight]){height:100%;display:flex}:host([fullheight]) [part=button]{height:100%}:host([rounded][icon-only]) [part=button]{border-radius:50%}:host([loading]) .content{visibility:hidden}[part=button]:focus-visible{box-shadow:var(--_theme-shadow), var(--_theme-halo);outline:none}[part=button]:hover,[part=button]:active{border-color:var(--_hover-border-color,var(--_theme-focus));box-shadow:var(--_theme-shadow), var(--_theme-halo)}:host([variant=ghost]) [part=button]:hover,:host([variant=text]) [part=button]:hover{box-shadow:none;border-color:#0000;transform:none}:host([variant=ghost]) [part=button]:active,:host([variant=text]) [part=button]:active{box-shadow:none;border-color:#0000}[part=button]:active{transform:translateY(1px)}}@layer refine.variants{:host([icon-only]) [part=button]{aspect-ratio:1;padding:0}:host(:not([variant])),:host([variant=solid]){--_bg:var(--button-bg,var(--_theme-base));--_color:var(--button-color,var(--_theme-contrast));--_border-color:var(--button-border-color,var(--_theme-base));--_hover-bg:var(--_theme-focus);--_active-bg:color-mix(in oklch, var(--_theme-focus) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=flat]){--_bg:var(--button-bg,color-mix(in oklch, var(--_theme-backdrop) 25%, var(--color-contrast-100)));--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,color-mix(in oklch, var(--_theme-focus) 20%, transparent));--_hover-bg:var(--_theme-focus);--_hover-color:var(--_theme-contrast);--_active-bg:color-mix(in oklch, var(--_theme-focus) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=flat]) [part=button]{box-shadow:var(--inset-shadow-2xs)}:host([variant=flat]) [part=button]:hover{box-shadow:var(--inset-shadow-xs)}:host([variant=flat]) [part=button]:active{box-shadow:var(--inset-shadow-sm)}:host([variant=bordered]){--_bg:var(--button-bg,var(--_theme-backdrop));--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,var(--_theme-border));--_hover-bg:var(--_theme-focus);--_hover-color:var(--_theme-contrast);--_hover-border-color:var(--_theme-focus);--_active-bg:color-mix(in oklch, var(--_theme-focus) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=bordered]) [part=button],:host([variant=bordered]) [part=button]:hover{box-shadow:var(--inset-shadow-xs)}:host([variant=bordered]) [part=button]:active{box-shadow:var(--inset-shadow-sm)}:host([variant=outline]){--_bg:var(--button-bg,transparent);--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,var(--_theme-base));--_hover-bg:var(--_theme-backdrop);--_hover-border-color:var(--_theme-focus);--_active-bg:color-mix(in oklch, var(--_theme-base) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=ghost]){--_bg:var(--button-bg,transparent);--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,transparent);--_hover-bg:var(--_theme-backdrop);--_active-bg:color-mix(in oklch, var(--_theme-base) 85%, black);--_active-color:var(--_theme-contrast)}:host([variant=ghost]) [part=button]{border-width:0}:host([variant=text]){--_bg:var(--button-bg,transparent);--_color:var(--button-color,var(--_theme-base));--_border-color:var(--button-border-color,transparent);--_hover-color:var(--_theme-focus);--_active-color:color-mix(in oklch, var(--_theme-focus) 85%, black)}:host([variant=text]) [part=button]{border-width:0}:host([variant=frost]:not([color])){--_hover-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--color-canvas) 70%, transparent));--_hover-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 40%, transparent));--_active-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--color-canvas) 70%, transparent));--_active-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 40%, transparent))}:host([variant=frost][color]){--_hover-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));--_hover-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 65%, transparent));--_active-bg:var(--button-frost-active-bg,color-mix(in oklch, var(--_theme-backdrop) 50%, var(--_theme-base) 50%));--_active-border-color:var(--button-frost-active-border-color,color-mix(in oklch, var(--_theme-focus) 65%, transparent))}[part=button]:hover{color:var(--_hover-color,var(--_color));background:var(--_hover-bg,var(--_bg));border-color:var(--_hover-border-color,var(--_border-color))}[part=button]:active{color:var(--_active-color,var(--_color));background:var(--_active-bg,var(--_bg));border-color:var(--_active-border-color,var(--_border-color));box-shadow:var(--inset-shadow-2xs)}}`;exports.default=e;
2
2
  //# sourceMappingURL=button.css.cjs.map