@espressif/dashboard-ui-components 1.11.2 → 1.12.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 (532) hide show
  1. package/.claude/rules/dashboard-ui-consumption.md +176 -5
  2. package/.cursor/rules/dashboard-ui-consumption.mdc +163 -4
  3. package/CHANGELOG.md +1005 -0
  4. package/README.md +240 -7
  5. package/THIRD-PARTY-NOTICES.md +2 -1
  6. package/dist/alert.props-CcKo49Rb.d.ts +44 -0
  7. package/dist/animation/index.d.ts +3 -0
  8. package/dist/animation/index.js +3 -0
  9. package/dist/avatar.props-2q5BsX-R.d.ts +29 -0
  10. package/dist/button-BK-DIR_L.d.ts +21 -0
  11. package/dist/button-BxJ7s6sR.d.ts +76 -0
  12. package/dist/calendar.props-BtCzuWH1.d.ts +12 -0
  13. package/dist/carousel/index.d.ts +2 -0
  14. package/dist/carousel/index.js +2 -0
  15. package/dist/charts/index.d.ts +5 -0
  16. package/dist/charts/index.js +9 -0
  17. package/dist/common/app-logo/app-logo.js +1 -1
  18. package/dist/common/index.d.ts +9 -20
  19. package/dist/common/my-account-menu/my-account-menu.js +45 -13
  20. package/dist/common/profile-card/profile-card.js +3 -2
  21. package/dist/components/accordion/accordion.js +14 -5
  22. package/dist/components/accordion/index.d.ts +36 -0
  23. package/dist/components/accordion/index.js +2 -0
  24. package/dist/components/advanced-search-box/advanced-search-box.js +8 -2
  25. package/dist/components/advanced-search-box/index.d.ts +29 -0
  26. package/dist/components/advanced-search-box/index.js +2 -0
  27. package/dist/components/alert/alert.js +2 -1
  28. package/dist/components/alert/index.d.ts +12 -0
  29. package/dist/components/alert/index.js +2 -0
  30. package/dist/components/anchored-panel/anchored-panel.js +83 -0
  31. package/dist/components/anchored-panel/index.d.ts +31 -0
  32. package/dist/components/anchored-panel/index.js +2 -0
  33. package/dist/components/animated-containers/index.d.ts +13 -0
  34. package/dist/components/animated-containers/index.js +2 -0
  35. package/dist/components/async-multi-select/async-multi-select.js +48 -7
  36. package/dist/components/async-multi-select/index.d.ts +63 -0
  37. package/dist/components/async-multi-select/index.js +2 -0
  38. package/dist/components/avatar/avatar.js +11 -4
  39. package/dist/components/avatar/index.d.ts +8 -0
  40. package/dist/components/avatar/index.js +2 -0
  41. package/dist/components/avatar-group/avatar-group.js +35 -0
  42. package/dist/components/avatar-group/index.d.ts +31 -0
  43. package/dist/components/avatar-group/index.js +2 -0
  44. package/dist/components/badge/index.d.ts +14 -0
  45. package/dist/components/badge/index.js +2 -0
  46. package/dist/components/breadcrumb/index.d.ts +21 -0
  47. package/dist/components/breadcrumb/index.js +2 -0
  48. package/dist/components/bubble/bubble.js +18 -0
  49. package/dist/components/bubble/index.d.ts +19 -0
  50. package/dist/components/bubble/index.js +2 -0
  51. package/dist/components/button/button.js +87 -25
  52. package/dist/components/button/flash-button.js +9 -3
  53. package/dist/components/button/index.d.ts +56 -0
  54. package/dist/components/button/index.js +6 -0
  55. package/dist/components/button-group/index.d.ts +16 -0
  56. package/dist/components/button-group/index.js +2 -0
  57. package/dist/components/calendar/calendar.js +5 -5
  58. package/dist/components/calendar/index.d.ts +11 -0
  59. package/dist/components/calendar/index.js +2 -0
  60. package/dist/components/card/index.d.ts +11 -0
  61. package/dist/components/card/index.js +2 -0
  62. package/dist/components/card-rail/card-rail.js +50 -0
  63. package/dist/components/card-rail/index.d.ts +30 -0
  64. package/dist/components/card-rail/index.js +2 -0
  65. package/dist/components/cards/collapsible-card.js +5 -2
  66. package/dist/components/cards/index.d.ts +16200 -0
  67. package/dist/components/cards/index.js +8 -0
  68. package/dist/components/cards/section-card.js +133 -8
  69. package/dist/components/cards/simple-card.js +5 -2
  70. package/dist/components/carousel/carousel.js +137 -49
  71. package/dist/components/carousel/index.d.ts +130 -0
  72. package/dist/components/carousel/index.js +2 -0
  73. package/dist/components/category-card/category-card.js +111 -0
  74. package/dist/components/category-card/index.d.ts +55 -0
  75. package/dist/components/category-card/index.js +2 -0
  76. package/dist/components/chart/area-chart.js +95 -85
  77. package/dist/components/chart/bar-chart.js +123 -60
  78. package/dist/components/chart/chart.js +127 -3
  79. package/dist/components/chart/composed-chart.js +109 -98
  80. package/dist/components/chart/donut-chart.js +23 -5
  81. package/dist/components/chart/index.d.ts +732 -0
  82. package/dist/components/chart/index.js +9 -0
  83. package/dist/components/chart/line-chart.js +93 -83
  84. package/dist/components/chart/treemap-chart.js +71 -58
  85. package/dist/components/check-badge/check-badge.js +25 -0
  86. package/dist/components/check-badge/index.d.ts +13 -0
  87. package/dist/components/check-badge/index.js +2 -0
  88. package/dist/components/checkbox/index.d.ts +8 -0
  89. package/dist/components/checkbox/index.js +2 -0
  90. package/dist/components/choice-card/choice-card.js +99 -0
  91. package/dist/components/choice-card/index.d.ts +41 -0
  92. package/dist/components/choice-card/index.js +2 -0
  93. package/dist/components/circular-progress/circular-progress.js +5 -2
  94. package/dist/components/circular-progress/index.d.ts +23 -0
  95. package/dist/components/circular-progress/index.js +2 -0
  96. package/dist/components/code/index.d.ts +40 -0
  97. package/dist/components/code/index.js +2 -0
  98. package/dist/components/code-editor/code-editor.js +9 -3
  99. package/dist/components/code-editor/index.d.ts +82 -0
  100. package/dist/components/code-editor/index.js +2 -0
  101. package/dist/components/collapsible/index.d.ts +42 -0
  102. package/dist/components/collapsible/index.js +2 -0
  103. package/dist/components/column-panel/column-panel.js +38 -0
  104. package/dist/components/column-panel/index.d.ts +37 -0
  105. package/dist/components/column-panel/index.js +3 -0
  106. package/dist/components/column-panel/use-panel-flag.js +27 -0
  107. package/dist/components/combobox/index.d.ts +28 -0
  108. package/dist/components/combobox/index.js +2 -0
  109. package/dist/components/confirmation-dialog/confirmation-dialog.js +1 -1
  110. package/dist/components/confirmation-dialog/index.d.ts +40 -0
  111. package/dist/components/confirmation-dialog/index.js +3 -0
  112. package/dist/components/content-container/index.d.ts +16 -0
  113. package/dist/components/content-container/index.js +2 -0
  114. package/dist/components/copiable-text/index.d.ts +33 -0
  115. package/dist/components/copiable-text/index.js +2 -0
  116. package/dist/components/coverflow/_constants/coverflow-poses.js +23 -0
  117. package/dist/components/coverflow/_constants/coverflow-shapes.js +23 -0
  118. package/dist/components/coverflow/_hooks/use-coverflow.js +90 -0
  119. package/dist/components/coverflow/_utils/ring.js +24 -0
  120. package/dist/components/coverflow/coverflow.js +198 -0
  121. package/dist/components/coverflow/index.d.ts +105 -0
  122. package/dist/components/coverflow/index.js +2 -0
  123. package/dist/components/data-table/data-table.js +9 -2
  124. package/dist/components/data-table/index.d.ts +120 -0
  125. package/dist/components/data-table/index.js +3 -0
  126. package/dist/components/date-picker/date-picker.js +5 -2
  127. package/dist/components/date-picker/index.d.ts +50 -0
  128. package/dist/components/date-picker/index.js +2 -0
  129. package/dist/components/date-range-picker/date-range-picker.js +11 -2
  130. package/dist/components/date-range-picker/index.d.ts +100 -0
  131. package/dist/components/date-range-picker/index.js +3 -0
  132. package/dist/components/date-time-picker/date-time-picker.js +5 -2
  133. package/dist/components/date-time-picker/index.d.ts +79 -0
  134. package/dist/components/date-time-picker/index.js +2 -0
  135. package/dist/components/device-icon/index.d.ts +17 -0
  136. package/dist/components/device-icon/index.js +2 -0
  137. package/dist/components/dialog/index.d.ts +38 -0
  138. package/dist/components/dialog/index.js +2 -0
  139. package/dist/components/dropdown-menu/index.d.ts +57 -0
  140. package/dist/components/dropdown-menu/index.js +2 -0
  141. package/dist/components/dynamic-list/dynamic-list.js +4 -4
  142. package/dist/components/dynamic-list/index.d.ts +74 -0
  143. package/dist/components/dynamic-list/index.js +2 -0
  144. package/dist/components/error-display/index.d.ts +17 -0
  145. package/dist/components/error-display/index.js +3 -0
  146. package/dist/components/expandable-text/expandable-text-overlay.js +78 -0
  147. package/dist/components/expandable-text/expandable-text.js +73 -0
  148. package/dist/components/expandable-text/index.d.ts +39 -0
  149. package/dist/components/expandable-text/index.js +2 -0
  150. package/dist/components/expandable-text/use-clamped.js +23 -0
  151. package/dist/components/facet-filters/_hooks/use-filter-group.js +51 -0
  152. package/dist/components/facet-filters/active-filters.js +31 -0
  153. package/dist/components/facet-filters/filter-group.js +110 -0
  154. package/dist/components/facet-filters/filters-panel.js +59 -0
  155. package/dist/components/facet-filters/filters-pill.js +40 -0
  156. package/dist/components/facet-filters/index.d.ts +104 -0
  157. package/dist/components/facet-filters/index.js +6 -0
  158. package/dist/components/facet-filters/use-filters-collapsed.js +21 -0
  159. package/dist/components/feature-grid/feature-grid.js +115 -0
  160. package/dist/components/feature-grid/index.d.ts +53 -0
  161. package/dist/components/feature-grid/index.js +2 -0
  162. package/dist/components/file-input/file-input.js +9 -3
  163. package/dist/components/file-input/index.d.ts +78 -0
  164. package/dist/components/file-input/index.js +2 -0
  165. package/dist/components/file-upload/file-upload.js +10 -5
  166. package/dist/components/file-upload/index.d.ts +38 -0
  167. package/dist/components/file-upload/index.js +2 -0
  168. package/dist/components/filters-bar/filters-bar.js +5 -1
  169. package/dist/components/filters-bar/index.d.ts +26 -0
  170. package/dist/components/filters-bar/index.js +2 -0
  171. package/dist/components/flip-card/flip-card.js +147 -0
  172. package/dist/components/flip-card/index.d.ts +43 -0
  173. package/dist/components/flip-card/index.js +2 -0
  174. package/dist/components/floating-window/_hooks/use-drag-move.js +76 -0
  175. package/dist/components/floating-window/floating-window.js +97 -0
  176. package/dist/components/floating-window/index.d.ts +45 -0
  177. package/dist/components/floating-window/index.js +2 -0
  178. package/dist/components/form/index.d.ts +28 -0
  179. package/dist/components/form/index.js +2 -0
  180. package/dist/components/fullscreen-dialog/fullscreen-dialog.js +6 -2
  181. package/dist/components/fullscreen-dialog/index.d.ts +38 -0
  182. package/dist/components/fullscreen-dialog/index.js +2 -0
  183. package/dist/components/horizontal-stepper/horizontal-stepper.js +122 -0
  184. package/dist/components/horizontal-stepper/index.d.ts +70 -0
  185. package/dist/components/horizontal-stepper/index.js +2 -0
  186. package/dist/components/icon-avatar/index.d.ts +9 -0
  187. package/dist/components/icon-avatar/index.js +2 -0
  188. package/dist/components/icon-text-action-card/icon-text-action-card.js +9 -5
  189. package/dist/components/icon-text-action-card/index.d.ts +11 -0
  190. package/dist/components/icon-text-action-card/index.js +2 -0
  191. package/dist/components/identicon/identicon.js +33 -0
  192. package/dist/components/identicon/index.d.ts +26 -0
  193. package/dist/components/identicon/index.js +2 -0
  194. package/dist/components/illustration/index.d.ts +37 -0
  195. package/dist/components/illustration/index.js +3 -0
  196. package/dist/components/index.d.ts +177 -19529
  197. package/dist/components/index.js +61 -10
  198. package/dist/components/input/index.d.ts +15 -0
  199. package/dist/components/input/index.js +3 -0
  200. package/dist/components/input-group/index.d.ts +35 -0
  201. package/dist/components/input-group/index.js +2 -0
  202. package/dist/components/input-group/input-group.js +41 -0
  203. package/dist/components/input-otp/index.d.ts +63 -0
  204. package/dist/components/input-otp/index.js +2 -0
  205. package/dist/components/key-value-manager/index.d.ts +63 -0
  206. package/dist/components/key-value-manager/index.js +2 -0
  207. package/dist/components/key-value-manager/key-value-manager-table.js +7 -5
  208. package/dist/components/label/index.d.ts +8 -0
  209. package/dist/components/label/index.js +2 -0
  210. package/dist/components/link/index.d.ts +33 -0
  211. package/dist/components/link/index.js +2 -0
  212. package/dist/components/list/index.d.ts +9 -0
  213. package/dist/components/list/index.js +3 -0
  214. package/dist/components/list/list-item.utils.js +1 -1
  215. package/dist/components/list/list.js +3 -1
  216. package/dist/components/list-details/index.d.ts +51 -0
  217. package/dist/components/list-details/index.js +2 -0
  218. package/dist/components/list-details/list-details.js +5 -2
  219. package/dist/components/lottie-animation-container/index.d.ts +10 -0
  220. package/dist/components/lottie-animation-container/index.js +2 -0
  221. package/dist/components/lottie-animation-container/lottie-animation-container.js +22 -3
  222. package/dist/components/lottie-animations/index.d.ts +8 -0
  223. package/dist/components/lottie-animations/index.js +2 -0
  224. package/dist/components/markdown-content/index.d.ts +32 -0
  225. package/dist/components/markdown-content/index.js +2 -0
  226. package/dist/components/media-card/index.d.ts +125 -0
  227. package/dist/components/media-card/index.js +4 -0
  228. package/dist/components/media-card/media-card-image.js +59 -0
  229. package/dist/components/media-card/media-card-reveal.js +76 -0
  230. package/dist/components/media-card/media-card.classes.js +37 -0
  231. package/dist/components/media-card/media-card.js +91 -0
  232. package/dist/components/media-stage/index.d.ts +41 -0
  233. package/dist/components/media-stage/index.js +2 -0
  234. package/dist/components/media-stage/media-stage.js +48 -0
  235. package/dist/components/menu/index.d.ts +14 -0
  236. package/dist/components/menu/index.js +2 -0
  237. package/dist/components/message-scroller/_hooks/use-follow-bottom.js +85 -0
  238. package/dist/components/message-scroller/index.d.ts +29 -0
  239. package/dist/components/message-scroller/index.js +2 -0
  240. package/dist/components/message-scroller/message-scroller.js +65 -0
  241. package/dist/components/mini-bar-chart/index.d.ts +40 -0
  242. package/dist/components/mini-bar-chart/index.js +2 -0
  243. package/dist/components/mini-bar-chart/mini-bar-chart.js +93 -0
  244. package/dist/components/monospace-content/index.d.ts +43 -0
  245. package/dist/components/monospace-content/index.js +2 -0
  246. package/dist/components/monospace-content/monospace-content.js +1 -1
  247. package/dist/components/nav-bar/index.d.ts +148 -0
  248. package/dist/components/nav-bar/index.js +2 -0
  249. package/dist/components/nav-bar/nav-bar-details-panel.js +158 -44
  250. package/dist/components/nav-bar/nav-bar-mobile-menu.js +93 -27
  251. package/dist/components/nav-bar/nav-bar.js +256 -138
  252. package/dist/components/nav-bar/use-nav-bar-hover-details.js +80 -0
  253. package/dist/components/nav-bar/use-nav-bar-overflow.js +5 -5
  254. package/dist/components/notice-strip/index.d.ts +32 -0
  255. package/dist/components/notice-strip/index.js +2 -0
  256. package/dist/components/notice-strip/notice-strip.js +57 -0
  257. package/dist/components/option-card-group/index.d.ts +50 -0
  258. package/dist/components/option-card-group/index.js +2 -0
  259. package/dist/components/option-card-group/option-card-group.js +76 -0
  260. package/dist/components/overflow-badge-list/index.d.ts +63 -0
  261. package/dist/components/overflow-badge-list/index.js +2 -0
  262. package/dist/components/overflow-badge-list/overflow-badge-list.js +78 -19
  263. package/dist/components/page-banner/index.d.ts +33 -0
  264. package/dist/components/page-banner/index.js +2 -0
  265. package/dist/components/page-banner/page-banner.js +56 -0
  266. package/dist/components/page-container/index.d.ts +20 -0
  267. package/dist/components/page-container/index.js +3 -0
  268. package/dist/components/page-container/page-container.js +5 -5
  269. package/dist/components/pagination/index.d.ts +31 -0
  270. package/dist/components/pagination/index.js +3 -0
  271. package/dist/components/popover/index.d.ts +60 -0
  272. package/dist/components/popover/index.js +3 -0
  273. package/dist/components/preview-card/index.d.ts +24 -0
  274. package/dist/components/preview-card/index.js +2 -0
  275. package/dist/components/progress-bar/index.d.ts +32 -0
  276. package/dist/components/progress-bar/index.js +2 -0
  277. package/dist/components/progress-bar/progress-bar.js +22 -6
  278. package/dist/components/radio-group/index.d.ts +24 -0
  279. package/dist/components/radio-group/index.js +2 -0
  280. package/dist/components/rank-numeral/index.d.ts +30 -0
  281. package/dist/components/rank-numeral/index.js +2 -0
  282. package/dist/components/rank-numeral/rank-numeral.js +26 -0
  283. package/dist/components/reaction-button/index.d.ts +32 -0
  284. package/dist/components/reaction-button/index.js +2 -0
  285. package/dist/components/reaction-button/reaction-button.js +50 -0
  286. package/dist/components/readout/index.d.ts +31 -0
  287. package/dist/components/readout/index.js +2 -0
  288. package/dist/components/readout/readout.js +63 -0
  289. package/dist/components/requirement-list/index.d.ts +52 -0
  290. package/dist/components/requirement-list/index.js +2 -0
  291. package/dist/components/requirement-list/requirement-list.js +29 -8
  292. package/dist/components/resizable/index.d.ts +31 -0
  293. package/dist/components/resizable/index.js +4 -0
  294. package/dist/components/resizable/resizable-group.js +23 -0
  295. package/dist/components/resizable/resizable-panel.js +28 -0
  296. package/dist/components/resizable/resizable-separator.js +24 -0
  297. package/dist/components/reveal/index.d.ts +23 -0
  298. package/dist/components/reveal/index.js +2 -0
  299. package/dist/components/reveal/reveal.js +24 -0
  300. package/dist/components/scroll-area/index.d.ts +27 -0
  301. package/dist/components/scroll-area/index.js +2 -0
  302. package/dist/components/scrollable-sections/index.d.ts +58 -0
  303. package/dist/components/scrollable-sections/index.js +2 -0
  304. package/dist/components/scrollable-sections/scrollable-sections.js +11 -3
  305. package/dist/components/search-box/index.d.ts +32 -0
  306. package/dist/components/search-box/index.js +2 -0
  307. package/dist/components/search-box/search-box.js +18 -3
  308. package/dist/components/search-field-shell.js +1 -1
  309. package/dist/components/select/index.d.ts +44 -0
  310. package/dist/components/select/index.js +2 -0
  311. package/dist/components/selectable-card-list/checkbox-card-list.js +5 -3
  312. package/dist/components/selectable-card-list/index.d.ts +76 -0
  313. package/dist/components/selectable-card-list/index.js +2 -0
  314. package/dist/components/selectable-card-list/radio-card-list.js +12 -6
  315. package/dist/components/selectable-card-list/selectable-card-list-shared.js +24 -12
  316. package/dist/components/selectable-card-list/selectable-card-list.js +12 -3
  317. package/dist/components/separator/index.d.ts +24 -0
  318. package/dist/components/separator/index.js +2 -0
  319. package/dist/components/share-menu/index.d.ts +55 -0
  320. package/dist/components/share-menu/index.js +2 -0
  321. package/dist/components/share-menu/share-marks.js +31 -0
  322. package/dist/components/share-menu/share-menu.js +140 -0
  323. package/dist/components/share-menu/share-urls.js +15 -0
  324. package/dist/components/sheet/index.d.ts +41 -0
  325. package/dist/components/sheet/index.js +2 -0
  326. package/dist/components/showcase-card/index.d.ts +53 -0
  327. package/dist/components/showcase-card/index.js +2 -0
  328. package/dist/components/showcase-card/showcase-card.js +75 -0
  329. package/dist/components/sidebar/index.d.ts +109 -0
  330. package/dist/components/sidebar/index.js +4 -0
  331. package/dist/components/sidebar/sidebar.js +56 -40
  332. package/dist/components/simple-clickable-card/index.d.ts +11 -0
  333. package/dist/components/simple-clickable-card/index.js +2 -0
  334. package/dist/components/simple-clickable-card/simple-clickable-card-shared.js +2 -2
  335. package/dist/components/simple-clickable-card/simple-clickable-card.js +5 -2
  336. package/dist/components/simple-info-card/index.d.ts +25 -0
  337. package/dist/components/simple-info-card/index.js +2 -0
  338. package/dist/components/simple-info-card/simple-info-card.js +6 -3
  339. package/dist/components/simple-list/index.d.ts +63 -0
  340. package/dist/components/simple-list/index.js +2 -0
  341. package/dist/components/simple-list/simple-list.js +3 -1
  342. package/dist/components/simple-paginated-list/index.d.ts +20 -0
  343. package/dist/components/simple-paginated-list/index.js +2 -0
  344. package/dist/components/simplified-date/index.d.ts +18 -0
  345. package/dist/components/simplified-date/index.js +2 -0
  346. package/dist/components/skeleton/index.d.ts +5 -0
  347. package/dist/components/skeleton/index.js +2 -0
  348. package/dist/components/skeletons/index.d.ts +11 -0
  349. package/dist/components/skeletons/index.js +2 -0
  350. package/dist/components/sort-menu/index.d.ts +34 -0
  351. package/dist/components/sort-menu/index.js +2 -0
  352. package/dist/components/sort-menu/sort-menu.js +39 -0
  353. package/dist/components/spinner/index.d.ts +15 -0
  354. package/dist/components/spinner/index.js +2 -0
  355. package/dist/components/stat-card/index.d.ts +43 -0
  356. package/dist/components/stat-card/index.js +2 -0
  357. package/dist/components/stat-card/stat-card.js +31 -12
  358. package/dist/components/status-badge/index.d.ts +24 -0
  359. package/dist/components/status-badge/index.js +2 -0
  360. package/dist/components/status-badge/status-badge.js +3 -2
  361. package/dist/components/status-card-list/index.d.ts +24 -0
  362. package/dist/components/status-card-list/index.js +2 -0
  363. package/dist/components/status-card-list/status-card-list.js +8 -4
  364. package/dist/components/step-tabs/index.d.ts +94 -0
  365. package/dist/components/step-tabs/index.js +2 -0
  366. package/dist/components/step-tabs/step-tabs.js +202 -0
  367. package/dist/components/style-scope/index.d.ts +32 -0
  368. package/dist/components/style-scope/index.js +2 -0
  369. package/dist/components/style-scope/style-scope.js +49 -0
  370. package/dist/components/switch/index.d.ts +15 -0
  371. package/dist/components/switch/index.js +2 -0
  372. package/dist/components/table/index.d.ts +18 -0
  373. package/dist/components/table/index.js +2 -0
  374. package/dist/components/tabs/index.d.ts +103 -0
  375. package/dist/components/tabs/index.js +2 -0
  376. package/dist/components/tag/index.d.ts +31 -0
  377. package/dist/components/tag/index.js +2 -0
  378. package/dist/components/tag/tag.js +79 -28
  379. package/dist/components/tag-input/index.d.ts +36 -0
  380. package/dist/components/tag-input/index.js +2 -0
  381. package/dist/components/tag-input/tag-input.js +10 -4
  382. package/dist/components/text-effects/index.d.ts +53 -0
  383. package/dist/components/text-effects/index.js +6 -0
  384. package/dist/components/textarea/index.d.ts +16 -0
  385. package/dist/components/textarea/index.js +2 -0
  386. package/dist/components/thumbnail-strip/index.d.ts +42 -0
  387. package/dist/components/thumbnail-strip/index.js +2 -0
  388. package/dist/components/thumbnail-strip/thumbnail-strip.js +124 -0
  389. package/dist/components/thumbnail-strip/use-scroll-edges.js +41 -0
  390. package/dist/components/time-picker/index.d.ts +13 -0
  391. package/dist/components/time-picker/index.js +2 -0
  392. package/dist/components/timeline/index.d.ts +39 -0
  393. package/dist/components/timeline/index.js +2 -0
  394. package/dist/components/timeline/timeline.js +85 -0
  395. package/dist/components/toast/index.d.ts +56 -0
  396. package/dist/components/toast/index.js +2 -0
  397. package/dist/components/toast/toast.js +42 -32
  398. package/dist/components/togglable-items-list/index.d.ts +28 -0
  399. package/dist/components/togglable-items-list/index.js +2 -0
  400. package/dist/components/toggle-group/index.d.ts +35 -0
  401. package/dist/components/toggle-group/index.js +2 -0
  402. package/dist/components/toolbar/index.d.ts +58 -0
  403. package/dist/components/toolbar/index.js +3 -0
  404. package/dist/components/toolbar/toolbar-button.js +40 -0
  405. package/dist/components/toolbar/toolbar.js +56 -0
  406. package/dist/components/tooltip/index.d.ts +29 -0
  407. package/dist/components/tooltip/index.js +3 -0
  408. package/dist/components/tooltip/tooltip.js +12 -2
  409. package/dist/components/transfer-list/index.d.ts +36 -0
  410. package/dist/components/transfer-list/index.js +2 -0
  411. package/dist/components/transfer-list/transfer-list.js +1 -1
  412. package/dist/components/truncated-line-with-tooltip/index.d.ts +22 -0
  413. package/dist/components/truncated-line-with-tooltip/index.js +2 -0
  414. package/dist/components/truncated-line-with-tooltip/truncated-line-with-tooltip.js +26 -8
  415. package/dist/components/typography/index.d.ts +19 -0
  416. package/dist/components/typography/index.js +3 -0
  417. package/dist/components/use-mobile/index.d.ts +3 -0
  418. package/dist/components/use-mobile/index.js +2 -0
  419. package/dist/components/user-type-badge/index.d.ts +39 -0
  420. package/dist/components/user-type-badge/index.js +3 -0
  421. package/dist/components/user-type-badge/user-type-badge.js +2 -1
  422. package/dist/components/vertical-stepper/index.d.ts +7 -0
  423. package/dist/components/vertical-stepper/index.js +2 -0
  424. package/dist/components/vertical-stepper/vertical-stepper.js +33 -6
  425. package/dist/components/view-toggle/index.d.ts +38 -0
  426. package/dist/components/view-toggle/index.js +2 -0
  427. package/dist/components/view-toggle/view-toggle.js +56 -0
  428. package/dist/core/animate-ui/components/animate/code.js +83 -9
  429. package/dist/core/animate-ui/components/animate/tabs.js +234 -19
  430. package/dist/core/animate-ui/components/animate/tooltip.js +10 -2
  431. package/dist/core/animate-ui/components/base/preview-card.js +20 -3
  432. package/dist/core/animate-ui/components/buttons/copy.js +12 -6
  433. package/dist/core/animate-ui/components/radix/dialog.js +17 -3
  434. package/dist/core/animate-ui/components/radix/dropdown-menu.js +26 -9
  435. package/dist/core/animate-ui/components/radix/sheet.js +20 -4
  436. package/dist/core/animate-ui/components/radix/sidebar.js +9 -9
  437. package/dist/core/animate-ui/components/radix/toggle-group.js +103 -13
  438. package/dist/core/animate-ui/components/radix/toggle.js +5 -5
  439. package/dist/core/animate-ui/primitives/animate/code-block.js +31 -4
  440. package/dist/core/animate-ui/primitives/animate/shiki-highlighter.js +5 -2
  441. package/dist/core/animate-ui/primitives/animate/tabs.js +7 -4
  442. package/dist/core/animate-ui/primitives/animate/tooltip.js +10 -3
  443. package/dist/core/animate-ui/primitives/base/preview-card.js +2 -2
  444. package/dist/core/animate-ui/primitives/base/progress.js +1 -1
  445. package/dist/core/animate-ui/primitives/base/radio.js +3 -3
  446. package/dist/core/animate-ui/primitives/effects/highlight.js +1 -0
  447. package/dist/core/animate-ui/primitives/radix/accordion.js +1 -1
  448. package/dist/core/animate-ui/primitives/radix/dialog.js +6 -3
  449. package/dist/core/animate-ui/primitives/radix/dropdown-menu.js +2 -2
  450. package/dist/core/animate-ui/primitives/radix/sheet.js +7 -3
  451. package/dist/core/animate-ui/primitives/radix/switch.js +2 -2
  452. package/dist/core/animate-ui/primitives/radix/toggle-group.js +2 -2
  453. package/dist/core/badge.js +5 -2
  454. package/dist/core/breadcrumb.js +1 -1
  455. package/dist/core/button/button.js +8 -8
  456. package/dist/core/button/craft-button.js +8 -2
  457. package/dist/core/button.js +17 -7
  458. package/dist/core/card.js +23 -5
  459. package/dist/core/combobox/combobox.js +8 -2
  460. package/dist/core/command.js +3 -3
  461. package/dist/core/form.js +1 -1
  462. package/dist/core/hooks/use-nested-layer-press-guard.js +46 -0
  463. package/dist/core/hooks/use-on-screen.js +33 -0
  464. package/dist/core/hooks/use-prefers-reduced-motion.js +19 -0
  465. package/dist/core/hooks/use-scroll-overflow.js +20 -0
  466. package/dist/core/index.d.ts +30 -5
  467. package/dist/core/index.js +5 -2
  468. package/dist/core/input/input-password.js +13 -9
  469. package/dist/core/input/input.js +38 -12
  470. package/dist/core/input-otp/input-otp.js +9 -5
  471. package/dist/core/popover-group.js +48 -0
  472. package/dist/core/popover-hover.js +127 -0
  473. package/dist/core/popover.js +75 -6
  474. package/dist/core/select.js +35 -20
  475. package/dist/core/table.js +5 -3
  476. package/dist/core/textarea/textarea.js +11 -3
  477. package/dist/data-table/index.d.ts +4 -0
  478. package/dist/data-table/index.js +3 -0
  479. package/dist/date/index.d.ts +11 -0
  480. package/dist/date/index.js +7 -0
  481. package/dist/forms/index.d.ts +4 -0
  482. package/dist/forms/index.js +2 -0
  483. package/dist/icon-avatar.props-RYtw2eSW.d.ts +31 -0
  484. package/dist/icon-text-action-card.props-B2ggncUK.d.ts +53 -0
  485. package/dist/index.d.ts +169 -15
  486. package/dist/index.js +63 -10
  487. package/dist/input-CYI1hhGc.d.ts +38 -0
  488. package/dist/layouts/index.d.ts +132 -8
  489. package/dist/layouts/index.js +3 -1
  490. package/dist/layouts/minimal-workspace-layout/minimal-workspace-layout-context.js +5 -0
  491. package/dist/layouts/minimal-workspace-layout/minimal-workspace-layout.js +404 -0
  492. package/dist/layouts/minimal-workspace-layout/rail-logo.js +90 -0
  493. package/dist/layouts/minimal-workspace-layout/sidebar-trigger.js +42 -0
  494. package/dist/layouts/shared/account-menu-props.js +21 -0
  495. package/dist/layouts/shared/footer-branding.js +34 -0
  496. package/dist/layouts/shared/sidebar-logo.js +59 -0
  497. package/dist/layouts/workspace-layout/account-menu/account-menu.js +9 -3
  498. package/dist/layouts/workspace-layout/footer/footer.js +1 -1
  499. package/dist/layouts/workspace-layout/header/header.js +1 -1
  500. package/dist/layouts/workspace-layout/workspace-layout.js +28 -80
  501. package/dist/{list.props-x1j3CbcF.d.ts → list.props-DP_xPTqU.d.ts} +2 -1
  502. package/dist/markdown/index.d.ts +11 -0
  503. package/dist/markdown/index.js +5 -0
  504. package/dist/my-account-menu.props-C7DK71WC.d.ts +67 -0
  505. package/dist/page-container.props-JutTvKFq.d.ts +48 -0
  506. package/dist/resizable.props-RxFY5tm_.d.ts +44 -0
  507. package/dist/section-card-B7c5uc08.d.ts +84 -0
  508. package/dist/simple-clickable-card.props-BrPCw7CR.d.ts +51 -0
  509. package/dist/slot-DGErA9zi.d.ts +10 -0
  510. package/dist/status-badge.props-lKlEOfRt.d.ts +32 -0
  511. package/dist/style-axes-DSQ2DGc5.d.ts +133 -0
  512. package/dist/toast/index.d.ts +6 -0
  513. package/dist/toast/index.js +2 -0
  514. package/dist/tooltip-C0bYa8a3.d.ts +37 -0
  515. package/dist/{types-DtUxK-Am.d.ts → types-CkXflqg7.d.ts} +31 -1
  516. package/dist/utils/cn.js +6 -1
  517. package/dist/utils/color.js +35 -10
  518. package/dist/utils/index.d.ts +18 -2
  519. package/dist/utils/index.js +4 -1
  520. package/dist/utils/silver-shine.js +16 -1
  521. package/dist/utils/style-axes.js +227 -0
  522. package/dist/utils/variant.js +104 -8
  523. package/dist/utils/view-transition.js +21 -0
  524. package/dist/variant-D81RhpbR.d.ts +104 -0
  525. package/dist/vertical-stepper.props-BXYcbW70.d.ts +29 -0
  526. package/package.json +52 -6
  527. package/src/styles/colors.css +100 -4
  528. package/src/styles/globals.css +8 -131
  529. package/src/styles/style-axes.css +21 -0
  530. package/src/styles/theme.css +696 -0
  531. package/dist/app-logo.props-Ct7QBdTd.d.ts +0 -40
  532. package/dist/popover-ByLD3-Qv.d.ts +0 -204
