@weave-framework/ui 0.2.107

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 (384) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/autocomplete/autocomplete.d.ts +86 -0
  4. package/dist/autocomplete/autocomplete.d.ts.map +1 -0
  5. package/dist/autocomplete/autocomplete.js +263 -0
  6. package/dist/autocomplete/autocomplete.js.map +1 -0
  7. package/dist/badge/badge.d.ts +39 -0
  8. package/dist/badge/badge.d.ts.map +1 -0
  9. package/dist/badge/badge.js +59 -0
  10. package/dist/badge/badge.js.map +1 -0
  11. package/dist/bottom-sheet/bottom-sheet.d.ts +21 -0
  12. package/dist/bottom-sheet/bottom-sheet.d.ts.map +1 -0
  13. package/dist/bottom-sheet/bottom-sheet.js +82 -0
  14. package/dist/bottom-sheet/bottom-sheet.js.map +1 -0
  15. package/dist/button/button.d.ts +47 -0
  16. package/dist/button/button.d.ts.map +1 -0
  17. package/dist/button/button.js +47 -0
  18. package/dist/button/button.js.map +1 -0
  19. package/dist/button-toggle/button-toggle.d.ts +65 -0
  20. package/dist/button-toggle/button-toggle.d.ts.map +1 -0
  21. package/dist/button-toggle/button-toggle.js +127 -0
  22. package/dist/button-toggle/button-toggle.js.map +1 -0
  23. package/dist/card/card.d.ts +30 -0
  24. package/dist/card/card.d.ts.map +1 -0
  25. package/dist/card/card.js +32 -0
  26. package/dist/card/card.js.map +1 -0
  27. package/dist/cdk/bidi.d.ts +19 -0
  28. package/dist/cdk/bidi.d.ts.map +1 -0
  29. package/dist/cdk/bidi.js +32 -0
  30. package/dist/cdk/bidi.js.map +1 -0
  31. package/dist/cdk/breakpoints.d.ts +21 -0
  32. package/dist/cdk/breakpoints.d.ts.map +1 -0
  33. package/dist/cdk/breakpoints.js +39 -0
  34. package/dist/cdk/breakpoints.js.map +1 -0
  35. package/dist/cdk/clipboard.d.ts +8 -0
  36. package/dist/cdk/clipboard.d.ts.map +1 -0
  37. package/dist/cdk/clipboard.js +38 -0
  38. package/dist/cdk/clipboard.js.map +1 -0
  39. package/dist/cdk/data-source.d.ts +41 -0
  40. package/dist/cdk/data-source.d.ts.map +1 -0
  41. package/dist/cdk/data-source.js +36 -0
  42. package/dist/cdk/data-source.js.map +1 -0
  43. package/dist/cdk/date-adapter.d.ts +63 -0
  44. package/dist/cdk/date-adapter.d.ts.map +1 -0
  45. package/dist/cdk/date-adapter.js +155 -0
  46. package/dist/cdk/date-adapter.js.map +1 -0
  47. package/dist/cdk/drag-drop.d.ts +77 -0
  48. package/dist/cdk/drag-drop.d.ts.map +1 -0
  49. package/dist/cdk/drag-drop.js +268 -0
  50. package/dist/cdk/drag-drop.js.map +1 -0
  51. package/dist/cdk/focus-monitor.d.ts +27 -0
  52. package/dist/cdk/focus-monitor.d.ts.map +1 -0
  53. package/dist/cdk/focus-monitor.js +66 -0
  54. package/dist/cdk/focus-monitor.js.map +1 -0
  55. package/dist/cdk/focus-trap.d.ts +39 -0
  56. package/dist/cdk/focus-trap.d.ts.map +1 -0
  57. package/dist/cdk/focus-trap.js +127 -0
  58. package/dist/cdk/focus-trap.js.map +1 -0
  59. package/dist/cdk/index.d.ts +29 -0
  60. package/dist/cdk/index.d.ts.map +1 -0
  61. package/dist/cdk/index.js +29 -0
  62. package/dist/cdk/index.js.map +1 -0
  63. package/dist/cdk/interactivity.d.ts +19 -0
  64. package/dist/cdk/interactivity.d.ts.map +1 -0
  65. package/dist/cdk/interactivity.js +70 -0
  66. package/dist/cdk/interactivity.js.map +1 -0
  67. package/dist/cdk/key-manager.d.ts +41 -0
  68. package/dist/cdk/key-manager.d.ts.map +1 -0
  69. package/dist/cdk/key-manager.js +126 -0
  70. package/dist/cdk/key-manager.js.map +1 -0
  71. package/dist/cdk/live-announcer.d.ts +19 -0
  72. package/dist/cdk/live-announcer.d.ts.map +1 -0
  73. package/dist/cdk/live-announcer.js +48 -0
  74. package/dist/cdk/live-announcer.js.map +1 -0
  75. package/dist/cdk/observers.d.ts +17 -0
  76. package/dist/cdk/observers.d.ts.map +1 -0
  77. package/dist/cdk/observers.js +35 -0
  78. package/dist/cdk/observers.js.map +1 -0
  79. package/dist/cdk/overlay.d.ts +73 -0
  80. package/dist/cdk/overlay.d.ts.map +1 -0
  81. package/dist/cdk/overlay.js +154 -0
  82. package/dist/cdk/overlay.js.map +1 -0
  83. package/dist/cdk/platform.d.ts +22 -0
  84. package/dist/cdk/platform.d.ts.map +1 -0
  85. package/dist/cdk/platform.js +55 -0
  86. package/dist/cdk/platform.js.map +1 -0
  87. package/dist/cdk/portal.d.ts +31 -0
  88. package/dist/cdk/portal.d.ts.map +1 -0
  89. package/dist/cdk/portal.js +55 -0
  90. package/dist/cdk/portal.js.map +1 -0
  91. package/dist/cdk/positioning.d.ts +53 -0
  92. package/dist/cdk/positioning.d.ts.map +1 -0
  93. package/dist/cdk/positioning.js +140 -0
  94. package/dist/cdk/positioning.js.map +1 -0
  95. package/dist/cdk/scroll.d.ts +43 -0
  96. package/dist/cdk/scroll.d.ts.map +1 -0
  97. package/dist/cdk/scroll.js +97 -0
  98. package/dist/cdk/scroll.js.map +1 -0
  99. package/dist/cdk/selection-model.d.ts +50 -0
  100. package/dist/cdk/selection-model.d.ts.map +1 -0
  101. package/dist/cdk/selection-model.js +77 -0
  102. package/dist/cdk/selection-model.js.map +1 -0
  103. package/dist/cdk/virtual-scroll.d.ts +50 -0
  104. package/dist/cdk/virtual-scroll.d.ts.map +1 -0
  105. package/dist/cdk/virtual-scroll.js +92 -0
  106. package/dist/cdk/virtual-scroll.js.map +1 -0
  107. package/dist/checkbox/checkbox.d.ts +65 -0
  108. package/dist/checkbox/checkbox.d.ts.map +1 -0
  109. package/dist/checkbox/checkbox.js +82 -0
  110. package/dist/checkbox/checkbox.js.map +1 -0
  111. package/dist/chips/chips.d.ts +65 -0
  112. package/dist/chips/chips.d.ts.map +1 -0
  113. package/dist/chips/chips.js +119 -0
  114. package/dist/chips/chips.js.map +1 -0
  115. package/dist/context-menu/context-menu.d.ts +32 -0
  116. package/dist/context-menu/context-menu.d.ts.map +1 -0
  117. package/dist/context-menu/context-menu.js +63 -0
  118. package/dist/context-menu/context-menu.js.map +1 -0
  119. package/dist/datepicker/datepicker.d.ts +100 -0
  120. package/dist/datepicker/datepicker.d.ts.map +1 -0
  121. package/dist/datepicker/datepicker.js +440 -0
  122. package/dist/datepicker/datepicker.js.map +1 -0
  123. package/dist/dialog/dialog.d.ts +27 -0
  124. package/dist/dialog/dialog.d.ts.map +1 -0
  125. package/dist/dialog/dialog.js +47 -0
  126. package/dist/dialog/dialog.js.map +1 -0
  127. package/dist/dialog/modal-core.d.ts +42 -0
  128. package/dist/dialog/modal-core.d.ts.map +1 -0
  129. package/dist/dialog/modal-core.js +103 -0
  130. package/dist/dialog/modal-core.js.map +1 -0
  131. package/dist/expansion/expansion.d.ts +71 -0
  132. package/dist/expansion/expansion.d.ts.map +1 -0
  133. package/dist/expansion/expansion.js +127 -0
  134. package/dist/expansion/expansion.js.map +1 -0
  135. package/dist/form-field/form-field.d.ts +48 -0
  136. package/dist/form-field/form-field.d.ts.map +1 -0
  137. package/dist/form-field/form-field.js +89 -0
  138. package/dist/form-field/form-field.js.map +1 -0
  139. package/dist/grid-list/grid-list.d.ts +25 -0
  140. package/dist/grid-list/grid-list.d.ts.map +1 -0
  141. package/dist/grid-list/grid-list.js +22 -0
  142. package/dist/grid-list/grid-list.js.map +1 -0
  143. package/dist/icon/icon.d.ts +40 -0
  144. package/dist/icon/icon.d.ts.map +1 -0
  145. package/dist/icon/icon.js +99 -0
  146. package/dist/icon/icon.js.map +1 -0
  147. package/dist/icon/icons.d.ts +60 -0
  148. package/dist/icon/icons.d.ts.map +1 -0
  149. package/dist/icon/icons.js +126 -0
  150. package/dist/icon/icons.js.map +1 -0
  151. package/dist/icon/lucide-icons.d.ts +11 -0
  152. package/dist/icon/lucide-icons.d.ts.map +1 -0
  153. package/dist/icon/lucide-icons.js +65 -0
  154. package/dist/icon/lucide-icons.js.map +1 -0
  155. package/dist/index.d.ts +12 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +2 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/input/input.d.ts +90 -0
  160. package/dist/input/input.d.ts.map +1 -0
  161. package/dist/input/input.js +138 -0
  162. package/dist/input/input.js.map +1 -0
  163. package/dist/internal/compose.d.ts +26 -0
  164. package/dist/internal/compose.d.ts.map +1 -0
  165. package/dist/internal/compose.js +32 -0
  166. package/dist/internal/compose.js.map +1 -0
  167. package/dist/list/list.d.ts +70 -0
  168. package/dist/list/list.d.ts.map +1 -0
  169. package/dist/list/list.js +144 -0
  170. package/dist/list/list.js.map +1 -0
  171. package/dist/menu/menu-core.d.ts +56 -0
  172. package/dist/menu/menu-core.d.ts.map +1 -0
  173. package/dist/menu/menu-core.js +122 -0
  174. package/dist/menu/menu-core.js.map +1 -0
  175. package/dist/menu/menu.d.ts +31 -0
  176. package/dist/menu/menu.d.ts.map +1 -0
  177. package/dist/menu/menu.js +68 -0
  178. package/dist/menu/menu.js.map +1 -0
  179. package/dist/menubar/menubar.d.ts +49 -0
  180. package/dist/menubar/menubar.d.ts.map +1 -0
  181. package/dist/menubar/menubar.js +162 -0
  182. package/dist/menubar/menubar.js.map +1 -0
  183. package/dist/paginator/paginator.d.ts +89 -0
  184. package/dist/paginator/paginator.d.ts.map +1 -0
  185. package/dist/paginator/paginator.js +159 -0
  186. package/dist/paginator/paginator.js.map +1 -0
  187. package/dist/popover-edit/popover-edit.d.ts +33 -0
  188. package/dist/popover-edit/popover-edit.d.ts.map +1 -0
  189. package/dist/popover-edit/popover-edit.js +107 -0
  190. package/dist/popover-edit/popover-edit.js.map +1 -0
  191. package/dist/progress-bar/progress-bar.d.ts +32 -0
  192. package/dist/progress-bar/progress-bar.d.ts.map +1 -0
  193. package/dist/progress-bar/progress-bar.js +42 -0
  194. package/dist/progress-bar/progress-bar.js.map +1 -0
  195. package/dist/progress-spinner/progress-spinner.d.ts +25 -0
  196. package/dist/progress-spinner/progress-spinner.d.ts.map +1 -0
  197. package/dist/progress-spinner/progress-spinner.js +25 -0
  198. package/dist/progress-spinner/progress-spinner.js.map +1 -0
  199. package/dist/radio/radio.d.ts +68 -0
  200. package/dist/radio/radio.d.ts.map +1 -0
  201. package/dist/radio/radio.js +81 -0
  202. package/dist/radio/radio.js.map +1 -0
  203. package/dist/ripple/ripple.d.ts +20 -0
  204. package/dist/ripple/ripple.d.ts.map +1 -0
  205. package/dist/ripple/ripple.js +41 -0
  206. package/dist/ripple/ripple.js.map +1 -0
  207. package/dist/select/select.d.ts +83 -0
  208. package/dist/select/select.d.ts.map +1 -0
  209. package/dist/select/select.js +320 -0
  210. package/dist/select/select.js.map +1 -0
  211. package/dist/shared/options.d.ts +44 -0
  212. package/dist/shared/options.d.ts.map +1 -0
  213. package/dist/shared/options.js +59 -0
  214. package/dist/shared/options.js.map +1 -0
  215. package/dist/shared/positions.d.ts +20 -0
  216. package/dist/shared/positions.d.ts.map +1 -0
  217. package/dist/shared/positions.js +27 -0
  218. package/dist/shared/positions.js.map +1 -0
  219. package/dist/sidenav/sidenav.d.ts +65 -0
  220. package/dist/sidenav/sidenav.d.ts.map +1 -0
  221. package/dist/sidenav/sidenav.js +120 -0
  222. package/dist/sidenav/sidenav.js.map +1 -0
  223. package/dist/slide-toggle/slide-toggle.d.ts +56 -0
  224. package/dist/slide-toggle/slide-toggle.d.ts.map +1 -0
  225. package/dist/slide-toggle/slide-toggle.js +62 -0
  226. package/dist/slide-toggle/slide-toggle.js.map +1 -0
  227. package/dist/slider/slider.d.ts +69 -0
  228. package/dist/slider/slider.d.ts.map +1 -0
  229. package/dist/slider/slider.js +184 -0
  230. package/dist/slider/slider.js.map +1 -0
  231. package/dist/snackbar/snackbar.d.ts +25 -0
  232. package/dist/snackbar/snackbar.d.ts.map +1 -0
  233. package/dist/snackbar/snackbar.js +135 -0
  234. package/dist/snackbar/snackbar.js.map +1 -0
  235. package/dist/stepper/stepper.d.ts +87 -0
  236. package/dist/stepper/stepper.d.ts.map +1 -0
  237. package/dist/stepper/stepper.js +142 -0
  238. package/dist/stepper/stepper.js.map +1 -0
  239. package/dist/table/table.d.ts +140 -0
  240. package/dist/table/table.d.ts.map +1 -0
  241. package/dist/table/table.js +312 -0
  242. package/dist/table/table.js.map +1 -0
  243. package/dist/tabs/tabs.d.ts +64 -0
  244. package/dist/tabs/tabs.d.ts.map +1 -0
  245. package/dist/tabs/tabs.js +126 -0
  246. package/dist/tabs/tabs.js.map +1 -0
  247. package/dist/timepicker/timepicker.d.ts +83 -0
  248. package/dist/timepicker/timepicker.d.ts.map +1 -0
  249. package/dist/timepicker/timepicker.js +303 -0
  250. package/dist/timepicker/timepicker.js.map +1 -0
  251. package/dist/toolbar/toolbar.d.ts +34 -0
  252. package/dist/toolbar/toolbar.d.ts.map +1 -0
  253. package/dist/toolbar/toolbar.js +35 -0
  254. package/dist/toolbar/toolbar.js.map +1 -0
  255. package/dist/tooltip/tooltip.d.ts +30 -0
  256. package/dist/tooltip/tooltip.d.ts.map +1 -0
  257. package/dist/tooltip/tooltip.js +109 -0
  258. package/dist/tooltip/tooltip.js.map +1 -0
  259. package/dist/tree/tree.d.ts +100 -0
  260. package/dist/tree/tree.d.ts.map +1 -0
  261. package/dist/tree/tree.js +288 -0
  262. package/dist/tree/tree.js.map +1 -0
  263. package/package.json +230 -0
  264. package/src/styles/_api.scss +384 -0
  265. package/src/styles/_helpers.scss +101 -0
  266. package/src/styles/_index.scss +12 -0
  267. package/src/styles/_ref.scss +20 -0
  268. package/src/styles/_sass-utils.scss +14 -0
  269. package/src/styles/_token-utils.scss +24 -0
  270. package/src/styles/components/autocomplete/_index.scss +10 -0
  271. package/src/styles/components/autocomplete/_styles.scss +46 -0
  272. package/src/styles/components/autocomplete/_tokens.scss +28 -0
  273. package/src/styles/components/badge/_index.scss +12 -0
  274. package/src/styles/components/badge/_styles.scss +72 -0
  275. package/src/styles/components/badge/_tokens.scss +27 -0
  276. package/src/styles/components/bottom-sheet/_index.scss +9 -0
  277. package/src/styles/components/bottom-sheet/_styles.scss +77 -0
  278. package/src/styles/components/bottom-sheet/_tokens.scss +33 -0
  279. package/src/styles/components/button/_index.scss +12 -0
  280. package/src/styles/components/button/_styles.scss +106 -0
  281. package/src/styles/components/button/_tokens.scss +36 -0
  282. package/src/styles/components/button-toggle/_index.scss +12 -0
  283. package/src/styles/components/button-toggle/_styles.scss +57 -0
  284. package/src/styles/components/button-toggle/_tokens.scss +25 -0
  285. package/src/styles/components/card/_index.scss +15 -0
  286. package/src/styles/components/card/_styles.scss +68 -0
  287. package/src/styles/components/card/_tokens.scss +26 -0
  288. package/src/styles/components/checkbox/_index.scss +13 -0
  289. package/src/styles/components/checkbox/_styles.scss +108 -0
  290. package/src/styles/components/checkbox/_tokens.scss +25 -0
  291. package/src/styles/components/chips/_index.scss +12 -0
  292. package/src/styles/components/chips/_styles.scss +83 -0
  293. package/src/styles/components/chips/_tokens.scss +28 -0
  294. package/src/styles/components/datepicker/_index.scss +10 -0
  295. package/src/styles/components/datepicker/_styles.scss +203 -0
  296. package/src/styles/components/datepicker/_tokens.scss +50 -0
  297. package/src/styles/components/dialog/_index.scss +9 -0
  298. package/src/styles/components/dialog/_styles.scss +54 -0
  299. package/src/styles/components/dialog/_tokens.scss +29 -0
  300. package/src/styles/components/divider/_index.scss +8 -0
  301. package/src/styles/components/divider/_styles.scss +18 -0
  302. package/src/styles/components/divider/_tokens.scss +12 -0
  303. package/src/styles/components/expansion/_index.scss +14 -0
  304. package/src/styles/components/expansion/_styles.scss +128 -0
  305. package/src/styles/components/expansion/_tokens.scss +32 -0
  306. package/src/styles/components/form-field/_index.scss +13 -0
  307. package/src/styles/components/form-field/_styles.scss +39 -0
  308. package/src/styles/components/form-field/_tokens.scss +19 -0
  309. package/src/styles/components/grid-list/_index.scss +12 -0
  310. package/src/styles/components/grid-list/_styles.scss +31 -0
  311. package/src/styles/components/grid-list/_tokens.scss +18 -0
  312. package/src/styles/components/icon/_index.scss +8 -0
  313. package/src/styles/components/icon/_styles.scss +18 -0
  314. package/src/styles/components/icon/_tokens.scss +8 -0
  315. package/src/styles/components/input/_index.scss +13 -0
  316. package/src/styles/components/input/_styles.scss +111 -0
  317. package/src/styles/components/input/_tokens.scss +21 -0
  318. package/src/styles/components/list/_index.scss +12 -0
  319. package/src/styles/components/list/_styles.scss +87 -0
  320. package/src/styles/components/list/_tokens.scss +31 -0
  321. package/src/styles/components/menu/_index.scss +9 -0
  322. package/src/styles/components/menu/_styles.scss +60 -0
  323. package/src/styles/components/menu/_tokens.scss +33 -0
  324. package/src/styles/components/menubar/_index.scss +9 -0
  325. package/src/styles/components/menubar/_styles.scss +41 -0
  326. package/src/styles/components/menubar/_tokens.scss +25 -0
  327. package/src/styles/components/overlay/_index.scss +8 -0
  328. package/src/styles/components/overlay/_styles.scss +25 -0
  329. package/src/styles/components/overlay/_tokens.scss +21 -0
  330. package/src/styles/components/paginator/_index.scss +14 -0
  331. package/src/styles/components/paginator/_styles.scss +77 -0
  332. package/src/styles/components/paginator/_tokens.scss +28 -0
  333. package/src/styles/components/popover-edit/_index.scss +9 -0
  334. package/src/styles/components/popover-edit/_styles.scss +31 -0
  335. package/src/styles/components/popover-edit/_tokens.scss +21 -0
  336. package/src/styles/components/progress-bar/_index.scss +11 -0
  337. package/src/styles/components/progress-bar/_styles.scss +39 -0
  338. package/src/styles/components/progress-bar/_tokens.scss +17 -0
  339. package/src/styles/components/progress-spinner/_index.scss +11 -0
  340. package/src/styles/components/progress-spinner/_styles.scss +26 -0
  341. package/src/styles/components/progress-spinner/_tokens.scss +15 -0
  342. package/src/styles/components/radio/_index.scss +14 -0
  343. package/src/styles/components/radio/_styles.scss +92 -0
  344. package/src/styles/components/radio/_tokens.scss +24 -0
  345. package/src/styles/components/ripple/_index.scss +8 -0
  346. package/src/styles/components/ripple/_styles.scss +20 -0
  347. package/src/styles/components/ripple/_tokens.scss +12 -0
  348. package/src/styles/components/select/_index.scss +9 -0
  349. package/src/styles/components/select/_styles.scss +120 -0
  350. package/src/styles/components/select/_tokens.scss +35 -0
  351. package/src/styles/components/sidenav/_index.scss +14 -0
  352. package/src/styles/components/sidenav/_styles.scss +105 -0
  353. package/src/styles/components/sidenav/_tokens.scss +24 -0
  354. package/src/styles/components/slide-toggle/_index.scss +13 -0
  355. package/src/styles/components/slide-toggle/_styles.scss +86 -0
  356. package/src/styles/components/slide-toggle/_tokens.scss +24 -0
  357. package/src/styles/components/slider/_index.scss +13 -0
  358. package/src/styles/components/slider/_styles.scss +77 -0
  359. package/src/styles/components/slider/_tokens.scss +21 -0
  360. package/src/styles/components/snackbar/_index.scss +8 -0
  361. package/src/styles/components/snackbar/_styles.scss +59 -0
  362. package/src/styles/components/snackbar/_tokens.scss +28 -0
  363. package/src/styles/components/stepper/_index.scss +14 -0
  364. package/src/styles/components/stepper/_styles.scss +129 -0
  365. package/src/styles/components/stepper/_tokens.scss +44 -0
  366. package/src/styles/components/table/_index.scss +14 -0
  367. package/src/styles/components/table/_styles.scss +202 -0
  368. package/src/styles/components/table/_tokens.scss +47 -0
  369. package/src/styles/components/tabs/_index.scss +13 -0
  370. package/src/styles/components/tabs/_styles.scss +76 -0
  371. package/src/styles/components/tabs/_tokens.scss +28 -0
  372. package/src/styles/components/timepicker/_index.scss +9 -0
  373. package/src/styles/components/timepicker/_styles.scss +136 -0
  374. package/src/styles/components/timepicker/_tokens.scss +46 -0
  375. package/src/styles/components/toolbar/_index.scss +12 -0
  376. package/src/styles/components/toolbar/_styles.scss +41 -0
  377. package/src/styles/components/toolbar/_tokens.scss +17 -0
  378. package/src/styles/components/tooltip/_index.scss +8 -0
  379. package/src/styles/components/tooltip/_styles.scss +29 -0
  380. package/src/styles/components/tooltip/_tokens.scss +22 -0
  381. package/src/styles/components/tree/_index.scss +13 -0
  382. package/src/styles/components/tree/_styles.scss +99 -0
  383. package/src/styles/components/tree/_tokens.scss +38 -0
  384. package/src/styles/theme/_defaults.scss +50 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * `<Input>` — a native `<input>` (or `<textarea>`) as a Weave **underline field**
