@mortenbrudvik/waveui 0.7.0 → 0.9.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 (439) hide show
  1. package/README.md +564 -155
  2. package/dist/components/button/Button.cjs +1 -1
  3. package/dist/components/button/Button.cjs.map +1 -1
  4. package/dist/components/button/Button.mjs +36 -35
  5. package/dist/components/button/Button.mjs.map +1 -1
  6. package/dist/components/button/Button.slots.cjs +1 -1
  7. package/dist/components/button/Button.slots.cjs.map +1 -1
  8. package/dist/components/button/Button.slots.mjs +31 -21
  9. package/dist/components/button/Button.slots.mjs.map +1 -1
  10. package/dist/components/button/CompoundButton.cjs +1 -1
  11. package/dist/components/button/CompoundButton.cjs.map +1 -1
  12. package/dist/components/button/CompoundButton.mjs +31 -29
  13. package/dist/components/button/CompoundButton.mjs.map +1 -1
  14. package/dist/components/button/Link.cjs +1 -1
  15. package/dist/components/button/Link.cjs.map +1 -1
  16. package/dist/components/button/Link.mjs +24 -23
  17. package/dist/components/button/Link.mjs.map +1 -1
  18. package/dist/components/button/MenuButton.cjs +1 -1
  19. package/dist/components/button/MenuButton.cjs.map +1 -1
  20. package/dist/components/button/MenuButton.mjs +29 -28
  21. package/dist/components/button/MenuButton.mjs.map +1 -1
  22. package/dist/components/button/SplitButton.cjs +1 -1
  23. package/dist/components/button/SplitButton.cjs.map +1 -1
  24. package/dist/components/button/SplitButton.mjs +46 -45
  25. package/dist/components/button/SplitButton.mjs.map +1 -1
  26. package/dist/components/button/ToggleButton.cjs +1 -1
  27. package/dist/components/button/ToggleButton.cjs.map +1 -1
  28. package/dist/components/button/ToggleButton.mjs +38 -35
  29. package/dist/components/button/ToggleButton.mjs.map +1 -1
  30. package/dist/components/button/Toolbar.cjs +1 -1
  31. package/dist/components/button/Toolbar.cjs.map +1 -1
  32. package/dist/components/button/Toolbar.mjs +43 -42
  33. package/dist/components/button/Toolbar.mjs.map +1 -1
  34. package/dist/components/button/Toolbar.parts.cjs +1 -1
  35. package/dist/components/button/Toolbar.parts.cjs.map +1 -1
  36. package/dist/components/button/Toolbar.parts.mjs +76 -81
  37. package/dist/components/button/Toolbar.parts.mjs.map +1 -1
  38. package/dist/components/data-display/Avatar.cjs +1 -1
  39. package/dist/components/data-display/Avatar.cjs.map +1 -1
  40. package/dist/components/data-display/Avatar.mjs +72 -67
  41. package/dist/components/data-display/Avatar.mjs.map +1 -1
  42. package/dist/components/data-display/AvatarGroup.cjs +1 -1
  43. package/dist/components/data-display/AvatarGroup.cjs.map +1 -1
  44. package/dist/components/data-display/AvatarGroup.mjs +89 -88
  45. package/dist/components/data-display/AvatarGroup.mjs.map +1 -1
  46. package/dist/components/data-display/Badge.cjs +1 -1
  47. package/dist/components/data-display/Badge.cjs.map +1 -1
  48. package/dist/components/data-display/Badge.mjs +17 -16
  49. package/dist/components/data-display/Badge.mjs.map +1 -1
  50. package/dist/components/data-display/CounterBadge.cjs +1 -1
  51. package/dist/components/data-display/CounterBadge.cjs.map +1 -1
  52. package/dist/components/data-display/CounterBadge.mjs +18 -17
  53. package/dist/components/data-display/CounterBadge.mjs.map +1 -1
  54. package/dist/components/data-display/Divider.cjs +1 -1
  55. package/dist/components/data-display/Divider.cjs.map +1 -1
  56. package/dist/components/data-display/Divider.mjs +31 -30
  57. package/dist/components/data-display/Divider.mjs.map +1 -1
  58. package/dist/components/data-display/Image.cjs +1 -1
  59. package/dist/components/data-display/Image.cjs.map +1 -1
  60. package/dist/components/data-display/Image.mjs +16 -15
  61. package/dist/components/data-display/Image.mjs.map +1 -1
  62. package/dist/components/data-display/InfoButton.cjs +2 -0
  63. package/dist/components/data-display/InfoButton.cjs.map +1 -0
  64. package/dist/components/data-display/InfoButton.mjs +173 -0
  65. package/dist/components/data-display/InfoButton.mjs.map +1 -0
  66. package/dist/components/data-display/InfoLabel.cjs +1 -1
  67. package/dist/components/data-display/InfoLabel.cjs.map +1 -1
  68. package/dist/components/data-display/InfoLabel.mjs +36 -92
  69. package/dist/components/data-display/InfoLabel.mjs.map +1 -1
  70. package/dist/components/data-display/List.cjs +1 -1
  71. package/dist/components/data-display/List.cjs.map +1 -1
  72. package/dist/components/data-display/List.mjs +175 -174
  73. package/dist/components/data-display/List.mjs.map +1 -1
  74. package/dist/components/data-display/Persona.cjs +1 -1
  75. package/dist/components/data-display/Persona.cjs.map +1 -1
  76. package/dist/components/data-display/Persona.mjs +31 -29
  77. package/dist/components/data-display/Persona.mjs.map +1 -1
  78. package/dist/components/data-display/PresenceBadge.cjs +1 -1
  79. package/dist/components/data-display/PresenceBadge.cjs.map +1 -1
  80. package/dist/components/data-display/PresenceBadge.mjs +25 -24
  81. package/dist/components/data-display/PresenceBadge.mjs.map +1 -1
  82. package/dist/components/data-display/Tag.cjs +1 -1
  83. package/dist/components/data-display/Tag.cjs.map +1 -1
  84. package/dist/components/data-display/Tag.mjs +87 -82
  85. package/dist/components/data-display/Tag.mjs.map +1 -1
  86. package/dist/components/feedback/MessageBar.cjs +1 -1
  87. package/dist/components/feedback/MessageBar.cjs.map +1 -1
  88. package/dist/components/feedback/MessageBar.mjs +129 -71
  89. package/dist/components/feedback/MessageBar.mjs.map +1 -1
  90. package/dist/components/feedback/MessageBar.parts.cjs +2 -0
  91. package/dist/components/feedback/MessageBar.parts.cjs.map +1 -0
  92. package/dist/components/feedback/MessageBar.parts.mjs +84 -0
  93. package/dist/components/feedback/MessageBar.parts.mjs.map +1 -0
  94. package/dist/components/feedback/MessageBar.reflow.cjs +2 -0
  95. package/dist/components/feedback/MessageBar.reflow.cjs.map +1 -0
  96. package/dist/components/feedback/MessageBar.reflow.mjs +74 -0
  97. package/dist/components/feedback/MessageBar.reflow.mjs.map +1 -0
  98. package/dist/components/feedback/MessageBar.status.cjs +1 -1
  99. package/dist/components/feedback/MessageBar.status.cjs.map +1 -1
  100. package/dist/components/feedback/MessageBar.status.mjs +2 -1
  101. package/dist/components/feedback/MessageBar.status.mjs.map +1 -1
  102. package/dist/components/feedback/ProgressBar.cjs +1 -1
  103. package/dist/components/feedback/ProgressBar.cjs.map +1 -1
  104. package/dist/components/feedback/ProgressBar.mjs +44 -43
  105. package/dist/components/feedback/ProgressBar.mjs.map +1 -1
  106. package/dist/components/feedback/Skeleton.cjs +1 -1
  107. package/dist/components/feedback/Skeleton.cjs.map +1 -1
  108. package/dist/components/feedback/Skeleton.mjs +26 -24
  109. package/dist/components/feedback/Skeleton.mjs.map +1 -1
  110. package/dist/components/feedback/Spinner.cjs +1 -1
  111. package/dist/components/feedback/Spinner.cjs.map +1 -1
  112. package/dist/components/feedback/Spinner.mjs +32 -31
  113. package/dist/components/feedback/Spinner.mjs.map +1 -1
  114. package/dist/components/feedback/Toast.cjs +1 -1
  115. package/dist/components/feedback/Toast.cjs.map +1 -1
  116. package/dist/components/feedback/Toast.context.cjs +2 -0
  117. package/dist/components/feedback/Toast.context.cjs.map +1 -0
  118. package/dist/components/feedback/Toast.context.mjs +23 -0
  119. package/dist/components/feedback/Toast.context.mjs.map +1 -0
  120. package/dist/components/feedback/Toast.mjs +10 -342
  121. package/dist/components/feedback/Toast.mjs.map +1 -1
  122. package/dist/components/feedback/Toast.parts.cjs +2 -0
  123. package/dist/components/feedback/Toast.parts.cjs.map +1 -0
  124. package/dist/components/feedback/Toast.parts.mjs +98 -0
  125. package/dist/components/feedback/Toast.parts.mjs.map +1 -0
  126. package/dist/components/feedback/Toast.root.cjs +2 -0
  127. package/dist/components/feedback/Toast.root.cjs.map +1 -0
  128. package/dist/components/feedback/Toast.root.mjs +109 -0
  129. package/dist/components/feedback/Toast.root.mjs.map +1 -0
  130. package/dist/components/feedback/Toaster.cjs +2 -0
  131. package/dist/components/feedback/Toaster.cjs.map +1 -0
  132. package/dist/components/feedback/Toaster.mjs +564 -0
  133. package/dist/components/feedback/Toaster.mjs.map +1 -0
  134. package/dist/components/input/AlphaSlider.cjs +2 -0
  135. package/dist/components/input/AlphaSlider.cjs.map +1 -0
  136. package/dist/components/input/AlphaSlider.mjs +115 -0
  137. package/dist/components/input/AlphaSlider.mjs.map +1 -0
  138. package/dist/components/input/Checkbox.cjs +1 -1
  139. package/dist/components/input/Checkbox.cjs.map +1 -1
  140. package/dist/components/input/Checkbox.mjs +87 -70
  141. package/dist/components/input/Checkbox.mjs.map +1 -1
  142. package/dist/components/input/ColorArea.cjs +2 -0
  143. package/dist/components/input/ColorArea.cjs.map +1 -0
  144. package/dist/components/input/ColorArea.mjs +204 -0
  145. package/dist/components/input/ColorArea.mjs.map +1 -0
  146. package/dist/components/input/ColorPicker.cjs +5 -5
  147. package/dist/components/input/ColorPicker.cjs.map +1 -1
  148. package/dist/components/input/ColorPicker.mjs +142 -165
  149. package/dist/components/input/ColorPicker.mjs.map +1 -1
  150. package/dist/components/input/ColorPicker.parts.cjs +2 -0
  151. package/dist/components/input/ColorPicker.parts.cjs.map +1 -0
  152. package/dist/components/input/ColorPicker.parts.mjs +192 -0
  153. package/dist/components/input/ColorPicker.parts.mjs.map +1 -0
  154. package/dist/components/input/ColorSlider.cjs +2 -0
  155. package/dist/components/input/ColorSlider.cjs.map +1 -0
  156. package/dist/components/input/ColorSlider.mjs +138 -0
  157. package/dist/components/input/ColorSlider.mjs.map +1 -0
  158. package/dist/components/input/Combobox.cjs +1 -1
  159. package/dist/components/input/Combobox.cjs.map +1 -1
  160. package/dist/components/input/Combobox.expand.cjs +1 -1
  161. package/dist/components/input/Combobox.expand.cjs.map +1 -1
  162. package/dist/components/input/Combobox.expand.mjs +22 -22
  163. package/dist/components/input/Combobox.expand.mjs.map +1 -1
  164. package/dist/components/input/Combobox.mjs +151 -141
  165. package/dist/components/input/Combobox.mjs.map +1 -1
  166. package/dist/components/input/DatePicker.cjs +1 -1
  167. package/dist/components/input/DatePicker.cjs.map +1 -1
  168. package/dist/components/input/DatePicker.mjs +239 -234
  169. package/dist/components/input/DatePicker.mjs.map +1 -1
  170. package/dist/components/input/Dropdown.cjs +1 -1
  171. package/dist/components/input/Dropdown.cjs.map +1 -1
  172. package/dist/components/input/Dropdown.mjs +109 -100
  173. package/dist/components/input/Dropdown.mjs.map +1 -1
  174. package/dist/components/input/Field.cjs +1 -1
  175. package/dist/components/input/Field.cjs.map +1 -1
  176. package/dist/components/input/Field.mjs +139 -105
  177. package/dist/components/input/Field.mjs.map +1 -1
  178. package/dist/components/input/Input.cjs +1 -1
  179. package/dist/components/input/Input.cjs.map +1 -1
  180. package/dist/components/input/Input.mjs +80 -55
  181. package/dist/components/input/Input.mjs.map +1 -1
  182. package/dist/components/input/Label.cjs +1 -1
  183. package/dist/components/input/Label.cjs.map +1 -1
  184. package/dist/components/input/Label.mjs +19 -12
  185. package/dist/components/input/Label.mjs.map +1 -1
  186. package/dist/components/input/Option.cjs +1 -1
  187. package/dist/components/input/Option.cjs.map +1 -1
  188. package/dist/components/input/Option.mjs +100 -98
  189. package/dist/components/input/Option.mjs.map +1 -1
  190. package/dist/components/input/RadioGroup.cjs +1 -1
  191. package/dist/components/input/RadioGroup.cjs.map +1 -1
  192. package/dist/components/input/RadioGroup.mjs +89 -88
  193. package/dist/components/input/RadioGroup.mjs.map +1 -1
  194. package/dist/components/input/Rating.cjs +1 -1
  195. package/dist/components/input/Rating.cjs.map +1 -1
  196. package/dist/components/input/Rating.item.cjs +2 -0
  197. package/dist/components/input/Rating.item.cjs.map +1 -0
  198. package/dist/components/input/Rating.item.mjs +255 -0
  199. package/dist/components/input/Rating.item.mjs.map +1 -0
  200. package/dist/components/input/Rating.mjs +152 -152
  201. package/dist/components/input/Rating.mjs.map +1 -1
  202. package/dist/components/input/SearchBox.cjs +1 -1
  203. package/dist/components/input/SearchBox.cjs.map +1 -1
  204. package/dist/components/input/SearchBox.mjs +162 -132
  205. package/dist/components/input/SearchBox.mjs.map +1 -1
  206. package/dist/components/input/Select.cjs +1 -1
  207. package/dist/components/input/Select.cjs.map +1 -1
  208. package/dist/components/input/Select.mjs +34 -24
  209. package/dist/components/input/Select.mjs.map +1 -1
  210. package/dist/components/input/Slider.cjs +1 -1
  211. package/dist/components/input/Slider.cjs.map +1 -1
  212. package/dist/components/input/Slider.mjs +78 -54
  213. package/dist/components/input/Slider.mjs.map +1 -1
  214. package/dist/components/input/SpinButton.cjs +1 -1
  215. package/dist/components/input/SpinButton.cjs.map +1 -1
  216. package/dist/components/input/SpinButton.mjs +202 -99
  217. package/dist/components/input/SpinButton.mjs.map +1 -1
  218. package/dist/components/input/SwatchPicker.cjs +1 -1
  219. package/dist/components/input/SwatchPicker.cjs.map +1 -1
  220. package/dist/components/input/SwatchPicker.mjs +38 -37
  221. package/dist/components/input/SwatchPicker.mjs.map +1 -1
  222. package/dist/components/input/Switch.cjs +1 -1
  223. package/dist/components/input/Switch.cjs.map +1 -1
  224. package/dist/components/input/Switch.mjs +75 -58
  225. package/dist/components/input/Switch.mjs.map +1 -1
  226. package/dist/components/input/TagPicker.cjs +1 -1
  227. package/dist/components/input/TagPicker.cjs.map +1 -1
  228. package/dist/components/input/TagPicker.mjs +199 -169
  229. package/dist/components/input/TagPicker.mjs.map +1 -1
  230. package/dist/components/input/Textarea.cjs +1 -1
  231. package/dist/components/input/Textarea.cjs.map +1 -1
  232. package/dist/components/input/Textarea.mjs +31 -23
  233. package/dist/components/input/Textarea.mjs.map +1 -1
  234. package/dist/components/input/TimePicker.cjs +1 -1
  235. package/dist/components/input/TimePicker.cjs.map +1 -1
  236. package/dist/components/input/TimePicker.mjs +185 -177
  237. package/dist/components/input/TimePicker.mjs.map +1 -1
  238. package/dist/components/input/colorName.cjs +2 -0
  239. package/dist/components/input/colorName.cjs.map +1 -0
  240. package/dist/components/input/colorName.mjs +30 -0
  241. package/dist/components/input/colorName.mjs.map +1 -0
  242. package/dist/components/input/colorUtils.cjs +1 -1
  243. package/dist/components/input/colorUtils.cjs.map +1 -1
  244. package/dist/components/input/colorUtils.mjs +154 -56
  245. package/dist/components/input/colorUtils.mjs.map +1 -1
  246. package/dist/components/input/fieldLabel.cjs +2 -0
  247. package/dist/components/input/fieldLabel.cjs.map +1 -0
  248. package/dist/components/input/fieldLabel.mjs +17 -0
  249. package/dist/components/input/fieldLabel.mjs.map +1 -0
  250. package/dist/components/input/inputLook.cjs +2 -0
  251. package/dist/components/input/inputLook.cjs.map +1 -0
  252. package/dist/components/input/inputLook.mjs +28 -0
  253. package/dist/components/input/inputLook.mjs.map +1 -0
  254. package/dist/components/input/pickerStyles.cjs +1 -1
  255. package/dist/components/input/pickerStyles.cjs.map +1 -1
  256. package/dist/components/input/pickerStyles.mjs +42 -4
  257. package/dist/components/input/pickerStyles.mjs.map +1 -1
  258. package/dist/components/layout/Accordion.cjs +1 -1
  259. package/dist/components/layout/Accordion.cjs.map +1 -1
  260. package/dist/components/layout/Accordion.mjs +130 -129
  261. package/dist/components/layout/Accordion.mjs.map +1 -1
  262. package/dist/components/layout/Card.cjs +1 -1
  263. package/dist/components/layout/Card.cjs.map +1 -1
  264. package/dist/components/layout/Card.mjs +78 -77
  265. package/dist/components/layout/Card.mjs.map +1 -1
  266. package/dist/components/layout/Carousel.cjs +1 -1
  267. package/dist/components/layout/Carousel.cjs.map +1 -1
  268. package/dist/components/layout/Carousel.mjs +111 -110
  269. package/dist/components/layout/Carousel.mjs.map +1 -1
  270. package/dist/components/layout/Flex.cjs +1 -1
  271. package/dist/components/layout/Flex.cjs.map +1 -1
  272. package/dist/components/layout/Flex.mjs +22 -21
  273. package/dist/components/layout/Flex.mjs.map +1 -1
  274. package/dist/components/layout/Grid.cjs +1 -1
  275. package/dist/components/layout/Grid.cjs.map +1 -1
  276. package/dist/components/layout/Grid.mjs +19 -18
  277. package/dist/components/layout/Grid.mjs.map +1 -1
  278. package/dist/components/layout/Overflow.cjs +1 -1
  279. package/dist/components/layout/Overflow.cjs.map +1 -1
  280. package/dist/components/layout/Overflow.mjs +92 -91
  281. package/dist/components/layout/Overflow.mjs.map +1 -1
  282. package/dist/components/layout/Stack.cjs +1 -1
  283. package/dist/components/layout/Stack.cjs.map +1 -1
  284. package/dist/components/layout/Stack.mjs +14 -13
  285. package/dist/components/layout/Stack.mjs.map +1 -1
  286. package/dist/components/layout/TabList.cjs +1 -1
  287. package/dist/components/layout/TabList.cjs.map +1 -1
  288. package/dist/components/layout/TabList.mjs +118 -117
  289. package/dist/components/layout/TabList.mjs.map +1 -1
  290. package/dist/components/layout/Tree.cjs +1 -1
  291. package/dist/components/layout/Tree.cjs.map +1 -1
  292. package/dist/components/layout/Tree.context.cjs +2 -0
  293. package/dist/components/layout/Tree.context.cjs.map +1 -0
  294. package/dist/components/layout/Tree.context.mjs +33 -0
  295. package/dist/components/layout/Tree.context.mjs.map +1 -0
  296. package/dist/components/layout/Tree.core.cjs +2 -0
  297. package/dist/components/layout/Tree.core.cjs.map +1 -0
  298. package/dist/components/layout/Tree.core.mjs +416 -0
  299. package/dist/components/layout/Tree.core.mjs.map +1 -0
  300. package/dist/components/layout/Tree.itemPersonaLayout.cjs +2 -0
  301. package/dist/components/layout/Tree.itemPersonaLayout.cjs.map +1 -0
  302. package/dist/components/layout/Tree.itemPersonaLayout.mjs +46 -0
  303. package/dist/components/layout/Tree.itemPersonaLayout.mjs.map +1 -0
  304. package/dist/components/layout/Tree.mjs +7 -215
  305. package/dist/components/layout/Tree.mjs.map +1 -1
  306. package/dist/components/layout/Tree.selection.cjs +2 -0
  307. package/dist/components/layout/Tree.selection.cjs.map +1 -0
  308. package/dist/components/layout/Tree.selection.mjs +73 -0
  309. package/dist/components/layout/Tree.selection.mjs.map +1 -0
  310. package/dist/components/navigation/Breadcrumb.cjs +1 -1
  311. package/dist/components/navigation/Breadcrumb.cjs.map +1 -1
  312. package/dist/components/navigation/Breadcrumb.mjs +76 -75
  313. package/dist/components/navigation/Breadcrumb.mjs.map +1 -1
  314. package/dist/components/navigation/Menu.group.cjs +1 -1
  315. package/dist/components/navigation/Menu.group.cjs.map +1 -1
  316. package/dist/components/navigation/Menu.group.mjs +39 -37
  317. package/dist/components/navigation/Menu.group.mjs.map +1 -1
  318. package/dist/components/navigation/Menu.items.cjs +1 -1
  319. package/dist/components/navigation/Menu.items.cjs.map +1 -1
  320. package/dist/components/navigation/Menu.items.mjs +67 -61
  321. package/dist/components/navigation/Menu.items.mjs.map +1 -1
  322. package/dist/components/navigation/Menu.link.cjs +1 -1
  323. package/dist/components/navigation/Menu.link.cjs.map +1 -1
  324. package/dist/components/navigation/Menu.link.mjs +34 -28
  325. package/dist/components/navigation/Menu.link.mjs.map +1 -1
  326. package/dist/components/navigation/Menu.popover.cjs +1 -1
  327. package/dist/components/navigation/Menu.popover.cjs.map +1 -1
  328. package/dist/components/navigation/Menu.popover.mjs +114 -113
  329. package/dist/components/navigation/Menu.popover.mjs.map +1 -1
  330. package/dist/components/navigation/Menu.root.cjs +1 -1
  331. package/dist/components/navigation/Menu.root.cjs.map +1 -1
  332. package/dist/components/navigation/Menu.root.mjs +171 -170
  333. package/dist/components/navigation/Menu.root.mjs.map +1 -1
  334. package/dist/components/navigation/Menu.selectable.cjs +1 -1
  335. package/dist/components/navigation/Menu.selectable.cjs.map +1 -1
  336. package/dist/components/navigation/Menu.selectable.mjs +85 -63
  337. package/dist/components/navigation/Menu.selectable.mjs.map +1 -1
  338. package/dist/components/navigation/Menu.splitGroup.cjs +1 -1
  339. package/dist/components/navigation/Menu.splitGroup.cjs.map +1 -1
  340. package/dist/components/navigation/Menu.splitGroup.mjs +27 -26
  341. package/dist/components/navigation/Menu.splitGroup.mjs.map +1 -1
  342. package/dist/components/navigation/Menu.trigger.cjs +1 -1
  343. package/dist/components/navigation/Menu.trigger.cjs.map +1 -1
  344. package/dist/components/navigation/Menu.trigger.mjs +6 -6
  345. package/dist/components/navigation/Nav.cjs +1 -1
  346. package/dist/components/navigation/Nav.cjs.map +1 -1
  347. package/dist/components/navigation/Nav.mjs +170 -155
  348. package/dist/components/navigation/Nav.mjs.map +1 -1
  349. package/dist/components/navigation/Pagination.cjs +1 -1
  350. package/dist/components/navigation/Pagination.cjs.map +1 -1
  351. package/dist/components/navigation/Pagination.mjs +73 -65
  352. package/dist/components/navigation/Pagination.mjs.map +1 -1
  353. package/dist/components/navigation/Stepper.cjs +1 -1
  354. package/dist/components/navigation/Stepper.cjs.map +1 -1
  355. package/dist/components/navigation/Stepper.mjs +110 -109
  356. package/dist/components/navigation/Stepper.mjs.map +1 -1
  357. package/dist/components/overlays/Dialog.cjs +1 -1
  358. package/dist/components/overlays/Dialog.cjs.map +1 -1
  359. package/dist/components/overlays/Dialog.mjs +109 -108
  360. package/dist/components/overlays/Dialog.mjs.map +1 -1
  361. package/dist/components/overlays/Drawer.cjs +1 -1
  362. package/dist/components/overlays/Drawer.cjs.map +1 -1
  363. package/dist/components/overlays/Drawer.mjs +110 -109
  364. package/dist/components/overlays/Drawer.mjs.map +1 -1
  365. package/dist/components/overlays/Popover.cjs +1 -1
  366. package/dist/components/overlays/Popover.cjs.map +1 -1
  367. package/dist/components/overlays/Popover.mjs +148 -151
  368. package/dist/components/overlays/Popover.mjs.map +1 -1
  369. package/dist/components/overlays/Popover.shared.cjs +1 -1
  370. package/dist/components/overlays/Popover.shared.cjs.map +1 -1
  371. package/dist/components/overlays/Popover.shared.mjs +82 -77
  372. package/dist/components/overlays/Popover.shared.mjs.map +1 -1
  373. package/dist/components/overlays/TeachingPopover.cjs +1 -1
  374. package/dist/components/overlays/TeachingPopover.cjs.map +1 -1
  375. package/dist/components/overlays/TeachingPopover.mjs +41 -37
  376. package/dist/components/overlays/TeachingPopover.mjs.map +1 -1
  377. package/dist/components/overlays/Tooltip.cjs +1 -1
  378. package/dist/components/overlays/Tooltip.cjs.map +1 -1
  379. package/dist/components/overlays/Tooltip.mjs +87 -86
  380. package/dist/components/overlays/Tooltip.mjs.map +1 -1
  381. package/dist/components/portal/Portal.cjs +1 -1
  382. package/dist/components/portal/Portal.cjs.map +1 -1
  383. package/dist/components/portal/Portal.mjs +33 -32
  384. package/dist/components/portal/Portal.mjs.map +1 -1
  385. package/dist/components/provider/WaveProvider.cjs +1 -1
  386. package/dist/components/provider/WaveProvider.cjs.map +1 -1
  387. package/dist/components/provider/WaveProvider.mjs +36 -29
  388. package/dist/components/provider/WaveProvider.mjs.map +1 -1
  389. package/dist/components/table/DataGrid.cjs +1 -1
  390. package/dist/components/table/DataGrid.cjs.map +1 -1
  391. package/dist/components/table/DataGrid.mjs +228 -227
  392. package/dist/components/table/DataGrid.mjs.map +1 -1
  393. package/dist/components/table/Table.cjs +1 -1
  394. package/dist/components/table/Table.cjs.map +1 -1
  395. package/dist/components/table/Table.mjs +60 -59
  396. package/dist/components/table/Table.mjs.map +1 -1
  397. package/dist/components/typography/Text.cjs +1 -1
  398. package/dist/components/typography/Text.cjs.map +1 -1
  399. package/dist/components/typography/Text.mjs +12 -11
  400. package/dist/components/typography/Text.mjs.map +1 -1
  401. package/dist/hooks/useFieldControl.cjs.map +1 -1
  402. package/dist/hooks/useFieldControl.mjs.map +1 -1
  403. package/dist/hooks/useMediaQuery.cjs +2 -0
  404. package/dist/hooks/useMediaQuery.cjs.map +1 -0
  405. package/dist/hooks/useMediaQuery.mjs +20 -0
  406. package/dist/hooks/useMediaQuery.mjs.map +1 -0
  407. package/dist/hooks/usePrefersReducedMotion.cjs +1 -1
  408. package/dist/hooks/usePrefersReducedMotion.cjs.map +1 -1
  409. package/dist/hooks/usePrefersReducedMotion.mjs +4 -18
  410. package/dist/hooks/usePrefersReducedMotion.mjs.map +1 -1
  411. package/dist/hooks/useRovingTabIndex.cjs +1 -1
  412. package/dist/hooks/useRovingTabIndex.cjs.map +1 -1
  413. package/dist/hooks/useRovingTabIndex.mjs +3 -3
  414. package/dist/hooks/useRovingTabIndex.mjs.map +1 -1
  415. package/dist/index.cjs +1 -1
  416. package/dist/index.d.cts +2890 -197
  417. package/dist/index.d.ts +2890 -197
  418. package/dist/index.mjs +101 -87
  419. package/dist/lib/classNames.cjs +2 -0
  420. package/dist/lib/classNames.cjs.map +1 -0
  421. package/dist/lib/classNames.mjs +423 -0
  422. package/dist/lib/classNames.mjs.map +1 -0
  423. package/dist/lib/color.cjs +2 -0
  424. package/dist/lib/color.cjs.map +1 -0
  425. package/dist/lib/color.mjs +86 -0
  426. package/dist/lib/color.mjs.map +1 -0
  427. package/dist/lib/globalRegistry.cjs.map +1 -1
  428. package/dist/lib/globalRegistry.mjs.map +1 -1
  429. package/dist/lib/styles.cjs +1 -1
  430. package/dist/lib/styles.cjs.map +1 -1
  431. package/dist/lib/styles.mjs +21 -4
  432. package/dist/lib/styles.mjs.map +1 -1
  433. package/dist/lib/toaster.cjs +2 -0
  434. package/dist/lib/toaster.cjs.map +1 -0
  435. package/dist/lib/toaster.mjs +77 -0
  436. package/dist/lib/toaster.mjs.map +1 -0
  437. package/dist/styles.css +1 -1
  438. package/package.json +1 -1
  439. package/src/styles/tokens.css +13 -0
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/cn.mjs";
3
+ import { materialiseSlotContent as t, slotRendersContent as n } from "../../lib/slot.mjs";
4
+ import { treeItemPersonaLayoutClassNames as r } from "../../lib/classNames.mjs";
5
+ import { useId as i } from "../../hooks/useId.mjs";
6
+ import { useTreeItemContext as a } from "./Tree.context.mjs";
7
+ import * as o from "react";
8
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
9
+ //#region src/components/layout/Tree.itemPersonaLayout.tsx
10
+ var l = ({ media: l, description: u, className: d, children: f, ref: p, ...m }) => {
11
+ let { registerLayout: h } = a("Tree.ItemPersonaLayout"), g = i("tree-persona-name"), _ = i("tree-persona-description"), v = n(l), y = n(u);
12
+ return o.useLayoutEffect(() => h({
13
+ nameId: g,
14
+ descriptionId: y ? _ : void 0
15
+ }), [
16
+ h,
17
+ g,
18
+ _,
19
+ y
20
+ ]), /* @__PURE__ */ c("span", {
21
+ ref: p,
22
+ className: e(r.root, "flex min-w-0 items-center gap-2", d),
23
+ ...m,
24
+ children: [v && /* @__PURE__ */ s("span", {
25
+ className: e(r.media, "inline-flex shrink-0"),
26
+ children: t(l)
27
+ }), /* @__PURE__ */ c("span", {
28
+ className: "flex min-w-0 flex-col",
29
+ children: [/* @__PURE__ */ s("span", {
30
+ id: g,
31
+ "data-tree-persona-name": "",
32
+ className: e(r.main, "truncate"),
33
+ children: f
34
+ }), y && /* @__PURE__ */ s("span", {
35
+ id: _,
36
+ className: e(r.description, "truncate text-caption-1 text-muted-foreground"),
37
+ children: t(u)
38
+ })]
39
+ })]
40
+ });
41
+ };
42
+ l.displayName = "TreeItemPersonaLayout";
43
+ //#endregion
44
+ export { l as TreeItemPersonaLayout };
45
+
46
+ //# sourceMappingURL=Tree.itemPersonaLayout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.itemPersonaLayout.mjs","names":["useId","useId$1","React","TreeItemPersonaLayout","rest","useTreeItemContext","nameId","descriptionId","hasMedia","slotRendersContent","media","hasDescription","description","registerLayout","cn","treeItemPersonaLayoutClassNames","className","materialiseSlotContent"],"sources":["../../../src/components/layout/Tree.itemPersonaLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport { treeItemPersonaLayoutClassNames } from '../../lib/classNames';\nimport { cn } from '../../lib/cn';\nimport { materialiseSlotContent, slotRendersContent } from '../../lib/slot';\nimport { useId } from '../../hooks/useId';\nimport { useTreeItemContext } from './Tree.context';\n\n/** Properties for the TreeItemPersonaLayout sub-component (Fluent's `TreeItemPersonaLayout`). */\nexport interface TreeItemPersonaLayoutProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * The person's picture, usually an Avatar (`size=\"small\"`, 32 px, fits a row). The name is shown\n * next to it, so make it decorative (`<Avatar decorative … />`).\n */\n media?: React.ReactNode;\n /** A second line under the name; it describes the item. */\n description?: React.ReactNode;\n ref?: React.Ref<HTMLSpanElement>;\n}\n\n/**\n * Lays out an item's label as a person: `media`, the name (children) and a `description` under\n * it. Use it as a Tree.Item's label content: the item is named by the name and described by the\n * description. Also exported as `TreeItemPersonaLayout` (Fluent's name; import the flat name from\n * React Server Components).\n */\nexport const TreeItemPersonaLayout = ({\n media,\n description,\n className,\n children,\n ref,\n ...rest\n}: TreeItemPersonaLayoutProps) => {\n const { registerLayout } = useTreeItemContext('Tree.ItemPersonaLayout');\n const nameId = useId('tree-persona-name');\n const descriptionId = useId('tree-persona-description');\n const hasMedia = slotRendersContent(media);\n const hasDescription = slotRendersContent(description);\n\n React.useLayoutEffect(\n () => registerLayout({ nameId, descriptionId: hasDescription ? descriptionId : undefined }),\n [registerLayout, nameId, descriptionId, hasDescription],\n );\n\n return (\n <span\n ref={ref}\n className={cn(\n treeItemPersonaLayoutClassNames.root,\n 'flex min-w-0 items-center gap-2',\n className,\n )}\n {...rest}\n >\n {hasMedia && (\n <span className={cn(treeItemPersonaLayoutClassNames.media, 'inline-flex shrink-0')}>\n {materialiseSlotContent(media)}\n </span>\n )}\n <span className=\"flex min-w-0 flex-col\">\n <span\n id={nameId}\n data-tree-persona-name=\"\"\n className={cn(treeItemPersonaLayoutClassNames.main, 'truncate')}\n >\n {children}\n </span>\n {hasDescription && (\n <span\n id={descriptionId}\n className={cn(\n treeItemPersonaLayoutClassNames.description,\n 'truncate text-caption-1 text-muted-foreground',\n )}\n >\n {materialiseSlotContent(description)}\n </span>\n )}\n </span>\n </span>\n );\n};\nTreeItemPersonaLayout.displayName = 'TreeItemPersonaLayout';\n"],"mappings":";;;;;;;;;AAyBA,IAAaG,KAAyB,EACpC,UACA,gBACA,cACA,aACA,QACA,GAAGC,QAC6B;CAChC,IAAM,EAAE,sBAAmBC,EAAmB,wBAAwB,GAChEC,IAASN,EAAM,mBAAmB,GAClCO,IAAgBP,EAAM,0BAA0B,GAChDQ,IAAWC,EAAmBC,CAAK,GACnCC,IAAiBF,EAAmBG,CAAW;CAOrD,OALAV,EAAM,sBACEW,EAAe;EAAE;EAAQ,eAAeF,IAAiBJ,IAAgB,KAAA;CAAU,CAAC,GAC1F;EAACM;EAAgBP;EAAQC;EAAeI;CAAc,CACxD,GAGE,kBAAC,QAAD;EACO;EACL,WAAWG,EACTC,EAAgC,MAChC,mCACAC,CACF;EACA,GAAIZ;EAPN,UAAA,CASGI,KACC,kBAAC,QAAD;GAAM,WAAWM,EAAGC,EAAgC,OAAO,sBAAsB;GAC9E,UAAAE,EAAuBP,CAAK;EACzB,CAAA,GAER,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,kBAAC,QAAD;IACE,IAAIJ;IACJ,0BAAuB;IACvB,WAAWQ,EAAGC,EAAgC,MAAM,UAAU;IAE7D;GACG,CAAA,GACLJ,KACC,kBAAC,QAAD;IACE,IAAIJ;IACJ,WAAWO,EACTC,EAAgC,aAChC,+CACF;IAEC,UAAAE,EAAuBL,CAAW;GAC/B,CAAA,CAEJ;EACF,CAAA,CAAA;;AAEV;AACA,EAAsB,cAAc"}
@@ -1,220 +1,12 @@
1
1
  "use client";