@@ -17,14 +17,19 @@ Use only paths declared under `package.json` → `exports`:
17
17
  |---------|---------|
18
18
  | `@espressif/dashboard-ui-components` | Root barrel: re-exports **components**, **common**, and **layouts**. Use only when the app intentionally pulls from multiple surfaces; otherwise prefer narrower subpaths below. |
19
19
  | `@espressif/dashboard-ui-components/components` | Public UI components and their types. |
20
+ | `@espressif/dashboard-ui-components/components/<folder>` | One component folder (`/components/button`, `/components/dialog`, …): the same names and objects `/components` exports for it. **Prefer this.** |
21
+ | `@espressif/dashboard-ui-components/charts` · `/data-table` · `/markdown` · `/date` · `/carousel` · `/forms` · `/animation` · `/toast` | One heavy family (recharts, tanstack, react-markdown + shiki, react-day-picker, embla, react-hook-form, lottie, sonner). |
20
22
  | `@espressif/dashboard-ui-components/layouts` | `WorkspaceLayout`, `EntryLayout`, and related layout exports. |
21
23
  | `@espressif/dashboard-ui-components/common` | Shared blocks (e.g. `AppLogo`, `ProfileCard`, `FooterCard`). |
22
24
  | `@espressif/dashboard-ui-components/utils` | Utilities such as `cn`. |