3
+ * (`border-bottom: 1.5px line`, transparent, focus → accent). Batteries-included:
4
+ *
5
+ * - **Prefix / suffix** — named slots (`slot="prefix"` / `slot="suffix"`) that hold text
6
+ * or an icon, flanking the input *inside the underline* (they share the border). Empty
7
+ * slots collapse (hidden), so the field has no dead gaps.
8
+ * - **Clearable** — `clearable` shows a `×` button (when non-empty, editable) that empties
9
+ * the value and refocuses.
10
+ * - **Multiline** — `multiline` renders a `<textarea>` (with `rows`) instead of `<input>`.
11
+ * - **Binding** — the Weave form-control convention (string value): `value` (a getter) +
12
+ * `onInput`, OR `control` (a structural `Field<string>`). `control` wins; it drives the
13
+ * value two-way, marks `touched` on blur, and drives the error underline (`--invalid`)
14
+ * off `touched() && error()`.
15
+ * - Forwards `type` / `placeholder` / `disabled` / `readonly` / `required` / `name`.
16
+ *
17
+ * Compose with `<FormField>` for a label + hint/error line (which also wires `for`/`id`).
18
+ *
19
+ * import Input from '@weave-framework/ui/input';
20
+ * <Input control={{ form.controls.email }} type={{ 'email' }} placeholder={{ 'you@…' }} />
21
+ * <Input value={{ q() }} onInput={{ setQ }} clearable>
22
+ * <Icon slot="prefix" name={{ 'search' }} />
23
+ * </Input>
24
+ */
25
+ import { signal, effect, onMount } from '@weave-framework/runtime';
26
+ export const template = '<div class={{ rootClass() }} ref={{ root }}>' +
27
+ '<span class="weave-input__prefix"><slot name="prefix"></slot></span>' +
28
+ '@if (multiline()) {' +
29
+ '<textarea class="weave-input__field" ref={{ input }} rows={{ rows() }} placeholder={{ placeholder() }}' +
30
+ ' .value={{ currentValue() }} disabled={{ isDisabled() }} readonly={{ isReadonly() }} required={{ isRequired() }}' +
31
+ ' name={{ name() }} aria-label={{ label() }} on:input={{ onNativeInput }} on:blur={{ onBlur }}></textarea>' +
32
+ '}' +
33
+ '@if (singleline()) {' +
34
+ '<input class="weave-input__field" ref={{ input }} type={{ type() }} placeholder={{ placeholder() }}' +
35
+ ' .value={{ currentValue() }} disabled={{ isDisabled() }} readonly={{ isReadonly() }} required={{ isRequired() }}' +
36
+ ' name={{ name() }} aria-label={{ label() }} on:input={{ onNativeInput }} on:blur={{ onBlur }} />' +
37
+ '}' +
38
+ '@if (showClear()) {' +
39
+ '<button type="button" class="weave-input__clear" aria-label={{ clearLabel() }} on:click={{ clear }}>×</button>' +
40
+ '}' +
41
+ '<span class="weave-input__suffix"><slot name="suffix"></slot></span>' +
42
+ '</div>';
43
+ export function setup(props) {
44
+ const root = signal(null);
45
+ const input = signal(null);
46
+ const currentValue = () => (props.control ? props.control.value() : props.value ?? '');
47
+ const isDisabled = () => !!props.disabled;
48
+ const isReadonly = () => !!props.readonly;
49
+ const invalid = () => {
50
+ const c = props.control;
51
+ return !!(c && c.touched?.() && c.error?.());
52
+ };
53
+ // Forms validity → aria-invalid on the field (touched AND invalid).
54
+ effect(() => {
55
+ const el = input();
56
+ if (!el)
57
+ return;
58
+ if (invalid())
59
+ el.setAttribute('aria-invalid', 'true');
60
+ else
61
+ el.removeAttribute('aria-invalid');
62
+ });
63
+ // Hand the native field to a composer (Autocomplete) so it can add combobox ARIA —
64
+ // synchronously as soon as the ref is set, so composed behavior is wired before use.
65
+ effect(() => {
66
+ const el = input();
67
+ if (el)
68
+ props.onInputRef?.(el);
69
+ });
70
+ // Empty prefix/suffix slots collapse, so the field has no dead gap (flex `gap` skips
71
+ // display:none children). Static once mounted — named slots don't change here.
72
+ onMount(() => {
73
+ const el = root();
74
+ if (!el)
75
+ return;
76
+ for (const part of ['prefix', 'suffix']) {
77
+ const span = el.querySelector(`.weave-input__${part}`);
78
+ if (span && !span.querySelector('*') && !(span.textContent ?? '').trim()) {
79
+ span.classList.add(`weave-input__${part}--empty`);
80
+ }
81
+ }
82
+ });
83
+ const commit = (next) => {
84
+ if (props.control)
85
+ props.control.value.set(next);
86
+ else
87
+ props.onInput?.(next);
88
+ };
89
+ const onNativeInput = (event) => {
90
+ commit(event.target.value);
91
+ };
92
+ const onBlur = () => {
93
+ props.control?.touched?.set(true);
94
+ };
95
+ const clear = () => {
96
+ const el = input();
97
+ if (!el) {
98
+ commit('');
99
+ return;
100
+ }
101
+ // Fire a real `input` event so our own commit runs AND composers (Autocomplete)
102
+ // react to the cleared value (e.g. close their panel).
103
+ el.value = '';
104
+ el.dispatchEvent(new Event('input', { bubbles: true }));
105
+ el.focus();
106
+ };
107
+ return {
108
+ root,
109
+ input,
110
+ rootClass: () => {
111
+ const parts = ['weave-input'];
112
+ if (props.multiline)
113
+ parts.push('weave-input--multiline');
114
+ if (invalid())
115
+ parts.push('weave-input--invalid');
116
+ if (props.class)
117
+ parts.push(props.class);
118
+ return parts.join(' ');
119
+ },
120
+ multiline: () => !!props.multiline,
121
+ singleline: () => !props.multiline,
122
+ type: () => props.type ?? 'text',
123
+ rows: () => props.rows ?? 3,
124
+ placeholder: () => props.placeholder,
125
+ currentValue,
126
+ isDisabled,
127
+ isReadonly,
128
+ isRequired: () => !!props.required,
129
+ name: () => props.name,
130
+ label: () => props.label,
131
+ showClear: () => !!props.clearable && !isDisabled() && !isReadonly() && currentValue().length > 0,
132
+ clearLabel: () => props.clearLabel ?? 'Clear',
133
+ onNativeInput,
134
+ onBlur,
135
+ clear,
136
+ };
137
+ }
138
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/input/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Compose one Weave UI component inside another's template.
3
+ *
4
+ * A UI component is authored as `{ setup, template }`. To use it as a child element
5
+ * (`<Input .../>`) in another component's template, that child must be a callable
6
+ * `defineComponent(render, setup)` provided in the compiled parent's `_c` map. This
7
+ * helper builds exactly that from a component module — the same shape the real
8
+ * `weave build` (`compileComponent`) emits, done here for the library's own tooling
9
+ * (tests + the gallery). Nested children are passed through so a composed component
10
+ * can itself compose more (e.g. Paginator → Input, Select).
11
+ *
12
+ * const _c = { Input: toComponent(InputMod) };
13
+ * // parent template: '<Input control={{ jump }} />'
14
+ */
15
+ export interface ComponentModule {
16
+ setup?: (props: Record<string, unknown>) => Record<string, unknown>;
17
+ template: string;
18
+ }
19
+ /** A map of child-component tag → callable component, injected as the compiled `_c`. */
20
+ export type ChildComponents = Record<string, unknown>;
21
+ /**
22
+ * Turn a `{ setup, template }` module into a callable Weave component. `children` are
23
+ * the child components its own template composes (its `_c` map), defaulting to none.
24
+ */
25
+ export declare function toComponent(mod: ComponentModule, children?: ChildComponents): unknown;
26
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/internal/compose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wFAAwF;AACxF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,GAAE,eAAoB,GAAG,OAAO,CAQzF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Compose one Weave UI component inside another's template.
3
+ *
4
+ * A UI component is authored as `{ setup, template }`. To use it as a child element
5
+ * (`<Input .../>`) in another component's template, that child must be a callable
6
+ * `defineComponent(render, setup)` provided in the compiled parent's `_c` map. This
7
+ * helper builds exactly that from a component module — the same shape the real
8
+ * `weave build` (`compileComponent`) emits, done here for the library's own tooling
9
+ * (tests + the gallery). Nested children are passed through so a composed component
10
+ * can itself compose more (e.g. Paginator → Input, Select).
11
+ *
12
+ * const _c = { Input: toComponent(InputMod) };
13
+ * // parent template: '<Input control={{ jump }} />'
14
+ */
15
+ import * as dom from '@weave-framework/runtime/dom';
16
+ import { signal, effect } from '@weave-framework/runtime';
17
+ import { compileTemplate, inferCtxNames, parseTemplate } from '@weave-framework/compiler';
18
+ const rt = { ...dom, signal, effect };
19
+ /**
20
+ * Turn a `{ setup, template }` module into a callable Weave component. `children` are
21
+ * the child components its own template composes (its `_c` map), defaulting to none.
22
+ */
23
+ export function toComponent(mod, children = {}) {
24
+ const scope = inferCtxNames(parseTemplate(mod.template));
25
+ const { code } = compileTemplate(mod.template, { mode: 'function', scope });
26
+ const body = code.replace(/return render\(ctx, \{\}\);\s*$/, 'return render;');
27
+ const render = new Function('rt', '_c', body)(rt, children);
28
+ return mod.setup
29
+ ? dom.defineComponent(render, mod.setup)
30
+ : dom.defineComponent(render);
31
+ }
32
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/internal/compose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,GAAG,MAAM,8BAA8B,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1F,MAAM,EAAE,GAAkE,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAUrG;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAoB,EAAE,WAA4B,EAAE;IAC9E,MAAM,KAAK,GAAa,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAW,IAAI,CAAC,OAAO,CAAC,iCAAiC,EAAE,gBAAgB,CAAC,CAAC;IACvF,MAAM,MAAM,GAAY,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrE,OAAO,GAAG,CAAC,KAAK;QACd,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAe,EAAE,GAAG,CAAC,KAAc,CAAC;QAC1D,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,MAAe,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `<List>` — a vertical list of rows (title + optional meta), in two modes:
3
+ *
4
+ * - **Selectable (default)** — listbox semantics: `role=listbox` with `role=option`
5
+ * rows, `aria-selected`, roving tabindex, and full keyboard navigation (Arrow / Home /
6
+ * End + typeahead on the row title) via the CDK `listKeyManager` (WAI-ARIA APG
7
+ * listbox). Selection is explicit — a click, or Enter / Space on the focused row —
8
+ * so arrowing moves focus without surprising the value. Value = the selected key.
9
+ * - **Non-selectable (`selectable={{ false }}`)** — a plain semantic list: `role=list`
10
+ * with `role=listitem` rows, no roving, no selection, no keyboard capture.
11
+ *
12
+ * Selection state rides the native ARIA attribute (`aria-selected`), so the styling
13
+ * hooks off `[aria-selected=true]` — the accentSoft tint + 2px accent left border —
14
+ * with no state class. Value binding is controlled: pass `value` (a getter) + `onChange`;
15
+ * forms (`use:control`) integration lands with the Checkbox pass that fixes the
16
+ * control-binding convention.
17
+ *
18
+ * import List from '@weave-framework/ui/list';
19
+ * <List items={{ rows }} value={{ selected() }} onChange={{ setSelected }} />
20
+ * <List selectable={{ false }} items={{ rows }} />
21
+ */
22
+ import { type Signal } from '@weave-framework/runtime';
23
+ import { type DropEvent } from '../cdk/drag-drop.js';
24
+ export interface ListItem {
25
+ /** The value this row carries (what `value`/`onChange` speak in). */
26
+ value: string;
27
+ /** Primary text. */
28
+ title: string;
29
+ /** Secondary text, shown trailing/muted. */
30
+ meta?: string;
31
+ /** Disable just this row (skipped in keyboard nav, not selectable). */
32
+ disabled?: boolean;
33
+ }
34
+ export interface ListProps {
35
+ /** The rows, top to bottom. */
36
+ items: ListItem[];
37
+ /** Selectable (listbox) vs a plain semantic list. Default true. */
38
+ selectable?: boolean;
39
+ /** Controlled value: the selected row's key (single-select). */
40
+ value?: string | null;
41
+ /** Called with the next value on select (click / Enter / Space). */
42
+ onChange?: (value: string) => void;
43
+ /** Disable the whole list. */
44
+ disabled?: boolean;
45
+ /** Show a per-row drag handle and let rows be reordered by dragging it (CDK `dropList`). */
46
+ reorderable?: boolean;
47
+ /** Called on a committed reorder — the consumer reorders `items` (List is controlled). */
48
+ onReorder?: (event: DropEvent) => void;
49
+ /** Accessible name for the list. */
50
+ label?: string;
51
+ /** Extra classes, forwarded onto the container. */
52
+ class?: string;
53
+ }
54
+ export declare const template: string;
55
+ export interface ListContext {
56
+ host: Signal<Element | null>;
57
+ items: () => ListItem[];
58
+ listClass: () => string;
59
+ listRole: () => string;
60
+ rowRole: () => string | undefined;
61
+ reorderable: () => boolean;
62
+ label: () => string | undefined;
63
+ ariaSelected: (item: ListItem) => string | undefined;
64
+ ariaDisabled: (item: ListItem) => string | undefined;
65
+ tabindexFor: (item: ListItem) => number | undefined;
66
+ activate: (item: ListItem) => void;
67
+ onKeydown: (event: KeyboardEvent) => void;
68
+ }
69
+ export declare function setup(props: ListProps): ListContext;
70
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/list/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACvC,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,QAAQ,EAAE,MAYb,CAAC;AAEX,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,QAAQ,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChC,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,YAAY,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;IACpD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAqGnD"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * `<List>` — a vertical list of rows (title + optional meta), in two modes:
3
+ *
4
+ * - **Selectable (default)** — listbox semantics: `role=listbox` with `role=option`
5
+ * rows, `aria-selected`, roving tabindex, and full keyboard navigation (Arrow / Home /
6
+ * End + typeahead on the row title) via the CDK `listKeyManager` (WAI-ARIA APG
7
+ * listbox). Selection is explicit — a click, or Enter / Space on the focused row —
8
+ * so arrowing moves focus without surprising the value. Value = the selected key.
9
+ * - **Non-selectable (`selectable={{ false }}`)** — a plain semantic list: `role=list`
10
+ * with `role=listitem` rows, no roving, no selection, no keyboard capture.
11
+ *
12
+ * Selection state rides the native ARIA attribute (`aria-selected`), so the styling
13
+ * hooks off `[aria-selected=true]` — the accentSoft tint + 2px accent left border —
14
+ * with no state class. Value binding is controlled: pass `value` (a getter) + `onChange`;
15
+ * forms (`use:control`) integration lands with the Checkbox pass that fixes the
16
+ * control-binding convention.
17
+ *
18
+ * import List from '@weave-framework/ui/list';
19
+ * <List items={{ rows }} value={{ selected() }} onChange={{ setSelected }} />
20
+ * <List selectable={{ false }} items={{ rows }} />
21
+ */
22
+ import { signal, onMount } from '@weave-framework/runtime';
23
+ import { listKeyManager } from '../cdk/key-manager.js';
24
+ import { dropList } from '../cdk/drag-drop.js';
25
+ export const template = '<div class={{ listClass() }} ref={{ host }} role={{ listRole() }} aria-label={{ label() }}' +
26
+ ' on:keydown={{ onKeydown }}>' +
27
+ '@for (item of items(); track item.value) {' +
28
+ '<div class="weave-list__row" role={{ rowRole() }} aria-selected={{ ariaSelected(item) }}' +
29
+ ' aria-disabled={{ ariaDisabled(item) }} tabindex={{ tabindexFor(item) }}' +
30
+ ' on:click={{ () => activate(item) }}>' +
31
+ '@if (reorderable()) {<span class="weave-list__drag-handle" aria-hidden="true">⠿</span>}' +
32
+ '<span class="weave-list__title">{{ item.title }}</span>' +
33
+ '@if (item.meta) {<span class="weave-list__meta">{{ item.meta }}</span>}' +
34
+ '</div>' +
35
+ '}' +
36
+ '</div>';
37
+ export function setup(props) {
38
+ const host = signal(null);
39
+ const items = () => props.items ?? [];
40
+ const selectable = () => props.selectable !== false;
41
+ const reorderable = () => !!props.reorderable;
42
+ // Reorder via the CDK dropList — only the drag handle starts a drag (row clicks still
43
+ // select). Committed drops emit onReorder; the consumer reorders `items` (controlled).
44
+ onMount(() => {
45
+ if (!props.reorderable)
46
+ return;
47
+ const el = host();
48
+ if (!el)
49
+ return;
50
+ dropList(el, {
51
+ itemSelector: '.weave-list__row',
52
+ handle: '.weave-list__drag-handle',
53
+ orientation: 'vertical',
54
+ keyboard: false, // the listbox owns Space/Arrows (selection + roving) — pointer-drag only
55
+ onDrop: (event) => props.onReorder?.(event),
56
+ });
57
+ });
58
+ const listDisabled = () => !!props.disabled;
59
+ const isItemDisabled = (item) => listDisabled() || !!item.disabled;
60
+ const isSelected = (item) => selectable() && props.value === item.value;
61
+ const manager = listKeyManager(items, {
62
+ orientation: 'vertical',
63
+ wrap: true,
64
+ skipDisabled: true,
65
+ isDisabled: isItemDisabled,
66
+ typeahead: true,
67
+ getLabel: (item) => item.title,
68
+ });
69
+ // The single tabbable row: the active one (once the keyboard has moved), else the
70
+ // selected one, else the first enabled — so the listbox always has one tab stop.
71
+ const rovingIndex = () => {
72
+ const active = manager.activeIndex();
73
+ if (active >= 0)
74
+ return active;
75
+ const rows = items();
76
+ const selected = rows.findIndex((r) => isSelected(r) && !isItemDisabled(r));
77
+ if (selected >= 0)
78
+ return selected;
79
+ const firstEnabled = rows.findIndex((r) => !isItemDisabled(r));
80
+ return firstEnabled >= 0 ? firstEnabled : 0;
81
+ };
82
+ const focusRow = (index) => {
83
+ const el = host();
84
+ if (!el)
85
+ return;
86
+ const row = el.querySelectorAll('.weave-list__row')[index];
87
+ row?.focus();
88
+ };
89
+ const activate = (item) => {
90
+ if (!selectable() || isItemDisabled(item))
91
+ return;
92
+ manager.setActiveItem(item); // roving tab stop follows the interaction
93
+ if (props.value !== item.value)
94
+ props.onChange?.(item.value);
95
+ };
96
+ const onKeydown = (event) => {
97
+ if (!selectable())
98
+ return;
99
+ // Sync the manager to the current tab stop before it navigates, so the first Arrow
100
+ // moves relative to the selected/focused row (not from index 0).
101
+ if (manager.activeIndex() < 0)
102
+ manager.setActiveItem(rovingIndex());
103
+ if (event.key === ' ' || event.key === 'Enter') {
104
+ const item = items()[manager.activeIndex()];
105
+ if (item) {
106
+ activate(item);
107
+ event.preventDefault();
108
+ }
109
+ return;
110
+ }
111
+ if (manager.onKeydown(event)) {
112
+ event.preventDefault();
113
+ focusRow(manager.activeIndex());
114
+ }
115
+ };
116
+ return {
117
+ host,
118
+ items,
119
+ listClass: () => {
120
+ const parts = ['weave-list'];
121
+ if (reorderable())
122
+ parts.push('weave-list--reorderable');
123
+ if (props.class)
124
+ parts.push(props.class);
125
+ return parts.join(' ');
126
+ },
127
+ listRole: () => (selectable() ? 'listbox' : 'list'),
128
+ rowRole: () => (selectable() ? 'option' : 'listitem'),
129
+ reorderable,
130
+ label: () => props.label,
131
+ ariaSelected: (item) => (selectable() ? (isSelected(item) ? 'true' : 'false') : undefined),
132
+ ariaDisabled: (item) => (selectable() && isItemDisabled(item) ? 'true' : undefined),
133
+ tabindexFor: (item) => {
134
+ if (!selectable())
135
+ return undefined;
136
+ if (isItemDisabled(item))
137
+ return -1;
138
+ return items().indexOf(item) === rovingIndex() ? 0 : -1;
139
+ },
140
+ activate,
141
+ onKeydown,
142
+ };
143
+ }
144
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/list/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Menu core — the shared overlay panel behind both `use:menu` (anchored to a trigger) and
3
+ * `use:contextMenu` (anchored to a virtual point). Builds a `role=menu` panel of
4
+ * `role=menuitem` buttons in a CDK overlay, wires roving focus (listKeyManager + typeahead,
5
+ * skip-disabled) and the WAI-ARIA menu keyboard (Up/Down/Home/End, Enter/Space activate,
6
+ * Esc/Tab close), plus a transparent click-away backdrop. Internal — not a public subpath;
7
+ * `menu.ts` / `context-menu.ts` are the surfaces. Zero-dep.
8
+ */
9
+ import { type PositionOrigin } from '../cdk/index.js';
10
+ import { type OptionAccessors } from '../shared/options.js';
11
+ import { type MenuPosition } from '../shared/positions.js';
12
+ export type { OptionAccessors } from '../shared/options.js';
13
+ export { buildPositions, type MenuPosition } from '../shared/positions.js';
14
+ /**
15
+ * The default authored menu-item shape. Menus can also be driven by arbitrary objects `T`
16
+ * via {@link OptionAccessors} — then `value`/`label`/… are read through the accessors.
17
+ */
18
+ export interface MenuItem {
19
+ /** Value emitted on select (default `emit`). */
20
+ value: string;
21
+ /** Visible label (also the typeahead text). */
22
+ label: string;
23
+ /** Optional subtext under the label (smaller, lighter). */
24
+ description?: string;
25
+ /** Greyed + skipped by keyboard nav; not selectable. */
26
+ disabled?: boolean;
27
+ /** Render a hairline separator here instead of an item. */
28
+ divider?: boolean;
29
+ }
30
+ export interface OpenMenuConfig<T> extends OptionAccessors<T> {
31
+ /** What the panel is anchored to — a trigger element, or a virtual point. */
32
+ origin: PositionOrigin;
33
+ items: T[];
34
+ /** Preferred positions in flip order (see {@link buildPositions}). */
35
+ positions: MenuPosition[];
36
+ /**
37
+ * Highlight (focus) the first item on open. `true` for a keyboard open (↓/Enter/F10) so
38
+ * the user can act immediately; `false` for a pointer open — no item is pre-highlighted
39
+ * (matches native/Material menus), focus rests on the panel and the first arrow moves in.
40
+ */
41
+ focusFirst: boolean;
42
+ /** Is this option a hairline separator (not selectable)? Default: `item.divider`. */
43
+ isDivider?: (item: T) => boolean;
44
+ /** Called with the chosen option (value string, or the whole object — see `emit`). */
45
+ onSelect: (selected: string | T) => void;
46
+ /** Called after the panel is torn down. `returnFocus` = closed via keyboard/selection. */
47
+ onClose?: (returnFocus: boolean) => void;
48
+ }
49
+ export interface MenuHandle {
50
+ close(returnFocus: boolean): void;
51
+ }
52
+ /** A zero-size origin at a viewport point (for context menus / caret-anchored panels). */
53
+ export declare function virtualOrigin(x: number, y: number): PositionOrigin;
54
+ /** Open a menu panel. Returns a handle, or null if there's nothing selectable to show. */
55
+ export declare function openMenuPanel<T>(cfg: OpenMenuConfig<T>): MenuHandle | null;
56
+ //# sourceMappingURL=menu-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-core.d.ts","sourceRoot":"","sources":["../../src/menu/menu-core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3E,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3E;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC3D,6EAA6E;IAC7E,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,sEAAsE;IACtE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,qFAAqF;IACrF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IACjC,sFAAsF;IACtF,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC;IACzC,0FAA0F;IAC1F,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,cAAc,CAElE;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CA4G1E"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Menu core — the shared overlay panel behind both `use:menu` (anchored to a trigger) and
3
+ * `use:contextMenu` (anchored to a virtual point). Builds a `role=menu` panel of
4
+ * `role=menuitem` buttons in a CDK overlay, wires roving focus (listKeyManager + typeahead,
5
+ * skip-disabled) and the WAI-ARIA menu keyboard (Up/Down/Home/End, Enter/Space activate,
6
+ * Esc/Tab close), plus a transparent click-away backdrop. Internal — not a public subpath;
7
+ * `menu.ts` / `context-menu.ts` are the surfaces. Zero-dep.
8
+ */
9
+ import { createOverlay, connectedPosition, listKeyManager, } from '../cdk/index.js';
10
+ import { optLabel, optDescription, optDisabled, emitSelection, } from '../shared/options.js';
11
+ export { buildPositions } from '../shared/positions.js';
12
+ /** A zero-size origin at a viewport point (for context menus / caret-anchored panels). */
13
+ export function virtualOrigin(x, y) {
14
+ return { getBoundingClientRect: () => new DOMRect(x, y, 0, 0) };
15
+ }
16
+ /** Open a menu panel. Returns a handle, or null if there's nothing selectable to show. */
17
+ export function openMenuPanel(cfg) {
18
+ const isDivider = (item) => cfg.isDivider ? cfg.isDivider(item) : Boolean(item.divider);
19
+ const enabled = () => cfg.items.filter((it) => !isDivider(it) && !optDisabled(it, cfg));
20
+ if (enabled().length === 0)
21
+ return null;
22
+ let itemEls = []; // enabled items only, index-aligned with `enabled()`
23
+ let closed = false;
24
+ const km = listKeyManager(enabled, {
25
+ orientation: 'vertical',
26
+ wrap: true,
27
+ typeahead: true,
28
+ getLabel: (it) => optLabel(it, cfg),
29
+ });
30
+ const ref = createOverlay({
31
+ hasBackdrop: true,
32
+ backdropClass: 'weave-overlay-backdrop--transparent',
33
+ positionStrategy: connectedPosition(cfg.origin, { positions: cfg.positions, offset: 4 }),
34
+ });
35
+ function focusActive() {
36
+ const idx = km.activeIndex();
37
+ if (idx >= 0 && idx < itemEls.length)
38
+ itemEls[idx].focus();
39
+ }
40
+ function close(returnFocus) {
41
+ if (closed)
42
+ return;
43
+ closed = true;
44
+ ref.dispose();
45
+ cfg.onClose?.(returnFocus);
46
+ }
47
+ function select(item) {
48
+ close(true);
49
+ cfg.onSelect(emitSelection(item, cfg));
50
+ }
51
+ function onKeydown(event) {
52
+ if (event.key === 'Escape' || event.key === 'Tab') {
53
+ event.preventDefault();
54
+ close(true);
55
+ return;
56
+ }
57
+ if (event.key === 'Enter' || event.key === ' ') {
58
+ event.preventDefault();
59
+ const it = km.activeItem();
60
+ if (it != null)
61
+ select(it);
62
+ return;
63
+ }
64
+ if (km.onKeydown(event)) {
65
+ event.preventDefault();
66
+ focusActive();
67
+ }
68
+ }
69
+ const panel = document.createElement('div');
70
+ panel.className = 'weave-menu';
71
+ panel.setAttribute('role', 'menu');
72
+ for (const it of cfg.items) {
73
+ if (isDivider(it)) {
74
+ const sep = document.createElement('div');
75
+ sep.className = 'weave-menu__divider';
76
+ sep.setAttribute('role', 'separator');
77
+ panel.appendChild(sep);
78
+ continue;
79
+ }
80
+ const btn = document.createElement('button');
81
+ btn.type = 'button';
82
+ btn.className = 'weave-menu__item';
83
+ btn.setAttribute('role', 'menuitem');
84
+ btn.tabIndex = -1; // roving: focus is moved programmatically
85
+ const label = document.createElement('span');
86
+ label.className = 'weave-menu__label';
87
+ label.textContent = optLabel(it, cfg);
88
+ btn.appendChild(label);
89
+ const description = optDescription(it, cfg);
90
+ if (description) {
91
+ const desc = document.createElement('span');
92
+ desc.className = 'weave-menu__description';
93
+ desc.textContent = description;
94
+ btn.appendChild(desc);
95
+ }
96
+ if (optDisabled(it, cfg)) {
97
+ btn.disabled = true;
98
+ btn.setAttribute('aria-disabled', 'true');
99
+ }
100
+ else {
101
+ itemEls.push(btn);
102
+ btn.addEventListener('click', () => select(it));
103
+ }
104
+ panel.appendChild(btn);
105
+ }
106
+ panel.addEventListener('keydown', onKeydown);
107
+ ref.onBackdropClick(() => close(false));
108
+ ref.attach(panel);
109
+ // Focus moves into the menu either way (so the keyboard + Esc work). Keyboard opens land
110
+ // on the first item; pointer opens rest on the panel with nothing highlighted — the first
111
+ // arrow then steps in from the top.
112
+ if (cfg.focusFirst) {
113
+ km.first();
114
+ focusActive();
115
+ }
116
+ else {
117
+ panel.tabIndex = -1;
118
+ panel.focus();
119
+ }
120
+ return { close };
121
+ }
122
+ //# sourceMappingURL=menu-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-core.js","sourceRoot":"","sources":["../../src/menu/menu-core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,cAAc,GAIf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,cAAc,EAAqB,MAAM,wBAAwB,CAAC;AA2C3E,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,OAAO,EAAE,qBAAqB,EAAE,GAAY,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,aAAa,CAAI,GAAsB;IACrD,MAAM,SAAS,GAAG,CAAC,IAAO,EAAW,EAAE,CACrC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAE,IAA8B,CAAC,OAAO,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,GAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7F,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,IAAI,OAAO,GAAwB,EAAE,CAAC,CAAC,qDAAqD;IAC5F,IAAI,MAAM,GAAY,KAAK,CAAC;IAC5B,MAAM,EAAE,GAAsB,cAAc,CAAI,OAAO,EAAE;QACvD,WAAW,EAAE,UAAU;QACvB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;KACpC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAe,aAAa,CAAC;QACpC,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,qCAAqC;QACpD,gBAAgB,EAAE,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KACzF,CAAC,CAAC;IAEH,SAAS,WAAW;QAClB,MAAM,GAAG,GAAW,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED,SAAS,KAAK,CAAC,WAAoB;QACjC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,GAAG,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,MAAM,CAAC,IAAO;QACrB,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,SAAS,CAAC,KAAoB;QACrC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YAClD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,EAAE,GAAa,EAAE,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,EAAE,IAAI,IAAI;gBAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAgB,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzD,KAAK,CAAC,SAAS,GAAG,YAAY,CAAC;IAC/B,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YAClB,MAAM,GAAG,GAAgB,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACvD,GAAG,CAAC,SAAS,GAAG,qBAAqB,CAAC;YACtC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACtC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAsB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChE,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;QACpB,GAAG,CAAC,SAAS,GAAG,kBAAkB,CAAC;QACnC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,0CAA0C;QAC7D,MAAM,KAAK,GAAgB,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1D,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;QACtC,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACtC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,WAAW,GAAuB,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,GAAgB,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,GAAG,yBAAyB,CAAC;YAC3C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;YACpB,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE7C,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClB,yFAAyF;IACzF,0FAA0F;IAC1F,oCAAoC;IACpC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACpB,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}