2
- import { cn as e } from "../../lib/cn.mjs";
3
- import { flattenChildren as t, isElementOfType as n } from "../../lib/children.mjs";
4
- import { isDev as r, reportMissingContext as i, warnOnce as a } from "../../lib/dev.mjs";
5
- import { renderSlot as o, slotRendersContent as s } from "../../lib/slot.mjs";
6
- import { composeEventHandlers as c } from "../../lib/composeEventHandlers.mjs";
7
- import { useEventCallback as l } from "../../hooks/useEventCallback.mjs";
8
- import { useControllable as u } from "../../hooks/useControllable.mjs";
9
- import { useId as d } from "../../hooks/useId.mjs";
10
- import { getDirection as f } from "../../lib/direction.mjs";
11
- import { useRovingTabIndex as p } from "../../hooks/useRovingTabIndex.mjs";
12
- import { useMergedRefs as m } from "../../hooks/useMergedRefs.mjs";
13
- import { forcedColors as h } from "../../lib/styles.mjs";
14
- import { ChevronRightIcon as g } from "../../lib/icons.mjs";
15
- import * as _ from "react";
16
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
2
+ import { TreeItem as e, TreeRoot as t } from "./Tree.core.mjs";
3
+ import { TreeItemPersonaLayout as n } from "./Tree.itemPersonaLayout.mjs";
17
4
  //#region src/components/layout/Tree.tsx