23
- | `@espressif/dashboard-ui-components/styles` | Global CSS (design tokens / base styles). |
25
+ | `@espressif/dashboard-ui-components/styles` | Global CSS: Tailwind + every token + base page styles. |
26
+ | `@espressif/dashboard-ui-components/theme.css` | Tokens only (no `@import "tailwindcss"`, no Preflight, no page styles), for apps that bring their own Tailwind. |
24
27
  | `@espressif/dashboard-ui-components/tailwind-preset` | Tailwind v4 preset. |
25
28
 
26
29
  **Do not** import from deep paths that are not in `exports` (they will fail under strict package managers or break without warning). **Do not** treat `@espressif/dashboard-ui-components/core` as a supported app API: it exists in `exports` for technical reasons, but consumers must not import `core` — use composed exports from `/components`.
27
30
 
31
+ **Import from the narrowest path you can**: `/components/<folder>` for one component, a grouped path for a heavy family, a surface (`/components`, `/layouts`, …) only when importing many. Tests and dev servers evaluate everything an entry reaches. Entries that include Toast (`/toast`, `/components/toast`, `/components`, root) import sonner's CSS from JS; the others do no work at import time.
32
+
28
33
  ## Import style
29
34
 
30
35
  - Prefer **named imports**: `import { Button, Alert } from '…/components'`.