18
- var b = _.createContext(null), x = _.createContext(null), S = _.createContext(!1), C = [], w = {
19
- expanded: /* @__PURE__ */ new Set(),
20
- toggle: () => {},
21
- expand: () => {},
22
- activate: () => {},
23
- selected: void 0,
24
- current: void 0,
25
- getTabIndex: () => -1,
26
- focusValue: () => {},
27
- onItemFocus: () => {},
28
- registerValue: () => () => {}
29
- };
30
- function T(e) {
31
- return _.useContext(b) || (i(e, "<Tree>"), w);
32
- }
33
- var E = "Tree.Item was rendered inside the label of another Tree.Item, so it is not part of that item's child group: the parent cannot expand, its name includes the nested text, and a treeitem sits inside a label (axe aria-required-parent). A Tree.Item finds its nested items among its own children (written directly, in Fragments, or returned by a render function such as `children.map(renderNode)`), but not inside a component that renders Tree.Item itself. Build a data-driven tree with a render function instead of a recursive component.";
34
- function D(e) {
35
- a(`Tree:duplicate:${e}`, `Tree: several items share the value "${e}". Item values must be unique within a Tree; items with the same value share their expanded, selected and focus state.`);
36
- }
37
- var O = ({ expandedItems: t, defaultExpandedItems: n, onExpandedItemsChange: i, onItemSelect: a, selected: o, current: s, className: d, children: f, onKeyDown: h, onKeyDownCapture: g, onFocus: y, onBlur: w, ref: T, ...E }) => {
38
- let [O] = _.useState(() => n ?? C), [A, j] = u(t, O, (e) => i?.([...e])), M = _.useMemo(() => new Set(A), [A]), N = _.useCallback((e) => {
39
- j((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
40
- }, [j]), P = _.useCallback((e) => {
41
- j((t) => {
42
- let n = e.filter((e) => !t.includes(e));
43
- return n.length > 0 ? [...t, ...n] : t;
44
- });
45
- }, [j]), F = l((e) => {
46
- a?.(e);
47
- }), [I, L] = _.useState(null), R = _.useRef(null), z = _.useCallback((e) => {
48
- if (!r) return () => {};
49
- R.current ??= /* @__PURE__ */ new Map();
50
- let t = R.current, n = (t.get(e) ?? 0) + 1;
51
- return t.set(e, n), n > 1 && D(e), () => {
52
- let n = (t.get(e) ?? 1) - 1;
53
- n > 0 ? t.set(e, n) : t.delete(e);
54
- };
55
- }, []), { containerProps: B, getTabIndex: V, focusValue: H } = p({
56
- activeValue: I ?? o ?? null,
57
- orientation: "vertical",
58
- loop: !1,
59
- typeahead: !0
60
- }), U = _.useMemo(() => ({
61
- expanded: M,
62
- toggle: N,
63
- expand: P,
64
- activate: F,
65
- selected: o,
66
- current: s,
67
- getTabIndex: V,
68
- focusValue: H,
69
- onItemFocus: L,
70
- registerValue: z
71
- }), [
72
- M,
73
- N,
74
- P,
75
- F,
76
- o,
77
- s,
78
- V,
79
- H,
80
- z
81
- ]), W = m(T, B.ref), G = (e) => {
82
- e.key.length === 1 && k(e.currentTarget), B.onKeyDown(e);
83
- }, K = (e) => {
84
- e.key === " " && k(e.currentTarget), B.onKeyDownCapture(e);
85
- }, q = (e) => {
86
- let t = e.relatedTarget;
87
- (!t || !e.currentTarget.contains(t)) && L(null);
88
- };
89
- return /* @__PURE__ */ v(b.Provider, {
90
- value: U,
91
- children: /* @__PURE__ */ v(x.Provider, {
92
- value: null,
93
- children: /* @__PURE__ */ v("div", {
94
- role: "tree",
95
- className: e("text-body-1", d),
96
- ...E,
97
- "data-roving-container": "",
98
- onKeyDown: c(h, G),
99
- onKeyDownCapture: c(g, K),
100
- onFocus: c(y, B.onFocus, { checkDefaultPrevented: !1 }),
101
- onBlur: c(w, q, { checkDefaultPrevented: !1 }),
102
- ref: W,
103
- children: /* @__PURE__ */ v(S.Provider, {
104
- value: !1,
105
- children: f
106
- })
107
- })
108
- })
109
- });
110
- };
111
- O.displayName = "Tree";
112
- function k(e) {
113
- e.querySelectorAll("[role=\"treeitem\"]").forEach((e) => {
114
- let t = e.querySelector(":scope > [data-tree-row] > [data-tree-label]");
115
- if (!t) return;
116
- let n = t.getAttribute("data-roving-text") ?? t.textContent ?? "";
117
- e.getAttribute("data-roving-text") !== n && e.setAttribute("data-roving-text", n);
118
- });
119
- }
120
- function A(e) {
121
- return e.target?.closest?.("[role=\"treeitem\"]") === e.currentTarget;
122
- }
123
- function j(e) {
124
- let t = e.target;
125
- return t === e.currentTarget || t?.closest?.("[data-tree-row]")?.parentElement === e.currentTarget;
126
- }
127
- var M = ({ value: r, icon: i, leaf: l = !1, className: u, children: p, onClick: m, onKeyDown: b, onFocus: C, ref: w, ...D }) => {
128
- let { "data-roving-text": k, ...N } = D, P = T("Tree.Item"), F = _.useContext(x), I = _.useContext(S), L = P.expanded.has(r), R = d("tree-item-label"), { registerValue: z } = P;
129
- _.useEffect(() => z(r), [z, r]), _.useEffect(() => {
130
- I && a("Tree.Item:inside-label", E);
131
- }, [I]);
132
- let B = [], V = [], H;
133
- t(p).forEach(({ key: e, node: t }) => {
134
- let r = /* @__PURE__ */ v(_.Fragment, { children: t }, e);
135
- n(t, M) ? (H ??= t.props.value, B.push(r)) : n(t, O) ? B.push(r) : V.push(r);
136
- });
137
- let U = i && s(i) ? o(i, "span", "inline-flex shrink-0", { "aria-hidden": !0 }) : null, W = B.length > 0 && !l, G = P.selected === void 0 ? void 0 : P.selected === r, K = P.current !== void 0 && P.current !== null && P.current === r, q = () => {
138
- W && P.toggle(r), P.activate(r);
139
- }, J = (e) => {
140
- j(e) && (m?.(e), e.defaultPrevented || q());
141
- }, Y = (e) => {
142
- if (!A(e) || (b?.(e), e.defaultPrevented || e.altKey || e.ctrlKey || e.metaKey)) return;
143
- let t = f(e.currentTarget) === "rtl", n = t ? "ArrowLeft" : "ArrowRight", i = t ? "ArrowRight" : "ArrowLeft";
144
- switch (e.key) {
145
- case "Enter":
146
- case " ":
147
- e.preventDefault(), q();
148
- return;
149
- case n:
150
- if (e.preventDefault(), !W) return;
151
- L ? H !== void 0 && P.focusValue(H) : P.toggle(r);
152
- return;
153
- case i:
154
- e.preventDefault(), W && L ? P.toggle(r) : F !== null && P.focusValue(F);
155
- return;
156
- case "*": {
157
- e.preventDefault();
158
- let t = e.currentTarget.parentElement?.querySelectorAll(":scope > [role=\"treeitem\"][aria-expanded=\"false\"][data-roving-value]");
159
- P.expand(Array.from(t ?? [], (e) => e.getAttribute("data-roving-value") ?? "").filter(Boolean));
160
- return;
161
- }
162
- }
163
- }, X = (e) => {
164
- e.target === e.currentTarget && P.onItemFocus(r);
165
- };
166
- return /* @__PURE__ */ y("div", {
167
- role: "treeitem",
168
- "aria-selected": G,
169
- "aria-current": K ? !0 : void 0,
170
- className: e("block outline-none", "[&:focus-visible>[data-tree-row]]:outline-2 [&:focus-visible>[data-tree-row]]:-outline-offset-2 [&:focus-visible>[data-tree-row]]:outline-ring", u),
171
- ...N,
172
- "aria-labelledby": N["aria-labelledby"] ?? (N["aria-label"] === void 0 ? R : void 0),
173
- "aria-expanded": W ? L : void 0,
174
- tabIndex: P.getTabIndex(r),
175
- "data-roving-value": r,
176
- "data-selected": G ? "" : void 0,
177
- "data-current": K ? "" : void 0,
178
- onClick: J,
179
- onKeyDown: Y,
180
- onFocus: c(C, X, { checkDefaultPrevented: !1 }),
181
- ref: w,
182
- children: [/* @__PURE__ */ y("div", {
183
- "data-tree-row": "",
184
- className: e("flex cursor-pointer items-center gap-1.5 rounded px-2 py-1 hover:bg-subtle-hover", G && e("bg-subtle-selected font-semibold", h.selectedContainer)),
185
- children: [
186
- W ? /* @__PURE__ */ v(g, { className: e("shrink-0 transition-transform motion-reduce:transition-none", L ? "rotate-90" : "wave-rtl:-scale-x-100") }) : /* @__PURE__ */ v("span", {
187
- className: "w-3 shrink-0",
188
- "aria-hidden": "true"
189
- }),
190
- U,
191
- /* @__PURE__ */ v("span", {
192
- id: R,
193
- "data-tree-label": "",
194
- "data-roving-text": k,
195
- className: "truncate",
196
- children: /* @__PURE__ */ v(S.Provider, {
197
- value: !0,
198
- children: V
199
- })
200
- })
201
- ]
202
- }), W && L && /* @__PURE__ */ v(x.Provider, {
203
- value: r,
204
- children: /* @__PURE__ */ v(S.Provider, {
205
- value: !1,
206
- children: /* @__PURE__ */ v("div", {
207
- role: "group",
208
- className: "ps-4",
209
- children: B
210
- })
211
- })
212
- })]
213
- });
214
- };
215
- M.displayName = "TreeItem";
216
- var N = /* @__PURE__ */ Object.assign(O, { Item: M });
5
+ var r = /* @__PURE__ */ Object.assign(t, {
6
+ Item: e,
7
+ ItemPersonaLayout: n
8
+ });
217
9
  //#endregion
218
- export { N as Tree, M as TreeItem };
10
+ export { r as Tree, e as TreeItem, n as TreeItemPersonaLayout };
219
11
 
220
12
  //# sourceMappingURL=Tree.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tree.mjs","names":["useId","useId$1","React","TreeContext","TreeParentContext","TreeLabelContext","EMPTY","INERT_CONTEXT","useTreeContext","reportMissingContext","component","ITEM_IN_LABEL_MESSAGE","warnDuplicateValue","value","TreeRoot","rest","initialExpanded","defaultExpandedItems","expandedList","setExpandedList","useControllable","expandedItems","onExpandedItemsChange","next","expanded","toggle","prev","v","expand","added","values","activate","useEventCallback","focusedItem","setFocusedItem","valueCounts","registerValue","isDev","counts","count","remaining","useRovingTabIndex","selected","context","current","getTabIndex","focusValue","mergedRef","useMergedRefs","ref","containerProps","handleKeyDown","event","syncTypeaheadText","handleKeyDownCapture","handleBlur","cn","className","composeEventHandlers","onKeyDown","onKeyDownCapture","onFocus","onBlur","label","treeitem","text","isOwnKeyEvent","isOwnClick","target","TreeItem","props","typeaheadText","ctx","parent","insideLabel","isExpanded","labelId","warnOnce","nestedItems","labelContent","firstChildValue","children","child","keyed","key","isElementOfType","iconNode","icon","slotRendersContent","renderSlot","hasChildren","leaf","isSelected","isCurrent","handleClick","onClick","rtl","getDirection","forward","back","siblings","el","handleFocus","forcedColors","ChevronRightIcon","Tree"],"sources":["../../../src/components/layout/Tree.tsx"],"sourcesContent":["import * as React from 'react';\nimport { flattenChildren, isElementOfType } from '../../lib/children';\nimport { cn } from '../../lib/cn';\nimport { composeEventHandlers } from '../../lib/composeEventHandlers';\nimport { isDev, reportMissingContext, warnOnce } from '../../lib/dev';\nimport { getDirection } from '../../lib/direction';\nimport { ChevronRightIcon } from '../../lib/icons';\nimport { renderSlot, slotRendersContent, type Slot } from '../../lib/slot';\nimport { forcedColors } from '../../lib/styles';\nimport { useControllable } from '../../hooks/useControllable';\nimport { useEventCallback } from '../../hooks/useEventCallback';\nimport { useId } from '../../hooks/useId';\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { useRovingTabIndex } from '../../hooks/useRovingTabIndex';\n\n/* ------------------------------------------------------------------ */\n/* Contexts */\n/* ------------------------------------------------------------------ */\n\ninterface TreeContextValue {\n expanded: ReadonlySet<string>;\n toggle: (value: string) => void;\n expand: (values: readonly string[]) => void;\n activate: (value: string) => void;\n selected: string | null | undefined;\n current: string | null | undefined;\n getTabIndex: (value: string) => 0 | -1;\n focusValue: (value: string) => void;\n onItemFocus: (value: string) => void;\n /**\n * Development only: counts a mounted item's value and warns once per value that several items\n * share. Returns the unregistration.\n */\n registerValue: (value: string) => () => void;\n}\n\nconst TreeContext = React.createContext<TreeContextValue | null>(null);\n\n/** Value of the enclosing Tree.Item (`null` at the top level), for ArrowLeft → parent. */\nconst TreeParentContext = React.createContext<string | null>(null);\n\n/**\n * `true` inside the label of a Tree.Item, where a nested Tree.Item ends up when a component\n * renders it (the parent cannot see it among its children); its child group and every Tree root\n * reset it.\n */\nconst TreeLabelContext = React.createContext(false);\n\nconst EMPTY: readonly string[] = [];\n\nconst INERT_CONTEXT: TreeContextValue = {\n expanded: new Set(),\n toggle: () => {},\n expand: () => {},\n activate: () => {},\n selected: undefined,\n current: undefined,\n getTabIndex: () => -1,\n focusValue: () => {},\n onItemFocus: () => {},\n registerValue: () => () => {},\n};\n\n/** C-CONTEXT: throws in development, logs once and returns an inert value in production. */\nfunction useTreeContext(component: string): TreeContextValue {\n const context = React.useContext(TreeContext);\n if (context) return context;\n reportMissingContext(component, '<Tree>');\n return INERT_CONTEXT;\n}\n\nconst ITEM_IN_LABEL_MESSAGE =\n 'Tree.Item was rendered inside the label of another Tree.Item, so it is not part of that ' +\n \"item's child group: the parent cannot expand, its name includes the nested text, and a \" +\n 'treeitem sits inside a label (axe aria-required-parent). A Tree.Item finds its nested items ' +\n 'among its own children (written directly, in Fragments, or returned by a render function such ' +\n 'as `children.map(renderNode)`), but not inside a component that renders Tree.Item itself. ' +\n 'Build a data-driven tree with a render function instead of a recursive component.';\n\nfunction warnDuplicateValue(value: string): void {\n warnOnce(\n `Tree:duplicate:${value}`,\n `Tree: several items share the value \"${value}\". Item values must be unique within a Tree; ` +\n 'items with the same value share their expanded, selected and focus state.',\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Tree */\n/* ------------------------------------------------------------------ */\n\n/** Properties for the Tree component. */\nexport interface TreeProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Controlled list of expanded item values. */\n expandedItems?: readonly string[];\n /**\n * Item values that are expanded initially (uncontrolled).\n * @default []\n */\n defaultExpandedItems?: readonly string[];\n /** Called with the new list of expanded item values when an item expands or collapses. */\n onExpandedItemsChange?: (expandedItems: string[]) => void;\n /**\n * Called with an item's value every time it is activated (click, Enter or Space), also when the\n * same item is activated again.\n */\n onItemSelect?: (value: string) => void;\n /**\n * Value of the selected item. When set (also to `null`), every item carries `aria-selected`, and\n * the selected item is where keyboard focus enters the tree.\n */\n selected?: string | null;\n /** Value of the current item (for example the open page): it gets `aria-current=\"true\"`. */\n current?: string | null;\n /** Ref to the `role=\"tree\"` element. */\n ref?: React.Ref<HTMLDivElement>;\n}\n\nconst TreeRoot = ({\n expandedItems,\n defaultExpandedItems,\n onExpandedItemsChange,\n onItemSelect,\n selected,\n current,\n className,\n children,\n onKeyDown,\n onKeyDownCapture,\n onFocus,\n onBlur,\n ref,\n ...rest\n}: TreeProps) => {\n const [initialExpanded] = React.useState<readonly string[]>(() => defaultExpandedItems ?? EMPTY);\n const [expandedList, setExpandedList] = useControllable<readonly string[]>(\n expandedItems,\n initialExpanded,\n (next) => onExpandedItemsChange?.([...next]),\n );\n const expanded = React.useMemo(() => new Set(expandedList), [expandedList]);\n\n const toggle = React.useCallback(\n (value: string) => {\n setExpandedList((prev) =>\n prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value],\n );\n },\n [setExpandedList],\n );\n\n const expand = React.useCallback(\n (values: readonly string[]) => {\n setExpandedList((prev) => {\n const added = values.filter((v) => !prev.includes(v));\n return added.length > 0 ? [...prev, ...added] : prev;\n });\n },\n [setExpandedList],\n );\n\n const activate = useEventCallback((value: string) => {\n onItemSelect?.(value);\n });\n\n // The item that has focus while focus is inside the tree: it holds the tab stop, so Shift+Tab\n // leaves the tree. Cleared when focus leaves; the next entry goes to `selected`, else the first.\n const [focusedItem, setFocusedItem] = React.useState<string | null>(null);\n\n // How many mounted items carry each value (written from the items' effects only).\n const valueCounts = React.useRef<Map<string, number> | null>(null);\n const registerValue = React.useCallback((value: string) => {\n if (!isDev) return () => {};\n valueCounts.current ??= new Map();\n const counts = valueCounts.current;\n const count = (counts.get(value) ?? 0) + 1;\n counts.set(value, count);\n if (count > 1) warnDuplicateValue(value);\n return () => {\n const remaining = (counts.get(value) ?? 1) - 1;\n if (remaining > 0) counts.set(value, remaining);\n else counts.delete(value);\n };\n }, []);\n\n const { containerProps, getTabIndex, focusValue } = useRovingTabIndex({\n activeValue: focusedItem ?? selected ?? null,\n orientation: 'vertical',\n loop: false,\n typeahead: true,\n });\n\n const context = React.useMemo<TreeContextValue>(\n () => ({\n expanded,\n toggle,\n expand,\n activate,\n selected,\n current,\n getTabIndex,\n focusValue,\n onItemFocus: setFocusedItem,\n registerValue,\n }),\n [expanded, toggle, expand, activate, selected, current, getTabIndex, focusValue, registerValue],\n );\n\n const mergedRef = useMergedRefs<HTMLDivElement>(ref, containerProps.ref);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Typeahead reads `data-roving-text` at key time: fill it from each item's label first.\n if (event.key.length === 1) syncTypeaheadText(event.currentTarget);\n containerProps.onKeyDown(event);\n };\n\n // A Space that continues a search is typeahead too, taken before the item would activate on it.\n const handleKeyDownCapture = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === ' ') syncTypeaheadText(event.currentTarget);\n containerProps.onKeyDownCapture(event);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n const next = event.relatedTarget as Node | null;\n if (!next || !event.currentTarget.contains(next)) setFocusedItem(null);\n };\n\n return (\n <TreeContext.Provider value={context}>\n <TreeParentContext.Provider value={null}>\n <div\n role=\"tree\"\n className={cn('text-body-1', className)}\n {...rest}\n data-roving-container=\"\"\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}\n onKeyDownCapture={composeEventHandlers(onKeyDownCapture, handleKeyDownCapture)}\n onFocus={composeEventHandlers(onFocus, containerProps.onFocus, {\n checkDefaultPrevented: false,\n })}\n onBlur={composeEventHandlers(onBlur, handleBlur, { checkDefaultPrevented: false })}\n ref={mergedRef}\n >\n {/* A Tree has its own items, also when it renders inside a label (a portaled popup). */}\n <TreeLabelContext.Provider value={false}>{children}</TreeLabelContext.Provider>\n </div>\n </TreeParentContext.Provider>\n </TreeContext.Provider>\n );\n};\nTreeRoot.displayName = 'Tree';\n\n/* ------------------------------------------------------------------ */\n/* Tree.Item */\n/* ------------------------------------------------------------------ */\n\n/** Properties for the TreeItem sub-component. */\nexport interface TreeItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Unique value identifying this tree item. */\n value: string;\n /**\n * Icon displayed before the label. Rendered in a `<span>` hidden from assistive technology\n * (`aria-hidden`); pass a slot object (`{ className, children, … }`) to customise it. A falsy\n * icon (`''`, `0`) or a list of nothing renders no span.\n */\n icon?: Slot<'span'>;\n /**\n * Renders the item as a leaf even when it has nested `Tree.Item`s: they are not rendered, and\n * the item has no `aria-expanded` and does not expand. An item is expandable only while it has\n * nested items, so `leaf={false}` does not make an item without them expandable. To load the\n * children on first expansion, give the item a placeholder child (a \"Loading…\" `Tree.Item`)\n * until they arrive.\n * @default false\n */\n leaf?: boolean;\n /** Ref to the `role=\"treeitem\"` element. */\n ref?: React.Ref<HTMLDivElement>;\n}\n\n/**\n * Sets the typeahead text (`data-roving-text`, read by the roving hook) of every rendered\n * treeitem to the text of its label, so neither the icon nor the nested items take part. A\n * consumer `data-roving-text` on a Tree.Item is kept on its label and wins.\n */\nfunction syncTypeaheadText(tree: HTMLElement): void {\n tree.querySelectorAll<HTMLElement>('[role=\"treeitem\"]').forEach((treeitem) => {\n const label = treeitem.querySelector<HTMLElement>(\n ':scope > [data-tree-row] > [data-tree-label]',\n );\n if (!label) return;\n const text = label.getAttribute('data-roving-text') ?? label.textContent ?? '';\n if (treeitem.getAttribute('data-roving-text') !== text) {\n treeitem.setAttribute('data-roving-text', text);\n }\n });\n}\n\n/**\n * Whether a keyboard event belongs to this treeitem: its target (the focused element) is this\n * treeitem or inside its row, not a nested item.\n */\nfunction isOwnKeyEvent(event: React.KeyboardEvent<HTMLElement>): boolean {\n const target = event.target as Element | null;\n return target?.closest?.('[role=\"treeitem\"]') === event.currentTarget;\n}\n\n/**\n * Whether a click landed on this treeitem's own row (or on the treeitem element itself). Clicks\n * in its child group, including the indentation gutter beside the nested rows, and clicks on\n * nested items are not its own.\n */\nfunction isOwnClick(event: React.MouseEvent<HTMLElement>): boolean {\n const target = event.target as Element | null;\n if (target === event.currentTarget) return true;\n return target?.closest?.('[data-tree-row]')?.parentElement === event.currentTarget;\n}\n\n/**\n * One node of a Tree. Text and other content are the label; nested `Tree.Item` children form its\n * child group, which is shown while the item is expanded.\n *\n * Nested items must be `Tree.Item` elements among the item's own children: written directly, in\n * Fragments, or returned by a render function (`{node.children.map(renderNode)}`). A component\n * that renders `Tree.Item` itself (a recursive `<NodeView node={child} />`) is not recognised:\n * its output becomes part of the label, so the parent cannot expand (a development warning names\n * this). Render data-driven trees with a render function instead.\n *\n * `ref` and every other prop land on the `role=\"treeitem\"` element, which contains the label row\n * and the child group. Its `onClick` receives only clicks on its own row (not on its child group\n * or nested items) and its `onKeyDown` only keys pressed while focus is on it or in its row; both\n * run before the built-in behaviour (call `event.preventDefault()` to skip it). Its other event\n * handlers (`onFocus`, `onDoubleClick`, `onContextMenu` and the rest) are not filtered: as DOM\n * events bubble, they also receive events from its child group and nested items (compare\n * `event.target` with `event.currentTarget` to tell them apart).\n *\n * The item is named by its label (`aria-labelledby`), not by its icon or nested items; an\n * `aria-label` or `aria-labelledby` prop replaces that name. Typeahead matches the label text too\n * (a `data-roving-text` prop replaces it).\n */\nconst TreeItem = ({\n value,\n icon,\n leaf = false,\n className,\n children,\n onClick,\n onKeyDown,\n onFocus,\n ref,\n ...props\n}: TreeItemProps) => {\n const { 'data-roving-text': typeaheadText, ...rest } = props as typeof props & {\n 'data-roving-text'?: string;\n };\n const ctx = useTreeContext('Tree.Item');\n const parent = React.useContext(TreeParentContext);\n const insideLabel = React.useContext(TreeLabelContext);\n const isExpanded = ctx.expanded.has(value);\n const labelId = useId('tree-item-label');\n\n const { registerValue } = ctx;\n React.useEffect(() => registerValue(value), [registerValue, value]);\n React.useEffect(() => {\n if (insideLabel) warnOnce('Tree.Item:inside-label', ITEM_IN_LABEL_MESSAGE);\n }, [insideLabel]);\n\n // Nested Tree.Items (and, as in 0.4, nested Trees) form the child group; the rest is the label.\n // Parts are identified through their element type, so parts written in a Server Component\n // (lazy references) count too.\n const nestedItems: React.ReactNode[] = [];\n const labelContent: React.ReactNode[] = [];\n let firstChildValue: string | undefined;\n flattenChildren(children).forEach(({ key, node: child }) => {\n const keyed = <React.Fragment key={key}>{child}</React.Fragment>;\n if (isElementOfType<TreeItemProps>(child, TreeItem)) {\n firstChildValue ??= child.props.value;\n nestedItems.push(keyed);\n } else if (isElementOfType(child, TreeRoot)) {\n nestedItems.push(keyed);\n } else {\n labelContent.push(keyed);\n }\n });\n\n // A falsy icon (`icon={name && <Icon />}` with `name` '' or a count of 0) is no icon, as in 0.4\n // and as in Avatar, and so is a collection whose items render nothing: no empty span adds a gap\n // to the row. The check does not consume a generator: renderSlot still renders its items.\n const iconNode =\n icon && slotRendersContent(icon)\n ? renderSlot(icon, 'span', 'inline-flex shrink-0', { 'aria-hidden': true })\n : null;\n const hasChildren = nestedItems.length > 0 && !leaf;\n const isSelected = ctx.selected !== undefined ? ctx.selected === value : undefined;\n const isCurrent = ctx.current !== undefined && ctx.current !== null && ctx.current === value;\n\n const activate = () => {\n if (hasChildren) ctx.toggle(value);\n ctx.activate(value);\n };\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!isOwnClick(event)) return;\n onClick?.(event);\n if (!event.defaultPrevented) activate();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isOwnKeyEvent(event)) return;\n onKeyDown?.(event);\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) return;\n\n const rtl = getDirection(event.currentTarget) === 'rtl';\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n activate();\n return;\n case forward:\n event.preventDefault();\n if (!hasChildren) return;\n if (!isExpanded) ctx.toggle(value);\n else if (firstChildValue !== undefined) ctx.focusValue(firstChildValue);\n return;\n case back:\n event.preventDefault();\n if (hasChildren && isExpanded) ctx.toggle(value);\n else if (parent !== null) ctx.focusValue(parent);\n return;\n case '*': {\n event.preventDefault();\n const siblings = event.currentTarget.parentElement?.querySelectorAll<HTMLElement>(\n ':scope > [role=\"treeitem\"][aria-expanded=\"false\"][data-roving-value]',\n );\n ctx.expand(\n Array.from(siblings ?? [], (el) => el.getAttribute('data-roving-value') ?? '').filter(\n Boolean,\n ),\n );\n return;\n }\n default:\n }\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLDivElement>) => {\n if (event.target === event.currentTarget) ctx.onItemFocus(value);\n };\n\n return (\n <div\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-current={isCurrent ? true : undefined}\n className={cn(\n // The focus ring is drawn on the row: an outline on the treeitem would surround its\n // whole subtree.\n 'block outline-none',\n '[&:focus-visible>[data-tree-row]]:outline-2 [&:focus-visible>[data-tree-row]]:-outline-offset-2 [&:focus-visible>[data-tree-row]]:outline-ring',\n className,\n )}\n {...rest}\n // Named by its label only: the treeitem also contains its icon and its child group. A\n // consumer aria-labelledby or aria-label replaces it.\n aria-labelledby={\n rest['aria-labelledby'] ?? (rest['aria-label'] === undefined ? labelId : undefined)\n }\n aria-expanded={hasChildren ? isExpanded : undefined}\n tabIndex={ctx.getTabIndex(value)}\n data-roving-value={value}\n data-selected={isSelected ? '' : undefined}\n data-current={isCurrent ? '' : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onFocus={composeEventHandlers(onFocus, handleFocus, { checkDefaultPrevented: false })}\n ref={ref}\n >\n <div\n data-tree-row=\"\"\n className={cn(\n 'flex cursor-pointer items-center gap-1.5 rounded px-2 py-1 hover:bg-subtle-hover',\n isSelected && cn('bg-subtle-selected font-semibold', forcedColors.selectedContainer),\n )}\n >\n {hasChildren ? (\n <ChevronRightIcon\n className={cn(\n 'shrink-0 transition-transform motion-reduce:transition-none',\n isExpanded ? 'rotate-90' : 'wave-rtl:-scale-x-100',\n )}\n />\n ) : (\n <span className=\"w-3 shrink-0\" aria-hidden=\"true\" />\n )}\n {iconNode}\n <span id={labelId} data-tree-label=\"\" data-roving-text={typeaheadText} className=\"truncate\">\n <TreeLabelContext.Provider value>{labelContent}</TreeLabelContext.Provider>\n </span>\n </div>\n {hasChildren && isExpanded && (\n <TreeParentContext.Provider value={value}>\n <TreeLabelContext.Provider value={false}>\n <div role=\"group\" className=\"ps-4\">\n {nestedItems}\n </div>\n </TreeLabelContext.Provider>\n </TreeParentContext.Provider>\n )}\n </div>\n );\n};\nTreeItem.displayName = 'TreeItem';\n\n/* ------------------------------------------------------------------ */\n/* Export */\n/* ------------------------------------------------------------------ */\n\n/**\n * A hierarchical list (WAI-ARIA Tree View pattern) with a single tab stop: Up/Down move between\n * visible items, Home/End to the first/last, Right expands or moves to the first child, Left\n * collapses or moves to the parent (both mirrored in RTL), Enter/Space activate (and toggle a\n * parent), `*` expands the siblings, and typing jumps to an item by its text.\n *\n * Keyboard focus enters at the `selected` item, else the first item; while focus is inside, the\n * tab stop follows it, so Shift+Tab leaves the tree.\n *\n * Items are `Tree.Item` elements; nested items are written in their parent's children (directly,\n * in Fragments, or returned by a render function), not rendered by a component of their own.\n * Every item needs a `value` that is unique within the Tree.\n *\n * `Tree.Item` is also exported as `TreeItem` for React Server Components, which cannot use the\n * dotted form.\n */\nexport const Tree = /* @__PURE__ */ Object.assign(TreeRoot, {\n Item: TreeItem,\n});\n\nexport { TreeItem };\n"],"mappings":"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"}
1
+ {"version":3,"file":"Tree.mjs","names":["Tree","TreeRoot","TreeItem","TreeItemPersonaLayout"],"sources":["../../../src/components/layout/Tree.tsx"],"sourcesContent":["import { TreeItem, TreeRoot } from './Tree.core';\nimport { TreeItemPersonaLayout } from './Tree.itemPersonaLayout';\n\nexport type { TreeCheckedItemsChangeDetails, TreeItemProps, TreeProps } from './Tree.core';\nexport type { TreeItemPersonaLayoutProps } from './Tree.itemPersonaLayout';\n\n/**\n * A hierarchical list (WAI-ARIA Tree View pattern) with a single tab stop: Up/Down move between\n * visible items, Home/End to the first/last, Right expands or moves to the first child (or into\n * the row's actions, see below), Left collapses or moves to the parent (both mirrored in RTL),\n * Enter activates (and toggles a parent), and so does Space unless the tree has checkboxes, `*`\n * expands the siblings, and typing jumps to an item by its text.\n *\n * Keyboard focus enters at the `selected` item, else the first item; while focus is inside, the\n * tab stop follows it, so Shift+Tab leaves the tree.\n *\n * `selectionMode=\"multiple\"` draws a checkbox on every item, bound to `checkedItems`: Space\n * toggles the focused item's check, a click on the checkbox toggles it, and a click elsewhere on\n * the row activates the item (as Enter does). Checks cascade: checking an item checks every item\n * nested in it, and an item shows checked when all of its nested items are checked, mixed when\n * some are. `onCheckedItemsChange` receives every checked item in tree order (fully checked parents\n * included), followed by listed values that match no item, and `details` (`value`, `checked`,\n * `event`).\n *\n * Row content: `actions` (buttons at the end of the row, in a toolbar named by the item, shown on\n * hover and focus, and always where there is no hover or colors are forced), `aside` (a count or a\n * badge that describes the item), `iconAfter` and `expandIcon`. Tab from the focused item enters\n * its actions and Shift+Tab returns. Keys and clicks on the actions never activate or check the\n * item. With `navigationMode=\"treegrid\"`, Right (Left in right-to-left layouts) moves from an\n * item into its actions and Left returns, the actions take no Tab stop, and on an open parent Right\n * moves into its actions rather than to its first child (Down does); the roles stay `tree` and\n * `treeitem`.\n *\n * Items are `Tree.Item` elements; nested items are written in their parent's children (directly,\n * in Fragments, or returned by a render function), not rendered by a component of their own.\n * Every item needs a `value` that is unique within the Tree. `Tree.ItemPersonaLayout` lays out a\n * person (media, name and description) as an item's label.\n *\n * `Tree.Item` and `Tree.ItemPersonaLayout` are also exported as `TreeItem` and\n * `TreeItemPersonaLayout` for React Server Components, which cannot use the dotted form.\n */\nexport const Tree = /* @__PURE__ */ Object.assign(TreeRoot, {\n Item: TreeItem,\n ItemPersonaLayout: TreeItemPersonaLayout,\n});\n\nexport { TreeItem, TreeItemPersonaLayout };\n"],"mappings":";;;;AAyCA,IAAaA,IAAuB,uBAAO,OAAOC,GAAU;CAC1D,MAAMC;CACN,mBAAmBC;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/children.cjs");let n=require("react");n=e.__toESM(n,1);function r(e,i){let a=[];for(let o of n.Children.toArray(e)){if(!n.isValidElement(o))continue;let e=t.getElementType(o,{suspend:!1});if(e===n.Fragment){a.push(...r(o.props.children,i));continue}if(e===i.tree||e!==i.item)continue;let{value:s,leaf:c,children:l}=o.props;typeof s==`string`&&a.push({value:s,children:c===!0?[]:r(l,i)})}return a}function i(e,t){for(let n of e)t(n),i(n.children,t)}function a(e,t){for(let n of e){if(n.value===t)return[n];let e=a(n.children,t);if(e)return[n,...e]}return null}function o(e,t,n=!1){let r=new Map;i(e,e=>{r.has(e.value)||r.set(e.value,e)});let a=new Map,o=(e,n)=>{let i=n||t.has(e.value),s=e.children.map(e=>o(e,i)),c;return c=i?`checked`:s.length===0?`unchecked`:s.every(e=>e===`checked`)?`checked`:s.some(e=>e!==`unchecked`)?`mixed`:`unchecked`,r.get(e.value)===e&&a.set(e.value,c),c};for(let t of e)o(t,n);return a}function s(e,t,n){let r=o(e,new Set(t)),s=new Set;for(let[e,t]of r)t===`checked`&&s.add(e);let c=new Set;i(e,e=>c.add(e.value));let l=Array.from(new Set(t.filter(e=>!c.has(e)))),u=a(e,n);if(u){let e=u[u.length-1],t=r.get(n)!==`checked`;i([e],e=>{t?s.add(e.value):s.delete(e.value)});for(let e=u.length-2;e>=0;--e){let t=u[e];t.children.every(e=>s.has(e.value))?s.add(t.value):s.delete(t.value)}}else{let e=l.indexOf(n);e===-1?l.push(n):l.splice(e,1)}let d=[],f=new Set;return i(e,e=>{s.has(e.value)&&!f.has(e.value)&&(f.add(e.value),d.push(e.value))}),[...d,...l]}exports.collectItems=r,exports.computeCheckStates=o,exports.toggleCheck=s;
2
+ //# sourceMappingURL=Tree.selection.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.selection.cjs","names":["React","getElementType","require_runtime","require_children","react","collectItems","nodes","node","children","type","types","nested","value","leaf","forEachNode","visit","findPath","below","computeCheckStates","first","candidate","states","forced","forcedAbove","listed","current","childStates","child","state","childState","top","ancestorListed","toggleCheck","checked","itemValue","known","unmatched","listedValue","path","target","turnOn","index","ancestor","at","ordered","seen"],"sources":["../../../src/components/layout/Tree.selection.ts"],"sourcesContent":["import * as React from 'react';\nimport { getElementType } from '../../lib/children';\n\n/** One Tree.Item of the cascade model: its value and the items nested in it. */\nexport interface TreeNode {\n value: string;\n children: TreeNode[];\n}\n\n/** The check state of an item in a `selectionMode=\"multiple\"` tree. */\nexport type CheckState = 'checked' | 'mixed' | 'unchecked';\n\n/** The element types the scan compares with: the item type, and the tree type (a tree of its own). */\nexport interface TreeElementTypes {\n item: unknown;\n tree: unknown;\n}\n\ninterface ItemElementProps {\n value?: unknown;\n leaf?: unknown;\n children?: React.ReactNode;\n}\n\n/**\n * The Tree.Item elements among `children`, recursively and in element order: the rule that forms\n * an item's child group (items written directly, in Fragments, or returned by a render function),\n * so the items of a collapsed item count too. A `leaf` item has none; a nested tree is a tree of\n * its own; any other element is not entered (an item that a component renders is not part of a\n * child group). A lazy type whose code is still loading is skipped instead of suspending the\n * caller (`getElementType(…, { suspend: false })`, as walks deeper than the direct children do).\n */\nexport function collectItems(children: React.ReactNode, types: TreeElementTypes): TreeNode[] {\n const nodes: TreeNode[] = [];\n for (const node of React.Children.toArray(children)) {\n if (!React.isValidElement<ItemElementProps>(node)) continue;\n const type = getElementType(node, { suspend: false });\n if (type === React.Fragment) {\n // Flattened here rather than through `flattenChildren`, which resolves lazy types with\n // suspending: a Fragment's items belong to the enclosing group.\n nodes.push(...collectItems(node.props.children, types));\n continue;\n }\n if (type === types.tree || type !== types.item) continue;\n const { value, leaf, children: nested } = node.props;\n if (typeof value !== 'string') continue;\n nodes.push({ value, children: leaf === true ? [] : collectItems(nested, types) });\n }\n return nodes;\n}\n\nfunction forEachNode(nodes: readonly TreeNode[], visit: (node: TreeNode) => void): void {\n for (const node of nodes) {\n visit(node);\n forEachNode(node.children, visit);\n }\n}\n\n/** The first item with `value` in tree order and its ancestors, from the top down; `null` if none. */\nfunction findPath(nodes: readonly TreeNode[], value: string): TreeNode[] | null {\n for (const node of nodes) {\n if (node.value === value) return [node];\n const below = findPath(node.children, value);\n if (below) return [node, ...below];\n }\n return null;\n}\n\n/**\n * The check state of every item: checked when its value is listed, when an ancestor's value is\n * listed (or `ancestorListed`), or when it has nested items and all of them are checked; mixed\n * when some of them are checked or mixed; else unchecked. For a value that several items share,\n * the first item in tree order decides the entry.\n */\nexport function computeCheckStates(\n nodes: readonly TreeNode[],\n listed: ReadonlySet<string>,\n ancestorListed = false,\n): Map<string, CheckState> {\n const first = new Map<string, TreeNode>();\n forEachNode(nodes, (candidate) => {\n if (!first.has(candidate.value)) first.set(candidate.value, candidate);\n });\n const states = new Map<string, CheckState>();\n const visit = (current: TreeNode, forcedAbove: boolean): CheckState => {\n const forced = forcedAbove || listed.has(current.value);\n const childStates = current.children.map((child) => visit(child, forced));\n let state: CheckState;\n if (forced) state = 'checked';\n else if (childStates.length === 0) state = 'unchecked';\n else if (childStates.every((childState) => childState === 'checked')) state = 'checked';\n else if (childStates.some((childState) => childState !== 'unchecked')) state = 'mixed';\n else state = 'unchecked';\n if (first.get(current.value) === current) states.set(current.value, state);\n return state;\n };\n for (const top of nodes) visit(top, ancestorListed);\n return states;\n}\n\n/**\n * The checked items after toggling `value`. A checked item and every item nested in it become\n * unchecked; an unchecked or mixed one and every item nested in it become checked; its ancestors\n * then follow their nested items. Returns every checked item in tree order (fully checked parents\n * included, mixed ones not), each value once, followed by the listed values that match no item,\n * in their order; a value that no item has is added to, or removed from, those.\n */\nexport function toggleCheck(\n nodes: readonly TreeNode[],\n listed: readonly string[],\n value: string,\n): string[] {\n const states = computeCheckStates(nodes, new Set(listed));\n const checked = new Set<string>();\n for (const [itemValue, state] of states) {\n if (state === 'checked') checked.add(itemValue);\n }\n const known = new Set<string>();\n forEachNode(nodes, (candidate) => known.add(candidate.value));\n const unmatched = Array.from(new Set(listed.filter((listedValue) => !known.has(listedValue))));\n\n const path = findPath(nodes, value);\n if (path) {\n const target = path[path.length - 1];\n const turnOn = states.get(value) !== 'checked';\n forEachNode([target], (candidate) => {\n if (turnOn) checked.add(candidate.value);\n else checked.delete(candidate.value);\n });\n for (let index = path.length - 2; index >= 0; index -= 1) {\n const ancestor = path[index];\n if (ancestor.children.every((child) => checked.has(child.value))) checked.add(ancestor.value);\n else checked.delete(ancestor.value);\n }\n } else {\n const at = unmatched.indexOf(value);\n if (at === -1) unmatched.push(value);\n else unmatched.splice(at, 1);\n }\n\n const ordered: string[] = [];\n const seen = new Set<string>();\n forEachNode(nodes, (candidate) => {\n if (checked.has(candidate.value) && !seen.has(candidate.value)) {\n seen.add(candidate.value);\n ordered.push(candidate.value);\n }\n });\n return [...ordered, ...unmatched];\n}\n"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ "use client";
2
+ import { getElementType as e } from "../../lib/children.mjs";
3
+ import * as t from "react";
4
+ //#region src/components/layout/Tree.selection.ts
5
+ function n(r, i) {
6
+ let a = [];
7
+ for (let o of t.Children.toArray(r)) {
8
+ if (!t.isValidElement(o)) continue;
9
+ let r = e(o, { suspend: !1 });
10
+ if (r === t.Fragment) {
11
+ a.push(...n(o.props.children, i));
12
+ continue;
13
+ }
14
+ if (r === i.tree || r !== i.item) continue;
15
+ let { value: s, leaf: c, children: l } = o.props;
16
+ typeof s == "string" && a.push({
17
+ value: s,
18
+ children: c === !0 ? [] : n(l, i)
19
+ });
20
+ }
21
+ return a;
22
+ }
23
+ function r(e, t) {
24
+ for (let n of e) t(n), r(n.children, t);
25
+ }
26
+ function i(e, t) {
27
+ for (let n of e) {
28
+ if (n.value === t) return [n];
29
+ let e = i(n.children, t);
30
+ if (e) return [n, ...e];
31
+ }
32
+ return null;
33
+ }
34
+ function a(e, t, n = !1) {
35
+ let i = /* @__PURE__ */ new Map();
36
+ r(e, (e) => {
37
+ i.has(e.value) || i.set(e.value, e);
38
+ });
39
+ let a = /* @__PURE__ */ new Map(), o = (e, n) => {
40
+ let r = n || t.has(e.value), s = e.children.map((e) => o(e, r)), c;
41
+ return c = r ? "checked" : s.length === 0 ? "unchecked" : s.every((e) => e === "checked") ? "checked" : s.some((e) => e !== "unchecked") ? "mixed" : "unchecked", i.get(e.value) === e && a.set(e.value, c), c;
42
+ };
43
+ for (let t of e) o(t, n);
44
+ return a;
45
+ }
46
+ function o(e, t, n) {
47
+ let o = a(e, new Set(t)), s = /* @__PURE__ */ new Set();
48
+ for (let [e, t] of o) t === "checked" && s.add(e);
49
+ let c = /* @__PURE__ */ new Set();
50
+ r(e, (e) => c.add(e.value));
51
+ let l = Array.from(new Set(t.filter((e) => !c.has(e)))), u = i(e, n);
52
+ if (u) {
53
+ let e = u[u.length - 1], t = o.get(n) !== "checked";
54
+ r([e], (e) => {
55
+ t ? s.add(e.value) : s.delete(e.value);
56
+ });
57
+ for (let e = u.length - 2; e >= 0; --e) {
58
+ let t = u[e];
59
+ t.children.every((e) => s.has(e.value)) ? s.add(t.value) : s.delete(t.value);
60
+ }
61
+ } else {
62
+ let e = l.indexOf(n);
63
+ e === -1 ? l.push(n) : l.splice(e, 1);
64
+ }
65
+ let d = [], f = /* @__PURE__ */ new Set();
66
+ return r(e, (e) => {
67
+ s.has(e.value) && !f.has(e.value) && (f.add(e.value), d.push(e.value));
68
+ }), [...d, ...l];
69
+ }
70
+ //#endregion
71
+ export { n as collectItems, a as computeCheckStates, o as toggleCheck };
72
+
73
+ //# sourceMappingURL=Tree.selection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tree.selection.mjs","names":["React","collectItems","nodes","node","children","type","getElementType","types","nested","value","leaf","forEachNode","visit","findPath","below","computeCheckStates","first","candidate","states","forced","forcedAbove","listed","current","childStates","child","state","childState","top","ancestorListed","toggleCheck","checked","itemValue","known","unmatched","listedValue","path","target","turnOn","index","ancestor","at","ordered","seen"],"sources":["../../../src/components/layout/Tree.selection.ts"],"sourcesContent":["import * as React from 'react';\nimport { getElementType } from '../../lib/children';\n\n/** One Tree.Item of the cascade model: its value and the items nested in it. */\nexport interface TreeNode {\n value: string;\n children: TreeNode[];\n}\n\n/** The check state of an item in a `selectionMode=\"multiple\"` tree. */\nexport type CheckState = 'checked' | 'mixed' | 'unchecked';\n\n/** The element types the scan compares with: the item type, and the tree type (a tree of its own). */\nexport interface TreeElementTypes {\n item: unknown;\n tree: unknown;\n}\n\ninterface ItemElementProps {\n value?: unknown;\n leaf?: unknown;\n children?: React.ReactNode;\n}\n\n/**\n * The Tree.Item elements among `children`, recursively and in element order: the rule that forms\n * an item's child group (items written directly, in Fragments, or returned by a render function),\n * so the items of a collapsed item count too. A `leaf` item has none; a nested tree is a tree of\n * its own; any other element is not entered (an item that a component renders is not part of a\n * child group). A lazy type whose code is still loading is skipped instead of suspending the\n * caller (`getElementType(…, { suspend: false })`, as walks deeper than the direct children do).\n */\nexport function collectItems(children: React.ReactNode, types: TreeElementTypes): TreeNode[] {\n const nodes: TreeNode[] = [];\n for (const node of React.Children.toArray(children)) {\n if (!React.isValidElement<ItemElementProps>(node)) continue;\n const type = getElementType(node, { suspend: false });\n if (type === React.Fragment) {\n // Flattened here rather than through `flattenChildren`, which resolves lazy types with\n // suspending: a Fragment's items belong to the enclosing group.\n nodes.push(...collectItems(node.props.children, types));\n continue;\n }\n if (type === types.tree || type !== types.item) continue;\n const { value, leaf, children: nested } = node.props;\n if (typeof value !== 'string') continue;\n nodes.push({ value, children: leaf === true ? [] : collectItems(nested, types) });\n }\n return nodes;\n}\n\nfunction forEachNode(nodes: readonly TreeNode[], visit: (node: TreeNode) => void): void {\n for (const node of nodes) {\n visit(node);\n forEachNode(node.children, visit);\n }\n}\n\n/** The first item with `value` in tree order and its ancestors, from the top down; `null` if none. */\nfunction findPath(nodes: readonly TreeNode[], value: string): TreeNode[] | null {\n for (const node of nodes) {\n if (node.value === value) return [node];\n const below = findPath(node.children, value);\n if (below) return [node, ...below];\n }\n return null;\n}\n\n/**\n * The check state of every item: checked when its value is listed, when an ancestor's value is\n * listed (or `ancestorListed`), or when it has nested items and all of them are checked; mixed\n * when some of them are checked or mixed; else unchecked. For a value that several items share,\n * the first item in tree order decides the entry.\n */\nexport function computeCheckStates(\n nodes: readonly TreeNode[],\n listed: ReadonlySet<string>,\n ancestorListed = false,\n): Map<string, CheckState> {\n const first = new Map<string, TreeNode>();\n forEachNode(nodes, (candidate) => {\n if (!first.has(candidate.value)) first.set(candidate.value, candidate);\n });\n const states = new Map<string, CheckState>();\n const visit = (current: TreeNode, forcedAbove: boolean): CheckState => {\n const forced = forcedAbove || listed.has(current.value);\n const childStates = current.children.map((child) => visit(child, forced));\n let state: CheckState;\n if (forced) state = 'checked';\n else if (childStates.length === 0) state = 'unchecked';\n else if (childStates.every((childState) => childState === 'checked')) state = 'checked';\n else if (childStates.some((childState) => childState !== 'unchecked')) state = 'mixed';\n else state = 'unchecked';\n if (first.get(current.value) === current) states.set(current.value, state);\n return state;\n };\n for (const top of nodes) visit(top, ancestorListed);\n return states;\n}\n\n/**\n * The checked items after toggling `value`. A checked item and every item nested in it become\n * unchecked; an unchecked or mixed one and every item nested in it become checked; its ancestors\n * then follow their nested items. Returns every checked item in tree order (fully checked parents\n * included, mixed ones not), each value once, followed by the listed values that match no item,\n * in their order; a value that no item has is added to, or removed from, those.\n */\nexport function toggleCheck(\n nodes: readonly TreeNode[],\n listed: readonly string[],\n value: string,\n): string[] {\n const states = computeCheckStates(nodes, new Set(listed));\n const checked = new Set<string>();\n for (const [itemValue, state] of states) {\n if (state === 'checked') checked.add(itemValue);\n }\n const known = new Set<string>();\n forEachNode(nodes, (candidate) => known.add(candidate.value));\n const unmatched = Array.from(new Set(listed.filter((listedValue) => !known.has(listedValue))));\n\n const path = findPath(nodes, value);\n if (path) {\n const target = path[path.length - 1];\n const turnOn = states.get(value) !== 'checked';\n forEachNode([target], (candidate) => {\n if (turnOn) checked.add(candidate.value);\n else checked.delete(candidate.value);\n });\n for (let index = path.length - 2; index >= 0; index -= 1) {\n const ancestor = path[index];\n if (ancestor.children.every((child) => checked.has(child.value))) checked.add(ancestor.value);\n else checked.delete(ancestor.value);\n }\n } else {\n const at = unmatched.indexOf(value);\n if (at === -1) unmatched.push(value);\n else unmatched.splice(at, 1);\n }\n\n const ordered: string[] = [];\n const seen = new Set<string>();\n forEachNode(nodes, (candidate) => {\n if (checked.has(candidate.value) && !seen.has(candidate.value)) {\n seen.add(candidate.value);\n ordered.push(candidate.value);\n }\n });\n return [...ordered, ...unmatched];\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/children.cjs"),r=require("../../lib/dev.cjs"),i=require("../../lib/slot.cjs"),a=require("../../lib/aria.cjs"),o=require("../../lib/styles.cjs"),s=require("../../lib/icons.cjs"),c=require("../../hooks/useTriggerElement.cjs");let l=require("react");l=e.__toESM(l,1);let u=require("react/jsx-runtime");var d=t.cn(`inline-flex cursor-pointer items-center text-primary no-underline not-disabled:not-aria-disabled:hover:underline`,o.focusRing,o.disabledStyles),f=`inline-flex items-center font-semibold text-foreground`,p=t.cn(f,o.focusRing,o.disabledStyles),m=`inline-flex items-center text-foreground`,h=new Set([`rel`,...Object.keys({disabled:!0,type:!0,form:!0,formAction:!0,formEncType:!0,formMethod:!0,formNoValidate:!0,formTarget:!0,name:!0,value:!0,target:!0,download:!0,hrefLang:!0,ping:!0,media:!0,referrerPolicy:!0})]);function g(e){let t={};for(let n of Object.keys(e))h.has(n)||(t[n]=e[n]);return t}var _=({children:e,className:t,ref:r,...i})=>{let a=n.flattenChildren(e);return(0,u.jsx)(`nav`,{ref:r,"aria-label":`Breadcrumb`,...i,className:t,children:(0,u.jsx)(`ol`,{className:`m-0 flex list-none items-center gap-1 p-0 text-body-1`,children:a.map(({key:e,node:t},n)=>(0,u.jsxs)(`li`,{className:`flex items-center gap-1`,children:[n>0&&(0,u.jsx)(s.ChevronRightIcon,{"data-wave-breadcrumb-separator":``,className:`shrink-0 text-muted-foreground wave-rtl:-scale-x-100`}),t]},e))})})};_.displayName=`Breadcrumb`;function v(e){let t=n.isElementOfType(e,`a`)?{href:void 0,role:`link`,disabled:void 0}:void 0;return l.cloneElement(e,{...t,"aria-disabled":!0,tabIndex:-1,onClick:void 0})}function y({child:e,icon:t,...n}){let r=t?l.cloneElement(e,void 0,t,e.props.children):e,i=c.useTriggerElement(r,n,{componentName:`Breadcrumb.Item`});return(0,u.jsx)(u.Fragment,{children:i})}function b(e){let{href:n,current:o=!1,icon:s,asChild:c=!1,children:h,className:_,onClick:b,ref:x,...S}=e,C=s&&i.slotRendersContent(s)?i.renderSlot(s,`span`,`me-1 inline-flex shrink-0`,{"aria-hidden":!0}):null,w=c&&l.isValidElement(h)?h:null,T=w?`child`:o?`current`:n===void 0?b?`button`:`text`:`link`,E=c&&w===null,D=S.disabled===!0&&(T===`text`||T===`current`),O=S[`aria-disabled`],k=w?.props??{},A=[S.disabled,O,k.disabled,k[`aria-disabled`]].some(e=>e===!0||e===`true`);if(l.useEffect(()=>{E&&r.warnOnce(`Breadcrumb.Item:asChild`,"Breadcrumb.Item: `asChild` expects a single element child (e.g. a router link); the item was rendered normally instead."),T===`text`&&r.warnOnce(`Breadcrumb.Item:no-href`,"Breadcrumb.Item: a non-current item without `href` or `onClick` renders as plain text, not a link. Pass `href` (or `onClick`, which renders a button) to make it navigable."),D&&r.warnOnce(`Breadcrumb.Item:disabled`,"Breadcrumb.Item: `disabled` applies to link, button and asChild items; it is ignored on a text or current item.")},[E,T,D]),w){let{disabled:e,...r}=S,i=n!==void 0&&!A?{href:n}:void 0;return(0,u.jsx)(y,{...r,...i,ref:x,onClick:a.preventIfDisabled(A,b),"aria-current":o?`page`:void 0,className:t.cn(o?p:d,_),icon:C,child:A?v(w):w})}if(T===`current`)return(0,u.jsxs)(`span`,{...g(S),ref:x,"aria-current":`page`,onClick:b,className:t.cn(f,_),children:[C,h]});if(T===`link`){let{disabled:e,...r}=S;return(0,u.jsxs)(`a`,{...r,ref:x,href:A?void 0:n,role:A?`link`:r.role,"aria-disabled":A?!0:O,tabIndex:A?-1:r.tabIndex,onClick:a.preventIfDisabled(A,b),className:t.cn(d,_),children:[C,h]})}if(T===`button`){let{rel:e,...n}=S;return(0,u.jsxs)(`button`,{type:`button`,...n,ref:x,onClick:b,className:t.cn(d,_),children:[C,h]})}return(0,u.jsxs)(`span`,{...g(S),ref:x,className:t.cn(m,_),children:[C,h]})}b.displayName=`BreadcrumbItem`;var x=Object.assign(_,{Item:b});exports.Breadcrumb=x,exports.BreadcrumbItem=b;
1
+ "use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/children.cjs"),r=require("../../lib/dev.cjs"),i=require("../../lib/slot.cjs"),a=require("../../lib/classNames.cjs"),o=require("../../lib/aria.cjs"),s=require("../../lib/styles.cjs"),c=require("../../lib/icons.cjs"),l=require("../../hooks/useTriggerElement.cjs");let u=require("react");u=e.__toESM(u,1);let d=require("react/jsx-runtime");var f=t.cn(`inline-flex cursor-pointer items-center text-primary no-underline not-disabled:not-aria-disabled:hover:underline`,s.focusRing,s.disabledStyles),p=`inline-flex items-center font-semibold text-foreground`,m=t.cn(p,s.focusRing,s.disabledStyles),h=`inline-flex items-center text-foreground`,g=new Set([`rel`,...Object.keys({disabled:!0,type:!0,form:!0,formAction:!0,formEncType:!0,formMethod:!0,formNoValidate:!0,formTarget:!0,name:!0,value:!0,target:!0,download:!0,hrefLang:!0,ping:!0,media:!0,referrerPolicy:!0})]);function _(e){let t={};for(let n of Object.keys(e))g.has(n)||(t[n]=e[n]);return t}var v=({children:e,className:r,ref:i,...o})=>{let s=n.flattenChildren(e);return(0,d.jsx)(`nav`,{ref:i,"aria-label":`Breadcrumb`,...o,className:t.cn(a.breadcrumbClassNames.root,r),children:(0,d.jsx)(`ol`,{className:t.cn(a.breadcrumbClassNames.list,`m-0 flex list-none items-center gap-1 p-0 text-body-1`),children:s.map(({key:e,node:n},r)=>(0,d.jsxs)(`li`,{className:t.cn(a.breadcrumbClassNames.listItem,`flex items-center gap-1`),children:[r>0&&(0,d.jsx)(c.ChevronRightIcon,{"data-wave-breadcrumb-separator":``,className:t.cn(a.breadcrumbClassNames.divider,`shrink-0 text-muted-foreground wave-rtl:-scale-x-100`)}),n]},e))})})};v.displayName=`Breadcrumb`;function y(e){let t=n.isElementOfType(e,`a`)?{href:void 0,role:`link`,disabled:void 0}:void 0;return u.cloneElement(e,{...t,"aria-disabled":!0,tabIndex:-1,onClick:void 0})}function b({child:e,icon:t,...n}){let r=t?u.cloneElement(e,void 0,t,e.props.children):e,i=l.useTriggerElement(r,n,{componentName:`Breadcrumb.Item`});return(0,d.jsx)(d.Fragment,{children:i})}function x(e){let{href:n,current:s=!1,icon:c,asChild:l=!1,children:g,className:v,onClick:x,ref:S,...C}=e,w=c&&i.slotRendersContent(c)?i.renderSlot(c,`span`,t.cn(a.breadcrumbItemClassNames.icon,`me-1 inline-flex shrink-0`),{"aria-hidden":!0}):null,T=l&&u.isValidElement(g)?g:null,E=T?`child`:s?`current`:n===void 0?x?`button`:`text`:`link`,D=l&&T===null,O=C.disabled===!0&&(E===`text`||E===`current`),k=C[`aria-disabled`],A=T?.props??{},j=[C.disabled,k,A.disabled,A[`aria-disabled`]].some(e=>e===!0||e===`true`);if(u.useEffect(()=>{D&&r.warnOnce(`Breadcrumb.Item:asChild`,"Breadcrumb.Item: `asChild` expects a single element child (e.g. a router link); the item was rendered normally instead."),E===`text`&&r.warnOnce(`Breadcrumb.Item:no-href`,"Breadcrumb.Item: a non-current item without `href` or `onClick` renders as plain text, not a link. Pass `href` (or `onClick`, which renders a button) to make it navigable."),O&&r.warnOnce(`Breadcrumb.Item:disabled`,"Breadcrumb.Item: `disabled` applies to link, button and asChild items; it is ignored on a text or current item.")},[D,E,O]),T){let{disabled:e,...r}=C,i=n!==void 0&&!j?{href:n}:void 0;return(0,d.jsx)(b,{...r,...i,ref:S,onClick:o.preventIfDisabled(j,x),"aria-current":s?`page`:void 0,className:t.cn(a.breadcrumbItemClassNames.root,s?m:f,v),icon:w,child:j?y(T):T})}if(E===`current`)return(0,d.jsxs)(`span`,{..._(C),ref:S,"aria-current":`page`,onClick:x,className:t.cn(a.breadcrumbItemClassNames.root,p,v),children:[w,g]});if(E===`link`){let{disabled:e,...r}=C;return(0,d.jsxs)(`a`,{...r,ref:S,href:j?void 0:n,role:j?`link`:r.role,"aria-disabled":j?!0:k,tabIndex:j?-1:r.tabIndex,onClick:o.preventIfDisabled(j,x),className:t.cn(a.breadcrumbItemClassNames.root,f,v),children:[w,g]})}if(E===`button`){let{rel:e,...n}=C;return(0,d.jsxs)(`button`,{type:`button`,...n,ref:S,onClick:x,className:t.cn(a.breadcrumbItemClassNames.root,f,v),children:[w,g]})}return(0,d.jsxs)(`span`,{..._(C),ref:S,className:t.cn(a.breadcrumbItemClassNames.root,h,v),children:[w,g]})}x.displayName=`BreadcrumbItem`;var S=Object.assign(v,{Item:x});exports.Breadcrumb=S,exports.BreadcrumbItem=x;
2
2
  //# sourceMappingURL=Breadcrumb.cjs.map