@@ -38,6 +43,7 @@ Do **not** invent component or prop names from memory. The authoritative list of
38
43
  exports and their props is the shipped type declarations:
39
44
 
40
45
  - Components: `node_modules/@espressif/dashboard-ui-components/dist/components/index.d.ts`
46
+ - One component folder: `…/dist/components/<folder>/index.d.ts`; grouped entries: `…/dist/<group>/index.d.ts`
41
47
  - Layouts / common / utils: the sibling `dist/<surface>/index.d.ts` files
42
48
  - The README "Available Components" table for a human-readable overview
43
49
 
@@ -66,8 +72,73 @@ export function Example() {
66
72
  ## Styling and theming
67
73
 
68
74
  - Add the library's styles once in your Tailwind v4 entry CSS: `@import "@espressif/dashboard-ui-components/styles";`. That file already declares the `@source` for the compiled `dist/`, so no extra `content`/`@source` entry is needed.
69
- - Retheme by redeclaring the CSS custom properties (design tokens) **after** the `@import`, in both `:root` and `.dark`. Override `--font-sans` inside an `@theme` block.
75
+ - Retheme by redeclaring the CSS custom properties (design tokens) **after** the `@import`, in both `:root` and `.dark` (or `[data-theme="dark"]`). Override `--font-sans` / `--font-mono` inside an `@theme` block.
76
+ - Layout heights: use `--espd-shell-header-height`, `--espd-workspace-layout-footer-height` and
77
+ `--espd-workspace-layout-hidden-footer-height`. The old names (`--espd-header-height`,
78
+ `--espd-footer-height`, `--espd-hidden-footer-height`) are deprecated fallbacks: do not use them
79
+ in new code, and when migrating rename an app's overrides and its own reads together.
80
+ - `MinimalWorkspaceLayout` (from `/layouts`) is the header-less alternative to `WorkspaceLayout`
81
+ with the same props: switch by renaming the component. It has no header bar or status footer
82
+ (`footerConfig`, `hideBreadcrumbs`, `sidebarConfig.allowCollapsible` / `variant` do not exist on
83
+ it), starts collapsed (`defaultSidebarOpen` defaults to `false`), and puts `topRightContent`
84
+ (fallback `headerConfig.rightContent`) over the content. Theme it with the
85
+ `--espd-minimal-workspace-layout-*` tokens, not `className` overrides on its parts: the sidebar
86
+ surface defaults to the page background (`-sidebar-background`, `-sidebar-background-expanded`),
87
+ and its border, shadow and row accent are derived from that surface unless `-sidebar-border-color`,
88
+ `-sidebar-elevation` or `-sidebar-accent` are set. Keep `-sidebar-width-collapsed` within 48–56px.
89
+ With `sidebarConfig.hideWhenCollapsed` the collapsed sidebar is hidden instead of a rail: a click
90
+ on the content's left edge peeks it over the content until the pointer leaves it, and
91
+ `MinimalWorkspaceSidebarTrigger` (from `/layouts`, placed in `topRightContent`) opens it inline;
92
+ a peek never reaches `onSidebarOpenChange`. Do not build an edge or trigger in the app. The edge
93
+ strip and the peek shadow are `-edge-color`, `-edge-width` and `-sidebar-overlay-elevation`.
70
94
  - The library ships **no fonts**; the app supplies its own typeface via `--font-sans`.
95
+ - Pick `./theme.css` instead of `./styles` only when the app has its own `@import "tailwindcss"` (or legacy CSS a reset would break); then the app styles `body` itself.
96
+ - Dark mode applies under `.dark` **or** `[data-theme="dark"]` on an ancestor; override dark tokens under the selector the app uses. The library has no `prefers-color-scheme` handling.
97
+ - Beyond colour, retheme with the semantic tokens on `:root` (and the style-axis role tokens, next section): `--espd-control-height-sm|md|lg`, `--espd-button-padding-x-sm|md|lg`, `--espd-duration-fast|normal|slow`, `--espd-ring-width`, `--espd-ring-offset`, `--espd-on-solid-foreground` (plus Tailwind's `--radius-*`, `--shadow-*`, `--spacing`). Do not add new token names in app CSS.
98
+ - New variants (e.g. `glow`) are registered, not forked: augment `interface VariantRegistry` in `declare module '@espressif/dashboard-ui-components/components'` (in a file that imports that entry) and call `registerVariant('glow', (color) => ({ container, foreground, description }))` once at start-up. Built-in variants cannot be replaced.
99
+
100
+ ## Shape, elevation, border and density (style axes)
101
+
102
+ Change corner radius, shadow, border width or density with the library's axes, not with
103
+ `className` overrides on every component:
104
+
105
+ - **A kind of component, app-wide:** set a **role token** in CSS after the `@import`:
106
+ `--espd-radius-{control|surface|overlay|pill|item}`,
107
+ `--espd-elevation-{control|surface|overlay}`, `--espd-border-width-{control|surface}`.
108
+ Unset means each component keeps its own look. Overlays render in portals, so set overlay
109
+ tokens on `:root`, not on a wrapper.
110
+ - **A subtree, from React:** `<StyleScope radius={{ control: "full" }} elevation={{ surface: "none" }} density="compact">`
111
+ (from `/components/style-scope`). It sets the same tokens on a `display: contents` wrapper.
112
+ - **One component:** the `radius`, `elevation` and `border` props, where the component's
113
+ type declares them (check its `.d.ts`; not every component takes every axis). They affect
114
+ that component only, never the components nested inside it. The date pickers' `radius` is
115
+ the trigger's; their calendar popover takes `popoverRadius` / `popoverElevation`.
116
+ - **Density:** `density="compact" | "default" | "comfortable"` on Table, DataTable, Card, List,
117
+ SimpleList, FiltersBar, Sidebar, DialogContent, SheetContent, or on `StyleScope`. It also sets
118
+ `--espd-gap-field` (FormItem) and `--espd-gap-stack` (DialogContent); for a form, wrap it in
119
+ `StyleScope density` (Form renders no element).
120
+
121
+ Precedence: `className` > instance prop > role token > the component's own default.
122
+
123
+ Things agents get wrong:
124
+
125
+ - An elevation token takes a `box-shadow` value: use `0 0 #0000` for "flat", **not** `none`
126
+ (it would also remove focus rings). The `elevation="none"` prop already does this.
127
+ - Older props still work: `rounded` (Input, InputOTP, FileInput, Tag, date pickers) equals
128
+ `radius="full"`; `noShadow` / `noBorder` (SimpleCard). When both are passed, `radius` /
129
+ `elevation` / `border` win. Prefer the new props in new code.
130
+ - Instance props need the library stylesheet (`./styles` or `./theme.css`).
131
+ - New values are registered, not invented: augment `RadiusRegistry` / `ElevationRegistry` /
132
+ `BorderRegistry` / `DensityRegistry` in `declare module '@espressif/dashboard-ui-components/components'`
133
+ and call `registerStyleValue(axis, name, css)` or `registerDensity(name, tokens)` once at
134
+ start-up. Built-ins cannot be replaced.
135
+
136
+ ## Buttons
137
+
138
+ - Use the styled `Button` from `/components` (or `/components/button`). `/core` has an uncoloured base `Button` with the same name: not for apps.
139
+ - `fullWidth` **defaults to `true`**; pass `fullWidth={false}` for an inline button.
140
+ - For a link that looks like a button use `asChild`, never a Button that navigates in `onClick`:
141
+ `<Button asChild startIcon={<Plus />}><Link to="/new">Add</Link></Button>`. With `disabled`/`loading` the link gets `aria-disabled`, `tabIndex={-1}` and its clicks are cancelled.
71
142
 
72
143
  ## Optional peer dependencies
73
144
 
@@ -80,7 +151,7 @@ Install only when the feature is used:
80
151
  | `shiki` | `Code` / syntax highlighting |
81
152
  | `recharts` | Chart components |
82
153
 
83
- Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4).
154
+ Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4.1+).
84
155
 
85
156
  Do **not** tell users to install `react-markdown`, `remark-gfm`, or `rehype-slug` for
86
157
  `MarkdownContent` — they are regular dependencies of this package and install with it.
@@ -141,12 +212,112 @@ Things agents get wrong about it:
141
212
  if that matters.
142
213
  - `className` / `style` style the editor box, not the `<textarea>`.
143
214
 
215
+ ## Coverflow, Carousel or CardRail
216
+
217
+ - `Coverflow` (from `/components`): a 3D ring of image cards with a glass reflection and a
218
+ caption node per item, for a showcase of a few pictures (featured projects, boards).
219
+ `Carousel`: plain slides of any content in a strip. `CardRail`: a scrolling row of cards
220
+ that shows several at once.
221
+ - Items are `{ id, name, image?, imageAlt?, caption? }`; `name` is the accessible name.
222
+ Without `onOpen` the front card is a picture, not a button.
223
+ - `renderFace` is drawn **twice** (the card and its reflection): return a picture only —
224
+ nothing focusable, no `id`s. It receives `{ offset, visible }`; render expensive faces only
225
+ while `visible`.
226
+ - It draws no background. The reflection only reads on a dark floor: wrap it in a `.dark`
227
+ scope with `bg-background` (or any dark surface). Size comes from `aspect`
228
+ (`landscape` 4:3, `square`); do not set the stage height through `className`.
229
+ - The reflection fade uses `mask-*` utilities, which need Tailwind **4.1+**.
230
+
231
+ ## CategoryCard or SimpleClickableCard
232
+
233
+ - `CategoryCard` (from `/components`): a "browse by kind" card, stacked: icon tile, a count
234
+ (`value`) in the corner, name, one line, a few `tags`. `SimpleClickableCard`: one action in a
235
+ row with a chevron. Prop names match where they mean the same (`icon`, `title`,
236
+ `description`, `color`, `radius`, `onClick`).
237
+ - It sizes itself by its own width (a container query): below 12rem it tightens and drops the
238
+ tags. Do not hide the tags per breakpoint in the app.
239
+ - A filter row passes `selected` (gives `aria-pressed`); a navigating row passes `href` (a real
240
+ link) and leaves `selected` unset. Pass `aria-label` when the name to read is richer than
241
+ the visible text ("Show only Drivers, 65 blocks").
242
+ - Token tints the colour presets lack (the swatches) go in `iconClassName`, which replaces
243
+ `color` (do not pass both).
244
+
245
+ ## PopoverGroup — one hover preview across many items
246
+
247
+ - Wrap a grid or row of `Popover openOnHover` items in `PopoverGroup` (from `/components`) so
248
+ only one is open: the first opens after the popover's `openDelay`, another takes over only
249
+ after the pointer rests `switchDelay` (default 350 ms) on it, and reaching the open content
250
+ cancels a pending switch — so a diagonal path to the panel never switches it. Do not build
251
+ hover-intent timers in the app.
252
+ - Give each `Popover` a `value` when the app needs to know which is open; read it from the
253
+ group's `value` / `onValueChange` (a member's own `onOpenChange` does not fire when another
254
+ takes over). A `Popover` with an explicit `open` stays outside the group.
255
+ - Click still pins, Escape and an outside press close, and a hover-opened panel never takes
256
+ focus — the same as a lone `openOnHover` popover.
257
+
258
+ ## FlipCard
259
+
260
+ - `FlipCard` (from `/components`): two faces, controlled by `flipped`; each change moves the
261
+ same way, never back. `effect="turn"` (default) turns it over (`axis="x"` a split-flap, `"y"`
262
+ a page); `effect="slide"` slides the showing face out while the next follows it in (`x` down,
263
+ `y` sideways). To show a stream of items in one slot, load the next item into the hidden
264
+ face, then toggle `flipped`.
265
+ - The hidden face is `aria-hidden` and `inert`. Size the card from its parent or `className`;
266
+ the faces fill it (`faceClassName` styles both). Timing (`duration-*`, `ease-*`, `delay-*`)
267
+ goes in `turnClassName`.
268
+ - `onFlipEnd` fires when a turn finishes — at once under reduced motion, where the faces swap
269
+ without turning.
270
+
271
+ ## Work areas: Toolbar, resizable panels, floating windows
272
+
273
+ - `Toolbar` (from `/components`) takes `start` / `center` / `end` nodes; fill them with
274
+ `ToolbarButton`s (28px, icon-only: `label` is the accessible name AND the tooltip). Do not
275
+ add arrow-key handling: the toolbar already moves focus between its controls.
276
+ - `ResizableGroup` fills its parent: give the parent a height. Children alternate
277
+ `ResizablePanel` / `ResizableSeparator`; every panel needs an `id`, and `defaultLayout`'s keys
278
+ are those ids (percentages). Persist `onLayoutChanged`, not the live drag. Sizes are
279
+ `PanelSize`: a number is pixels, a unitless string a percentage (`"20"`).
280
+ - A panel that is shown and hidden by a flag is `ColumnPanel` (`open`, `openSize`), not a
281
+ conditional render: it stays mounted (state survives) and goes `inert` when hidden. For your
282
+ own collapsible `ResizablePanel`, pass `usePanelFlag(open, openSize)` as its `panelRef`.
283
+ - `FloatingWindow` does not keep its own position: hold `position` in the app (null = default
284
+ spot) and store what `onMove` hands back. Minimized it renders only its pill.
285
+ - `AnchoredPanel` is non-modal and positioned by a zero-size anchor element the app keeps at
286
+ the point (`anchorRef`); pass `keepOpenFor` for the control that toggles it, or that
287
+ control's own click closes and reopens it.
288
+ - `MessageScroller` scrolls itself: give it a height or a flex parent; do not wrap it in
289
+ another `ScrollArea`. Put messages (`Bubble`s) directly inside.
290
+
291
+ ## Catalogue pages: ShowcaseCard, ChoiceCard, facet filters
292
+
293
+ - `ShowcaseCard` opens something; `ChoiceCard` chooses something (a toggle button with
294
+ `aria-pressed`). For a router link pass `open={{ link: (title) => <Link to=…>{title}</Link> }}`,
295
+ not `href` (which reloads the page).
296
+ - The facet filters (`FiltersPanel`, `FiltersPill`, `ActiveFilters`) count nothing and
297
+ translate nothing: the app passes groups with counts, the selection and every label.
298
+ Use `useFiltersCollapsed()` for the panel/pill state and pass
299
+ `animate={!supportsViewTransitions}`.
300
+
301
+ ## Chart legends and distribution bars
302
+
303
+ - Every chart takes `legendLayout="inline" | "rows" | "columns"` (default `inline`) with
304
+ `showLegend`. `rows` / `columns` render below the chart: swatch, label, value aligned
305
+ right. `columns` (`legendColumns`, default 2) drops to one column under a 28rem-wide legend;
306
+ do not add media queries for it.
307
+ - `legendValue="value" | "percent" | "both" | "none"`. Cartesian charts show each
308
+ series' **total across `data`**; pass `legendValue="none"` where a sum means nothing
309
+ (e.g. temperatures on a `LineChart`).
310
+ - A single distribution bar is `BarChart` with `layout="vertical" stacked segmented
311
+ hideXAxis hideYAxis`, one data row, and a small plot height such as
312
+ `className="aspect-auto h-3.5"`. `className` sizes the plot only; the list legend adds
313
+ its own height below it.
314
+
144
315
  ## Bundle size and tooling (what agents should assume)
145
316
 
146
- - The published library is **pre-bundled ESM** (tsup). Consumers receive **large `dist` chunks**, not one file per source component.
317
+ - The published library is **pre-built ESM with one module per source file**; production bundlers drop components an app does not import.
147
318
  - **Tree-shaking:** Bundlers can often drop **unused named exports**, but anything **statically reachable** from an imported symbol remains — including shared chunks and **eager inlined assets** (e.g. Lottie animations with `AnimatedCard`, SVG strings with `Illustration`, embedded images as data URLs).
148
319
  - A **Babel** log such as "deoptimised the styling … exceeds the max of 500KB" on a file under `node_modules/…/dist/` is usually **informational** (Babel compact output for huge files), not a build failure.
149
- - When suggesting "smaller bundles," recommend **subpath entry points**, **optional peers only as needed**, and **avoiding heavy components on critical routes** — not inventing non-exported deep imports.
320
+ - When suggesting "smaller bundles," recommend **the narrowest entry point** (`/components/<folder>`, grouped paths), **optional peers only as needed**, and **avoiding heavy components on critical routes** — not inventing non-exported deep imports.
150
321
 
151
322
  ## Removed APIs — do not reintroduce
152
323
 
@@ -13,14 +13,19 @@ Use only paths declared under `package.json` → `exports`:
13
13
  |---------|---------|
14
14
  | `@espressif/dashboard-ui-components` | Root barrel: re-exports **components**, **common**, and **layouts**. Use only when the app intentionally pulls from multiple surfaces; otherwise prefer narrower subpaths below. |
15
15
  | `@espressif/dashboard-ui-components/components` | Public UI components and their types. |
16
+ | `@espressif/dashboard-ui-components/components/<folder>` | One component folder (`/components/button`, `/components/dialog`, …): the same names and objects `/components` exports for it. **Prefer this.** |
17
+ | `@espressif/dashboard-ui-components/charts` · `/data-table` · `/markdown` · `/date` · `/carousel` · `/forms` · `/animation` · `/toast` | One heavy family (recharts, tanstack, react-markdown + shiki, react-day-picker, embla, react-hook-form, lottie, sonner). |
16
18
  | `@espressif/dashboard-ui-components/layouts` | `WorkspaceLayout`, `EntryLayout`, and related layout exports. |
17
19
  | `@espressif/dashboard-ui-components/common` | Shared blocks (e.g. `AppLogo`, `ProfileCard`, `FooterCard`). |
18
20
  | `@espressif/dashboard-ui-components/utils` | Utilities such as `cn`. |
19
- | `@espressif/dashboard-ui-components/styles` | Global CSS (design tokens / base styles). |
21
+ | `@espressif/dashboard-ui-components/styles` | Global CSS: Tailwind + every token + base page styles. |
22
+ | `@espressif/dashboard-ui-components/theme.css` | Tokens only (no `@import "tailwindcss"`, no Preflight, no page styles), for apps that bring their own Tailwind. |
20
23
  | `@espressif/dashboard-ui-components/tailwind-preset` | Tailwind v4 preset. |
21
24
 
22
25
  **Do not** import from deep paths that are not in `exports` (they will fail under strict package managers or break without warning). **Do not** treat `@espressif/dashboard-ui-components/core` as a supported app API: it exists in `exports` for technical reasons, but this repo’s policy is that **consumers must not import `core`** — use composed exports from `/components` (see project overview rule).
23
26
 
27
+ **Import from the narrowest path you can**: `/components/<folder>` for one component, a grouped path for a heavy family, a surface (`/components`, `/layouts`, …) only when importing many. Tests and dev servers evaluate everything an entry reaches. Entries that include Toast (`/toast`, `/components/toast`, `/components`, root) import sonner's CSS from JS; the others do no work at import time.
28
+
24
29
  ## Import style
25
30
 
26
31
  - Prefer **named imports**: `import { Button, Alert } from '…/components'`.
@@ -33,6 +38,7 @@ Use only paths declared under `package.json` → `exports`:
33
38
  Do **not** invent component or prop names from memory. The authoritative list of exports and their props is the shipped type declarations:
34
39
 
35
40
  - Components: `node_modules/@espressif/dashboard-ui-components/dist/components/index.d.ts`
41
+ - One component folder: `…/dist/components/<folder>/index.d.ts`; grouped entries: `…/dist/<group>/index.d.ts`
36
42
  - Layouts / common / utils: the sibling `dist/<surface>/index.d.ts` files
37
43
  - The README "Available Components" table for a human-readable overview
38
44
 
@@ -57,6 +63,16 @@ export function Example() {
57
63
  }
58
64
  ```
59
65
 
66
+ ## Styling and theming
67
+
68
+ - Add the library's styles once in your Tailwind v4 entry CSS: `@import "@espressif/dashboard-ui-components/styles";`. It already declares the `@source` for `dist/`.
69
+ - Retheme by redeclaring the CSS custom properties (design tokens) **after** the `@import`, in both `:root` and `.dark` (or `[data-theme="dark"]`). Override `--font-sans` / `--font-mono` inside an `@theme` block.
70
+ - Pick `./theme.css` instead of `./styles` only when the app has its own `@import "tailwindcss"` (or legacy CSS a reset would break); then the app styles `body` itself.
71
+ - Dark mode applies under `.dark` **or** `[data-theme="dark"]` on an ancestor; override dark tokens under the selector the app uses. The library has no `prefers-color-scheme` handling.
72
+ - `MinimalWorkspaceLayout` (from `/layouts`) is the header-less alternative to `WorkspaceLayout` with the same props: switch by renaming the component. It has no header bar or status footer (`footerConfig`, `hideBreadcrumbs`, `sidebarConfig.allowCollapsible` / `variant` do not exist on it), starts collapsed (`defaultSidebarOpen` defaults to `false`), and puts `topRightContent` (fallback `headerConfig.rightContent`) over the content. Theme it with the `--espd-minimal-workspace-layout-*` tokens, not `className` overrides on its parts: the sidebar surface defaults to the page background (`-sidebar-background`, `-sidebar-background-expanded`), and its border, shadow and row accent are derived from that surface unless `-sidebar-border-color`, `-sidebar-elevation` or `-sidebar-accent` are set. Keep `-sidebar-width-collapsed` within 48–56px. With `sidebarConfig.hideWhenCollapsed` the collapsed sidebar is hidden instead of a rail: a click on the content's left edge peeks it over the content until the pointer leaves it, and `MinimalWorkspaceSidebarTrigger` (from `/layouts`, placed in `topRightContent`) opens it inline; a peek never reaches `onSidebarOpenChange`. Do not build an edge or trigger in the app. The edge strip and the peek shadow are `-edge-color`, `-edge-width` and `-sidebar-overlay-elevation`.
73
+ - Beyond colour, retheme with the semantic tokens on `:root` (and the style-axis role tokens, next section): `--espd-control-height-sm|md|lg`, `--espd-button-padding-x-sm|md|lg`, `--espd-duration-fast|normal|slow`, `--espd-ring-width`, `--espd-ring-offset`, `--espd-on-solid-foreground` (plus Tailwind's `--radius-*`, `--shadow-*`, `--spacing`). Do not add new token names in app CSS.
74
+ - New variants (e.g. `glow`) are registered, not forked: augment `interface VariantRegistry` in `declare module '@espressif/dashboard-ui-components/components'` (in a file that imports that entry) and call `registerVariant('glow', (color) => ({ container, foreground, description }))` once at start-up. Built-in variants cannot be replaced.
75
+
60
76
  ## Removed APIs — do not reintroduce
61
77
 
62
78
  Earlier internal versions of this library are **not** representative of the public package. Do not add these back based on prior knowledge:
@@ -66,6 +82,49 @@ Earlier internal versions of this library are **not** representative of the publ
66
82
 
67
83
  If code references any of the above, it is targeting an old version — update it to the current API rather than re-adding the removed symbols.
68
84
 
85
+ ## Shape, elevation, border and density (style axes)
86
+
87
+ Change corner radius, shadow, border width or density with the library's axes, not with
88
+ `className` overrides on every component:
89
+
90
+ - **A kind of component, app-wide:** set a **role token** in CSS after the `@import`:
91
+ `--espd-radius-{control|surface|overlay|pill|item}`,
92
+ `--espd-elevation-{control|surface|overlay}`, `--espd-border-width-{control|surface}`.
93
+ Unset means each component keeps its own look. Overlays render in portals, so set overlay
94
+ tokens on `:root`, not on a wrapper.
95
+ - **A subtree, from React:** `<StyleScope radius={{ control: "full" }} elevation={{ surface: "none" }} density="compact">`
96
+ (from `/components/style-scope`). It sets the same tokens on a `display: contents` wrapper.
97
+ - **One component:** the `radius`, `elevation` and `border` props, where the component's
98
+ type declares them (check its `.d.ts`; not every component takes every axis). They affect
99
+ that component only, never the components nested inside it. The date pickers' `radius` is
100
+ the trigger's; their calendar popover takes `popoverRadius` / `popoverElevation`.
101
+ - **Density:** `density="compact" | "default" | "comfortable"` on Table, DataTable, Card, List,
102
+ SimpleList, FiltersBar, Sidebar, DialogContent, SheetContent, or on `StyleScope`. It also sets
103
+ `--espd-gap-field` (FormItem) and `--espd-gap-stack` (DialogContent); for a form, wrap it in
104
+ `StyleScope density` (Form renders no element).
105
+
106
+ Precedence: `className` > instance prop > role token > the component's own default.
107
+
108
+ Things agents get wrong:
109
+
110
+ - An elevation token takes a `box-shadow` value: use `0 0 #0000` for "flat", **not** `none`
111
+ (it would also remove focus rings). The `elevation="none"` prop already does this.
112
+ - Older props still work: `rounded` (Input, InputOTP, FileInput, Tag, date pickers) equals
113
+ `radius="full"`; `noShadow` / `noBorder` (SimpleCard). When both are passed, `radius` /
114
+ `elevation` / `border` win. Prefer the new props in new code.
115
+ - Instance props need the library stylesheet (`./styles` or `./theme.css`).
116
+ - New values are registered, not invented: augment `RadiusRegistry` / `ElevationRegistry` /
117
+ `BorderRegistry` / `DensityRegistry` in `declare module '@espressif/dashboard-ui-components/components'`
118
+ and call `registerStyleValue(axis, name, css)` or `registerDensity(name, tokens)` once at
119
+ start-up. Built-ins cannot be replaced.
120
+
121
+ ## Buttons
122
+
123
+ - Use the styled `Button` from `/components` (or `/components/button`). `/core` has an uncoloured base `Button` with the same name: not for apps.
124
+ - `fullWidth` **defaults to `true`**; pass `fullWidth={false}` for an inline button.
125
+ - For a link that looks like a button use `asChild`, never a Button that navigates in `onClick`:
126
+ `<Button asChild startIcon={<Plus />}><Link to="/new">Add</Link></Button>`. With `disabled`/`loading` the link gets `aria-disabled`, `tabIndex={-1}` and its clicks are cancelled.
127
+
69
128
  ## Optional peer dependencies
70
129
 
71
130
  Install only when the feature is used:
@@ -77,7 +136,7 @@ Install only when the feature is used:
77
136
  | `shiki` | `Code` / syntax highlighting |
78
137
  | `recharts` | Chart components |
79
138
 
80
- Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4 per project docs).
139
+ Required peers for any usage: `react`, `react-dom`, `tailwindcss` (v4.1+ per project docs).
81
140
 
82
141
  Do **not** tell users to install `react-markdown`, `remark-gfm`, or `rehype-slug` for
83
142
  `MarkdownContent` — they are regular dependencies of this package and install with it.
@@ -138,12 +197,112 @@ Things agents get wrong about it:
138
197
  if that matters.
139
198
  - `className` / `style` style the editor box, not the `<textarea>`.
140
199
 
200
+ ## Coverflow, Carousel or CardRail
201
+
202
+ - `Coverflow` (from `/components`): a 3D ring of image cards with a glass reflection and a
203
+ caption node per item, for a showcase of a few pictures (featured projects, boards).
204
+ `Carousel`: plain slides of any content in a strip. `CardRail`: a scrolling row of cards
205
+ that shows several at once.
206
+ - Items are `{ id, name, image?, imageAlt?, caption? }`; `name` is the accessible name.
207
+ Without `onOpen` the front card is a picture, not a button.
208
+ - `renderFace` is drawn **twice** (the card and its reflection): return a picture only —
209
+ nothing focusable, no `id`s. It receives `{ offset, visible }`; render expensive faces only
210
+ while `visible`.
211
+ - It draws no background. The reflection only reads on a dark floor: wrap it in a `.dark`
212
+ scope with `bg-background` (or any dark surface). Size comes from `aspect`
213
+ (`landscape` 4:3, `square`); do not set the stage height through `className`.
214
+ - The reflection fade uses `mask-*` utilities, which need Tailwind **4.1+**.
215
+
216
+ ## CategoryCard or SimpleClickableCard
217
+
218
+ - `CategoryCard` (from `/components`): a "browse by kind" card, stacked: icon tile, a count
219
+ (`value`) in the corner, name, one line, a few `tags`. `SimpleClickableCard`: one action in a
220
+ row with a chevron. Prop names match where they mean the same (`icon`, `title`,
221
+ `description`, `color`, `radius`, `onClick`).
222
+ - It sizes itself by its own width (a container query): below 12rem it tightens and drops the
223
+ tags. Do not hide the tags per breakpoint in the app.
224
+ - A filter row passes `selected` (gives `aria-pressed`); a navigating row passes `href` (a real
225
+ link) and leaves `selected` unset. Pass `aria-label` when the name to read is richer than
226
+ the visible text ("Show only Drivers, 65 blocks").
227
+ - Token tints the colour presets lack (the swatches) go in `iconClassName`, which replaces
228
+ `color` (do not pass both).
229
+
230
+ ## PopoverGroup — one hover preview across many items
231
+
232
+ - Wrap a grid or row of `Popover openOnHover` items in `PopoverGroup` (from `/components`) so
233
+ only one is open: the first opens after the popover's `openDelay`, another takes over only
234
+ after the pointer rests `switchDelay` (default 350 ms) on it, and reaching the open content
235
+ cancels a pending switch — so a diagonal path to the panel never switches it. Do not build
236
+ hover-intent timers in the app.
237
+ - Give each `Popover` a `value` when the app needs to know which is open; read it from the
238
+ group's `value` / `onValueChange` (a member's own `onOpenChange` does not fire when another
239
+ takes over). A `Popover` with an explicit `open` stays outside the group.
240
+ - Click still pins, Escape and an outside press close, and a hover-opened panel never takes
241
+ focus — the same as a lone `openOnHover` popover.
242
+
243
+ ## FlipCard
244
+
245
+ - `FlipCard` (from `/components`): two faces, controlled by `flipped`; each change moves the
246
+ same way, never back. `effect="turn"` (default) turns it over (`axis="x"` a split-flap, `"y"`
247
+ a page); `effect="slide"` slides the showing face out while the next follows it in (`x` down,
248
+ `y` sideways). To show a stream of items in one slot, load the next item into the hidden
249
+ face, then toggle `flipped`.
250
+ - The hidden face is `aria-hidden` and `inert`. Size the card from its parent or `className`;
251
+ the faces fill it (`faceClassName` styles both). Timing (`duration-*`, `ease-*`, `delay-*`)
252
+ goes in `turnClassName`.
253
+ - `onFlipEnd` fires when a turn finishes — at once under reduced motion, where the faces swap
254
+ without turning.
255
+
256
+ ## Work areas: Toolbar, resizable panels, floating windows
257
+
258
+ - `Toolbar` (from `/components`) takes `start` / `center` / `end` nodes; fill them with
259
+ `ToolbarButton`s (28px, icon-only: `label` is the accessible name AND the tooltip). Do not
260
+ add arrow-key handling: the toolbar already moves focus between its controls.
261
+ - `ResizableGroup` fills its parent: give the parent a height. Children alternate
262
+ `ResizablePanel` / `ResizableSeparator`; every panel needs an `id`, and `defaultLayout`'s keys
263
+ are those ids (percentages). Persist `onLayoutChanged`, not the live drag. Sizes are
264
+ `PanelSize`: a number is pixels, a unitless string a percentage (`"20"`).
265
+ - A panel that is shown and hidden by a flag is `ColumnPanel` (`open`, `openSize`), not a
266
+ conditional render: it stays mounted (state survives) and goes `inert` when hidden. For your
267
+ own collapsible `ResizablePanel`, pass `usePanelFlag(open, openSize)` as its `panelRef`.
268
+ - `FloatingWindow` does not keep its own position: hold `position` in the app (null = default
269
+ spot) and store what `onMove` hands back. Minimized it renders only its pill.
270
+ - `AnchoredPanel` is non-modal and positioned by a zero-size anchor element the app keeps at
271
+ the point (`anchorRef`); pass `keepOpenFor` for the control that toggles it, or that
272
+ control's own click closes and reopens it.
273
+ - `MessageScroller` scrolls itself: give it a height or a flex parent; do not wrap it in
274
+ another `ScrollArea`. Put messages (`Bubble`s) directly inside.
275
+
276
+ ## Catalogue pages: ShowcaseCard, ChoiceCard, facet filters
277
+
278
+ - `ShowcaseCard` opens something; `ChoiceCard` chooses something (a toggle button with
279
+ `aria-pressed`). For a router link pass `open={{ link: (title) => <Link to=…>{title}</Link> }}`,
280
+ not `href` (which reloads the page).
281
+ - The facet filters (`FiltersPanel`, `FiltersPill`, `ActiveFilters`) count nothing and
282
+ translate nothing: the app passes groups with counts, the selection and every label.
283
+ Use `useFiltersCollapsed()` for the panel/pill state and pass
284
+ `animate={!supportsViewTransitions}`.
285
+
286
+ ## Chart legends and distribution bars
287
+
288
+ - Every chart takes `legendLayout="inline" | "rows" | "columns"` (default `inline`) with
289
+ `showLegend`. `rows` / `columns` render below the chart: swatch, label, value aligned
290
+ right. `columns` (`legendColumns`, default 2) drops to one column under a 28rem-wide legend;
291
+ do not add media queries for it.
292
+ - `legendValue="value" | "percent" | "both" | "none"`. Cartesian charts show each
293
+ series' **total across `data`**; pass `legendValue="none"` where a sum means nothing
294
+ (e.g. temperatures on a `LineChart`).
295
+ - A single distribution bar is `BarChart` with `layout="vertical" stacked segmented
296
+ hideXAxis hideYAxis`, one data row, and a small plot height such as
297
+ `className="aspect-auto h-3.5"`. `className` sizes the plot only; the list legend adds
298
+ its own height below it.
299
+
141
300
  ## Bundle size and tooling (what agents should assume)
142
301
 
143
- - The published library is **pre-bundled ESM** (tsup). Consumers receive **large `dist` chunks**, not one file per source component.
302
+ - The published library is **pre-built ESM with one module per source file**; production bundlers drop components an app does not import.
144
303
  - **Tree-shaking:** Bundlers can often drop **unused named exports**, but anything **statically reachable** from an imported symbol remains — including shared chunks and **eager inlined assets** (e.g. many Lottie animations with `AnimatedCard`, SVG strings with `Illustration`, embedded images where the build uses data URLs).
145
304
  - A **Babel** log such as “deoptimised the styling … exceeds the max of 500KB” on a file under `node_modules/…/dist/` is usually **informational** (Babel compact output for huge files), not a signal that the build is invalid.
146
- - When suggesting “smaller bundles,” recommend **subpath entry points**, **optional peers only as needed**, and **avoiding heavy components on critical routes** — not inventing non-exported deep imports.
305
+ - When suggesting “smaller bundles,” recommend **the narrowest entry point** (`/components/<folder>`, grouped paths), **optional peers only as needed**, and **avoiding heavy components on critical routes** — not inventing non-exported deep imports.
147
306
 
148
307
  ## Demo vs consumer code
149
308