@nadicodeai/ui 12.1.96 → 12.1.97

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 (566) hide show
  1. package/AGENTS.md +5 -1
  2. package/dist/components/accordion.d.ts +13 -0
  3. package/dist/components/accordion.d.ts.map +1 -1
  4. package/dist/components/accordion.js +13 -0
  5. package/dist/components/account-menu.d.ts +62 -18
  6. package/dist/components/account-menu.d.ts.map +1 -1
  7. package/dist/components/account-menu.js +32 -8
  8. package/dist/components/action-menu.d.ts +61 -5
  9. package/dist/components/action-menu.d.ts.map +1 -1
  10. package/dist/components/action-menu.js +31 -2
  11. package/dist/components/action-status.d.ts +13 -3
  12. package/dist/components/action-status.d.ts.map +1 -1
  13. package/dist/components/action-status.js +13 -3
  14. package/dist/components/activity-calendar.d.ts +14 -0
  15. package/dist/components/activity-calendar.d.ts.map +1 -1
  16. package/dist/components/activity-calendar.js +14 -0
  17. package/dist/components/activity-feed.d.ts +62 -0
  18. package/dist/components/activity-feed.d.ts.map +1 -0
  19. package/dist/components/activity-feed.js +54 -0
  20. package/dist/components/agent-card.d.ts +15 -0
  21. package/dist/components/agent-card.d.ts.map +1 -1
  22. package/dist/components/agent-card.js +15 -0
  23. package/dist/components/agent-list-row.d.ts +11 -7
  24. package/dist/components/agent-list-row.d.ts.map +1 -1
  25. package/dist/components/agent-list-row.js +10 -8
  26. package/dist/components/agent-orb.d.ts +16 -0
  27. package/dist/components/agent-orb.d.ts.map +1 -1
  28. package/dist/components/agent-orb.js +16 -0
  29. package/dist/components/agent-profile.d.ts +39 -10
  30. package/dist/components/agent-profile.d.ts.map +1 -1
  31. package/dist/components/agent-profile.js +39 -10
  32. package/dist/components/alert-dialog.d.ts +14 -0
  33. package/dist/components/alert-dialog.d.ts.map +1 -1
  34. package/dist/components/alert-dialog.js +14 -0
  35. package/dist/components/alert.d.ts +14 -0
  36. package/dist/components/alert.d.ts.map +1 -1
  37. package/dist/components/alert.js +14 -0
  38. package/dist/components/app-mark.d.ts +14 -4
  39. package/dist/components/app-mark.d.ts.map +1 -1
  40. package/dist/components/app-mark.js +13 -3
  41. package/dist/components/approval-row.d.ts +15 -2
  42. package/dist/components/approval-row.d.ts.map +1 -1
  43. package/dist/components/approval-row.js +15 -2
  44. package/dist/components/aspect-ratio.d.ts +10 -0
  45. package/dist/components/aspect-ratio.d.ts.map +1 -1
  46. package/dist/components/aspect-ratio.js +10 -0
  47. package/dist/components/avatar.d.ts +15 -0
  48. package/dist/components/avatar.d.ts.map +1 -1
  49. package/dist/components/avatar.js +15 -0
  50. package/dist/components/badge.d.ts +11 -1
  51. package/dist/components/badge.d.ts.map +1 -1
  52. package/dist/components/badge.js +10 -5
  53. package/dist/components/brand-field.d.ts +10 -0
  54. package/dist/components/brand-field.d.ts.map +1 -1
  55. package/dist/components/brand-field.js +10 -0
  56. package/dist/components/brand.d.ts +14 -0
  57. package/dist/components/brand.d.ts.map +1 -1
  58. package/dist/components/brand.js +14 -0
  59. package/dist/components/breadcrumb.d.ts +20 -2
  60. package/dist/components/breadcrumb.d.ts.map +1 -1
  61. package/dist/components/breadcrumb.js +13 -3
  62. package/dist/components/button-group.d.ts +21 -0
  63. package/dist/components/button-group.d.ts.map +1 -1
  64. package/dist/components/button-group.js +21 -0
  65. package/dist/components/button.d.ts +20 -0
  66. package/dist/components/button.d.ts.map +1 -1
  67. package/dist/components/button.js +20 -0
  68. package/dist/components/calendar.d.ts +15 -0
  69. package/dist/components/calendar.d.ts.map +1 -1
  70. package/dist/components/calendar.js +15 -0
  71. package/dist/components/card-row.d.ts +15 -5
  72. package/dist/components/card-row.d.ts.map +1 -1
  73. package/dist/components/card-row.js +15 -5
  74. package/dist/components/card.d.ts +16 -0
  75. package/dist/components/card.d.ts.map +1 -1
  76. package/dist/components/card.js +16 -0
  77. package/dist/components/carousel.d.ts +12 -0
  78. package/dist/components/carousel.d.ts.map +1 -1
  79. package/dist/components/carousel.js +12 -0
  80. package/dist/components/catalog-drawer.d.ts +29 -0
  81. package/dist/components/catalog-drawer.d.ts.map +1 -0
  82. package/dist/components/catalog-drawer.js +31 -0
  83. package/dist/components/catalog-entry.d.ts +49 -26
  84. package/dist/components/catalog-entry.d.ts.map +1 -1
  85. package/dist/components/catalog-entry.js +5 -27
  86. package/dist/components/channel-view.d.ts +23 -0
  87. package/dist/components/channel-view.d.ts.map +1 -1
  88. package/dist/components/channel-view.js +13 -4
  89. package/dist/components/chart-area-stacked.d.ts +11 -1
  90. package/dist/components/chart-area-stacked.d.ts.map +1 -1
  91. package/dist/components/chart-area-stacked.js +12 -2
  92. package/dist/components/chart-bar-horizontal.d.ts +11 -1
  93. package/dist/components/chart-bar-horizontal.d.ts.map +1 -1
  94. package/dist/components/chart-bar-horizontal.js +12 -2
  95. package/dist/components/chart-bar-multiple.d.ts +9 -4
  96. package/dist/components/chart-bar-multiple.d.ts.map +1 -1
  97. package/dist/components/chart-bar-multiple.js +10 -5
  98. package/dist/components/chart-bar-stacked.d.ts +11 -1
  99. package/dist/components/chart-bar-stacked.d.ts.map +1 -1
  100. package/dist/components/chart-bar-stacked.js +12 -2
  101. package/dist/components/chart-card.d.ts +33 -20
  102. package/dist/components/chart-card.d.ts.map +1 -1
  103. package/dist/components/chart-card.js +18 -4
  104. package/dist/components/chart-date-range-control.d.ts +15 -10
  105. package/dist/components/chart-date-range-control.d.ts.map +1 -1
  106. package/dist/components/chart-date-range-control.js +14 -10
  107. package/dist/components/chart-date-range.d.ts.map +1 -1
  108. package/dist/components/chart-entity-colors.d.ts +7 -0
  109. package/dist/components/chart-entity-colors.d.ts.map +1 -1
  110. package/dist/components/chart-entity-colors.js +7 -0
  111. package/dist/components/chart-sparkline.d.ts +10 -0
  112. package/dist/components/chart-sparkline.d.ts.map +1 -1
  113. package/dist/components/chart-sparkline.js +8 -7
  114. package/dist/components/chart.d.ts +10 -0
  115. package/dist/components/chart.d.ts.map +1 -1
  116. package/dist/components/chart.js +10 -0
  117. package/dist/components/checkbox.d.ts +15 -0
  118. package/dist/components/checkbox.d.ts.map +1 -1
  119. package/dist/components/checkbox.js +15 -0
  120. package/dist/components/code-block.d.ts +15 -0
  121. package/dist/components/code-block.d.ts.map +1 -1
  122. package/dist/components/code-block.js +15 -0
  123. package/dist/components/collapsible.d.ts +12 -0
  124. package/dist/components/collapsible.d.ts.map +1 -1
  125. package/dist/components/collapsible.js +12 -0
  126. package/dist/components/collection-filters.d.ts +15 -2
  127. package/dist/components/collection-filters.d.ts.map +1 -1
  128. package/dist/components/collection-filters.js +13 -1
  129. package/dist/components/collection-page.d.ts +29 -115
  130. package/dist/components/collection-page.d.ts.map +1 -1
  131. package/dist/components/collection-page.js +24 -140
  132. package/dist/components/collection-search.d.ts +14 -0
  133. package/dist/components/collection-search.d.ts.map +1 -1
  134. package/dist/components/collection-search.js +14 -0
  135. package/dist/components/collection-sort.d.ts +13 -3
  136. package/dist/components/collection-sort.d.ts.map +1 -1
  137. package/dist/components/collection-sort.js +13 -3
  138. package/dist/components/collection-toolbar.d.ts +13 -0
  139. package/dist/components/collection-toolbar.d.ts.map +1 -1
  140. package/dist/components/collection-toolbar.js +13 -0
  141. package/dist/components/combobox.d.ts +17 -0
  142. package/dist/components/combobox.d.ts.map +1 -1
  143. package/dist/components/combobox.js +17 -0
  144. package/dist/components/command.d.ts +16 -0
  145. package/dist/components/command.d.ts.map +1 -1
  146. package/dist/components/command.js +16 -0
  147. package/dist/components/company-card.d.ts +16 -4
  148. package/dist/components/company-card.d.ts.map +1 -1
  149. package/dist/components/company-card.js +16 -4
  150. package/dist/components/confirm-dialog.d.ts +24 -14
  151. package/dist/components/confirm-dialog.d.ts.map +1 -1
  152. package/dist/components/confirm-dialog.js +16 -10
  153. package/dist/components/context-menu.d.ts +10 -0
  154. package/dist/components/context-menu.d.ts.map +1 -1
  155. package/dist/components/context-menu.js +10 -0
  156. package/dist/components/copy-button.d.ts +10 -0
  157. package/dist/components/copy-button.d.ts.map +1 -1
  158. package/dist/components/copy-button.js +10 -0
  159. package/dist/components/dashboard-shell.d.ts +14 -0
  160. package/dist/components/dashboard-shell.d.ts.map +1 -1
  161. package/dist/components/dashboard-shell.js +14 -0
  162. package/dist/components/data-table.d.ts +20 -0
  163. package/dist/components/data-table.d.ts.map +1 -1
  164. package/dist/components/data-table.js +23 -2
  165. package/dist/components/desktop-shell.d.ts +15 -0
  166. package/dist/components/desktop-shell.d.ts.map +1 -1
  167. package/dist/components/desktop-shell.js +15 -0
  168. package/dist/components/dialog.d.ts +16 -0
  169. package/dist/components/dialog.d.ts.map +1 -1
  170. package/dist/components/dialog.js +16 -0
  171. package/dist/components/diff-count.d.ts +11 -0
  172. package/dist/components/diff-count.d.ts.map +1 -1
  173. package/dist/components/diff-count.js +11 -0
  174. package/dist/components/disclosure-row.d.ts +12 -0
  175. package/dist/components/disclosure-row.d.ts.map +1 -1
  176. package/dist/components/disclosure-row.js +12 -0
  177. package/dist/components/disclosure.d.ts +15 -5
  178. package/dist/components/disclosure.d.ts.map +1 -1
  179. package/dist/components/disclosure.js +15 -5
  180. package/dist/components/drawer.d.ts +13 -0
  181. package/dist/components/drawer.d.ts.map +1 -1
  182. package/dist/components/drawer.js +13 -0
  183. package/dist/components/dropdown-menu.d.ts +17 -5
  184. package/dist/components/dropdown-menu.d.ts.map +1 -1
  185. package/dist/components/dropdown-menu.js +20 -7
  186. package/dist/components/empty-art.d.ts +1 -1
  187. package/dist/components/empty-art.d.ts.map +1 -1
  188. package/dist/components/empty-art.js +6 -0
  189. package/dist/components/empty-state.d.ts +24 -10
  190. package/dist/components/empty-state.d.ts.map +1 -1
  191. package/dist/components/empty-state.js +23 -1
  192. package/dist/components/entry-scene.d.ts +33 -20
  193. package/dist/components/entry-scene.d.ts.map +1 -1
  194. package/dist/components/entry-scene.js +34 -7
  195. package/dist/components/expandable-block.d.ts +10 -0
  196. package/dist/components/expandable-block.d.ts.map +1 -1
  197. package/dist/components/expandable-block.js +10 -0
  198. package/dist/components/field.d.ts +17 -0
  199. package/dist/components/field.d.ts.map +1 -1
  200. package/dist/components/field.js +17 -0
  201. package/dist/components/file-diff.d.ts +12 -0
  202. package/dist/components/file-diff.d.ts.map +1 -1
  203. package/dist/components/file-diff.js +12 -0
  204. package/dist/components/file-type-icon.d.ts +12 -0
  205. package/dist/components/file-type-icon.d.ts.map +1 -1
  206. package/dist/components/file-type-icon.js +12 -0
  207. package/dist/components/footer.d.ts +14 -0
  208. package/dist/components/footer.d.ts.map +1 -1
  209. package/dist/components/footer.js +14 -0
  210. package/dist/components/form-dialog.d.ts +10 -0
  211. package/dist/components/form-dialog.d.ts.map +1 -1
  212. package/dist/components/form-dialog.js +10 -0
  213. package/dist/components/form-drawer.d.ts +24 -11
  214. package/dist/components/form-drawer.d.ts.map +1 -1
  215. package/dist/components/form-drawer.js +13 -3
  216. package/dist/components/form.d.ts +17 -0
  217. package/dist/components/form.d.ts.map +1 -1
  218. package/dist/components/form.js +17 -0
  219. package/dist/components/glass-control.d.ts +13 -0
  220. package/dist/components/glass-control.d.ts.map +1 -1
  221. package/dist/components/glass-control.js +13 -0
  222. package/dist/components/hive-scene.d.ts +14 -0
  223. package/dist/components/hive-scene.d.ts.map +1 -1
  224. package/dist/components/hive-scene.js +14 -0
  225. package/dist/components/house-icons.d.ts +15 -0
  226. package/dist/components/house-icons.d.ts.map +1 -1
  227. package/dist/components/house-icons.js +15 -0
  228. package/dist/components/hover-card.d.ts +15 -0
  229. package/dist/components/hover-card.d.ts.map +1 -1
  230. package/dist/components/hover-card.js +15 -0
  231. package/dist/components/identity-mark.d.ts +55 -0
  232. package/dist/components/identity-mark.d.ts.map +1 -0
  233. package/dist/components/identity-mark.js +66 -0
  234. package/dist/components/input-group.d.ts +16 -0
  235. package/dist/components/input-group.d.ts.map +1 -1
  236. package/dist/components/input-group.js +16 -0
  237. package/dist/components/input-otp.d.ts +15 -0
  238. package/dist/components/input-otp.d.ts.map +1 -1
  239. package/dist/components/input-otp.js +15 -0
  240. package/dist/components/input.d.ts +15 -0
  241. package/dist/components/input.d.ts.map +1 -1
  242. package/dist/components/input.js +15 -0
  243. package/dist/components/item.d.ts +16 -0
  244. package/dist/components/item.d.ts.map +1 -1
  245. package/dist/components/item.js +16 -0
  246. package/dist/components/kbd.d.ts +14 -0
  247. package/dist/components/kbd.d.ts.map +1 -1
  248. package/dist/components/kbd.js +14 -0
  249. package/dist/components/kpi-card.d.ts +21 -13
  250. package/dist/components/kpi-card.d.ts.map +1 -1
  251. package/dist/components/kpi-card.js +14 -3
  252. package/dist/components/label-system.d.ts +12 -0
  253. package/dist/components/label-system.d.ts.map +1 -1
  254. package/dist/components/label-system.js +12 -0
  255. package/dist/components/label.d.ts +15 -0
  256. package/dist/components/label.d.ts.map +1 -1
  257. package/dist/components/label.js +15 -0
  258. package/dist/components/library-shelf.d.ts +35 -0
  259. package/dist/components/library-shelf.d.ts.map +1 -0
  260. package/dist/components/library-shelf.js +40 -0
  261. package/dist/components/memory-item.d.ts +12 -0
  262. package/dist/components/memory-item.d.ts.map +1 -1
  263. package/dist/components/memory-item.js +12 -0
  264. package/dist/components/menu-choice-row.d.ts +13 -5
  265. package/dist/components/menu-choice-row.d.ts.map +1 -1
  266. package/dist/components/menu-choice-row.js +12 -6
  267. package/dist/components/menubar.d.ts +13 -0
  268. package/dist/components/menubar.d.ts.map +1 -1
  269. package/dist/components/menubar.js +13 -0
  270. package/dist/components/message-notice.d.ts +16 -0
  271. package/dist/components/message-notice.d.ts.map +1 -1
  272. package/dist/components/message-notice.js +18 -2
  273. package/dist/components/model-identity.d.ts +16 -3
  274. package/dist/components/model-identity.d.ts.map +1 -1
  275. package/dist/components/model-identity.js +16 -3
  276. package/dist/components/model-mark.d.ts +15 -2
  277. package/dist/components/model-mark.d.ts.map +1 -1
  278. package/dist/components/model-mark.js +15 -2
  279. package/dist/components/nadia-presence.d.ts +10 -4
  280. package/dist/components/nadia-presence.d.ts.map +1 -1
  281. package/dist/components/nadia-presence.js +10 -4
  282. package/dist/components/native-select.d.ts +16 -0
  283. package/dist/components/native-select.d.ts.map +1 -1
  284. package/dist/components/native-select.js +16 -0
  285. package/dist/components/navigation-menu.d.ts +14 -0
  286. package/dist/components/navigation-menu.d.ts.map +1 -1
  287. package/dist/components/navigation-menu.js +14 -0
  288. package/dist/components/notice-banner.d.ts +10 -3
  289. package/dist/components/notice-banner.d.ts.map +1 -1
  290. package/dist/components/notice-banner.js +9 -3
  291. package/dist/components/numbered-steps.d.ts +33 -0
  292. package/dist/components/numbered-steps.d.ts.map +1 -0
  293. package/dist/components/numbered-steps.js +23 -0
  294. package/dist/components/object-page.d.ts +37 -0
  295. package/dist/components/object-page.d.ts.map +1 -0
  296. package/dist/components/object-page.js +19 -0
  297. package/dist/components/object-workspace.d.ts +26 -36
  298. package/dist/components/object-workspace.d.ts.map +1 -1
  299. package/dist/components/object-workspace.js +27 -24
  300. package/dist/components/overview-page.d.ts +24 -0
  301. package/dist/components/overview-page.d.ts.map +1 -0
  302. package/dist/components/overview-page.js +26 -0
  303. package/dist/components/page-actions.d.ts +28 -23
  304. package/dist/components/page-actions.d.ts.map +1 -1
  305. package/dist/components/page-actions.js +20 -14
  306. package/dist/components/page-header.d.ts +11 -5
  307. package/dist/components/page-header.d.ts.map +1 -1
  308. package/dist/components/page-header.js +11 -5
  309. package/dist/components/pagination.d.ts +15 -0
  310. package/dist/components/pagination.d.ts.map +1 -1
  311. package/dist/components/pagination.js +15 -0
  312. package/dist/components/pairing-code.d.ts +15 -4
  313. package/dist/components/pairing-code.d.ts.map +1 -1
  314. package/dist/components/pairing-code.js +15 -4
  315. package/dist/components/pending-label.d.ts +12 -4
  316. package/dist/components/pending-label.d.ts.map +1 -1
  317. package/dist/components/pending-label.js +12 -4
  318. package/dist/components/picture-label.d.ts +15 -7
  319. package/dist/components/picture-label.d.ts.map +1 -1
  320. package/dist/components/picture-label.js +15 -7
  321. package/dist/components/platform-mark.d.ts +12 -3
  322. package/dist/components/platform-mark.d.ts.map +1 -1
  323. package/dist/components/platform-mark.js +12 -3
  324. package/dist/components/plugin-slot-boundary.d.ts +15 -0
  325. package/dist/components/plugin-slot-boundary.d.ts.map +1 -1
  326. package/dist/components/plugin-slot-boundary.js +15 -0
  327. package/dist/components/popover.d.ts +15 -0
  328. package/dist/components/popover.d.ts.map +1 -1
  329. package/dist/components/popover.js +15 -0
  330. package/dist/components/portal-sidebar-frame.d.ts +26 -12
  331. package/dist/components/portal-sidebar-frame.d.ts.map +1 -1
  332. package/dist/components/portal-sidebar-frame.js +26 -0
  333. package/dist/components/progress.d.ts +10 -8
  334. package/dist/components/progress.d.ts.map +1 -1
  335. package/dist/components/progress.js +11 -9
  336. package/dist/components/qr-code.d.ts +9 -3
  337. package/dist/components/qr-code.d.ts.map +1 -1
  338. package/dist/components/qr-code.js +9 -3
  339. package/dist/components/radio-group.d.ts +15 -0
  340. package/dist/components/radio-group.d.ts.map +1 -1
  341. package/dist/components/radio-group.js +15 -0
  342. package/dist/components/reading-column.d.ts +11 -0
  343. package/dist/components/reading-column.d.ts.map +1 -1
  344. package/dist/components/reading-column.js +11 -0
  345. package/dist/components/record-identity.d.ts +12 -7
  346. package/dist/components/record-identity.d.ts.map +1 -1
  347. package/dist/components/record-identity.js +11 -7
  348. package/dist/components/record-list.d.ts +119 -0
  349. package/dist/components/record-list.d.ts.map +1 -0
  350. package/dist/components/record-list.js +161 -0
  351. package/dist/components/record-sheet.d.ts +36 -0
  352. package/dist/components/record-sheet.d.ts.map +1 -0
  353. package/dist/components/record-sheet.js +19 -0
  354. package/dist/components/record-time.d.ts +27 -11
  355. package/dist/components/record-time.d.ts.map +1 -1
  356. package/dist/components/record-time.js +34 -12
  357. package/dist/components/resizable.d.ts +10 -0
  358. package/dist/components/resizable.d.ts.map +1 -1
  359. package/dist/components/resizable.js +10 -0
  360. package/dist/components/row-edit-form.d.ts +8 -5
  361. package/dist/components/row-edit-form.d.ts.map +1 -1
  362. package/dist/components/row-edit-form.js +8 -5
  363. package/dist/components/run-timeline.d.ts +24 -11
  364. package/dist/components/run-timeline.d.ts.map +1 -1
  365. package/dist/components/run-timeline.js +13 -6
  366. package/dist/components/scope-switcher.d.ts +11 -0
  367. package/dist/components/scope-switcher.d.ts.map +1 -1
  368. package/dist/components/scope-switcher.js +20 -9
  369. package/dist/components/scroll-area.d.ts +12 -0
  370. package/dist/components/scroll-area.d.ts.map +1 -1
  371. package/dist/components/scroll-area.js +12 -0
  372. package/dist/components/select.d.ts +16 -0
  373. package/dist/components/select.d.ts.map +1 -1
  374. package/dist/components/select.js +16 -0
  375. package/dist/components/separator.d.ts +11 -0
  376. package/dist/components/separator.d.ts.map +1 -1
  377. package/dist/components/separator.js +11 -0
  378. package/dist/components/settings-facts.d.ts +18 -1
  379. package/dist/components/settings-facts.d.ts.map +1 -1
  380. package/dist/components/settings-facts.js +20 -1
  381. package/dist/components/settings-page.d.ts +20 -0
  382. package/dist/components/settings-page.d.ts.map +1 -0
  383. package/dist/components/settings-page.js +16 -0
  384. package/dist/components/settings-section.d.ts +38 -8
  385. package/dist/components/settings-section.d.ts.map +1 -1
  386. package/dist/components/settings-section.js +33 -7
  387. package/dist/components/sheet.d.ts +16 -0
  388. package/dist/components/sheet.d.ts.map +1 -1
  389. package/dist/components/sheet.js +16 -0
  390. package/dist/components/sidebar-sections.d.ts +40 -0
  391. package/dist/components/sidebar-sections.d.ts.map +1 -0
  392. package/dist/components/sidebar-sections.js +35 -0
  393. package/dist/components/sidebar.d.ts +14 -1
  394. package/dist/components/sidebar.d.ts.map +1 -1
  395. package/dist/components/sidebar.js +13 -2
  396. package/dist/components/skeleton.d.ts +10 -0
  397. package/dist/components/skeleton.d.ts.map +1 -1
  398. package/dist/components/skeleton.js +11 -1
  399. package/dist/components/slider.d.ts +14 -0
  400. package/dist/components/slider.d.ts.map +1 -1
  401. package/dist/components/slider.js +14 -0
  402. package/dist/components/sonner.d.ts +18 -0
  403. package/dist/components/sonner.d.ts.map +1 -1
  404. package/dist/components/sonner.js +18 -0
  405. package/dist/components/status-badge.d.ts +13 -2
  406. package/dist/components/status-badge.d.ts.map +1 -1
  407. package/dist/components/status-badge.js +21 -9
  408. package/dist/components/status-dot.d.ts +12 -0
  409. package/dist/components/status-dot.d.ts.map +1 -1
  410. package/dist/components/status-dot.js +12 -0
  411. package/dist/components/status-row.d.ts +14 -0
  412. package/dist/components/status-row.d.ts.map +1 -1
  413. package/dist/components/status-row.js +14 -0
  414. package/dist/components/switch.d.ts +15 -0
  415. package/dist/components/switch.d.ts.map +1 -1
  416. package/dist/components/switch.js +15 -0
  417. package/dist/components/table-card.d.ts +16 -3
  418. package/dist/components/table-card.d.ts.map +1 -1
  419. package/dist/components/table-card.js +16 -3
  420. package/dist/components/table-value.d.ts +24 -2
  421. package/dist/components/table-value.d.ts.map +1 -1
  422. package/dist/components/table-value.js +25 -3
  423. package/dist/components/table.d.ts +16 -0
  424. package/dist/components/table.d.ts.map +1 -1
  425. package/dist/components/table.js +17 -1
  426. package/dist/components/tabs.d.ts +27 -0
  427. package/dist/components/tabs.d.ts.map +1 -1
  428. package/dist/components/tabs.js +27 -0
  429. package/dist/components/tag.d.ts +12 -2
  430. package/dist/components/tag.d.ts.map +1 -1
  431. package/dist/components/tag.js +12 -2
  432. package/dist/components/text-link.d.ts +17 -0
  433. package/dist/components/text-link.d.ts.map +1 -1
  434. package/dist/components/text-link.js +17 -0
  435. package/dist/components/textarea.d.ts +14 -0
  436. package/dist/components/textarea.d.ts.map +1 -1
  437. package/dist/components/textarea.js +14 -0
  438. package/dist/components/theme-mode-switcher.d.ts +21 -0
  439. package/dist/components/theme-mode-switcher.d.ts.map +1 -1
  440. package/dist/components/theme-mode-switcher.js +23 -1
  441. package/dist/components/toggle-group.d.ts +13 -0
  442. package/dist/components/toggle-group.d.ts.map +1 -1
  443. package/dist/components/toggle-group.js +13 -0
  444. package/dist/components/toggle.d.ts +14 -0
  445. package/dist/components/toggle.d.ts.map +1 -1
  446. package/dist/components/toggle.js +14 -0
  447. package/dist/components/tool-icon.d.ts +14 -4
  448. package/dist/components/tool-icon.d.ts.map +1 -1
  449. package/dist/components/tool-icon.js +27 -42
  450. package/dist/components/tooltip.d.ts +15 -0
  451. package/dist/components/tooltip.d.ts.map +1 -1
  452. package/dist/components/tooltip.js +15 -0
  453. package/dist/components/trend-badge.d.ts +16 -1
  454. package/dist/components/trend-badge.d.ts.map +1 -1
  455. package/dist/components/trend-badge.js +16 -7
  456. package/dist/components/update-card.d.ts +36 -0
  457. package/dist/components/update-card.d.ts.map +1 -0
  458. package/dist/components/update-card.js +28 -0
  459. package/dist/components/usage-meter.d.ts +15 -0
  460. package/dist/components/usage-meter.d.ts.map +1 -1
  461. package/dist/components/usage-meter.js +15 -0
  462. package/dist/components/waiting-line.d.ts +13 -10
  463. package/dist/components/waiting-line.d.ts.map +1 -1
  464. package/dist/components/waiting-line.js +13 -10
  465. package/dist/eslint/index.js +8 -0
  466. package/dist/eslint/rules/empty-state-owner.js +145 -0
  467. package/dist/eslint/rules/menu-owner.js +75 -0
  468. package/dist/eslint/rules/no-decorative-icon.js +164 -0
  469. package/dist/eslint/rules/page-composition.js +232 -0
  470. package/dist/eslint/rules/rendered-import.js +121 -0
  471. package/dist/eslint/strict-design-system.js +1 -1
  472. package/dist/hooks/use-hydrated.d.ts +2 -0
  473. package/dist/hooks/use-hydrated.d.ts.map +1 -0
  474. package/dist/hooks/use-hydrated.js +7 -0
  475. package/dist/index.d.ts +15 -10
  476. package/dist/index.d.ts.map +1 -1
  477. package/dist/index.js +15 -10
  478. package/dist/internal/catalog-list.d.ts +14 -0
  479. package/dist/internal/catalog-list.d.ts.map +1 -0
  480. package/dist/internal/catalog-list.js +53 -0
  481. package/dist/internal/empty.d.ts +6 -9
  482. package/dist/internal/empty.d.ts.map +1 -1
  483. package/dist/internal/empty.js +24 -22
  484. package/dist/internal/footer-strip.d.ts +0 -4
  485. package/dist/internal/footer-strip.d.ts.map +1 -1
  486. package/dist/internal/footer-strip.js +0 -4
  487. package/dist/internal/record-menu-items.d.ts +19 -0
  488. package/dist/internal/record-menu-items.d.ts.map +1 -0
  489. package/dist/internal/record-menu-items.js +20 -0
  490. package/dist/internal/settings-save.d.ts +43 -0
  491. package/dist/internal/settings-save.d.ts.map +1 -0
  492. package/dist/internal/settings-save.js +147 -0
  493. package/dist/lib/theme-mode.d.ts +1 -1
  494. package/dist/lib/theme-mode.js +1 -1
  495. package/dist/showcase/assets.d.ts +8 -0
  496. package/dist/showcase/assets.d.ts.map +1 -0
  497. package/dist/showcase/assets.js +13 -0
  498. package/dist/showcase/foundations.d.ts +2 -0
  499. package/dist/showcase/foundations.d.ts.map +1 -0
  500. package/dist/showcase/foundations.js +61 -0
  501. package/dist/showcase/samples.d.ts +21 -0
  502. package/dist/showcase/samples.d.ts.map +1 -0
  503. package/dist/showcase/samples.js +48 -0
  504. package/dist/showcase/showcase.d.ts +10 -0
  505. package/dist/showcase/showcase.d.ts.map +1 -0
  506. package/dist/showcase/showcase.js +44 -0
  507. package/dist/showcase/specimens/actions.d.ts +7 -0
  508. package/dist/showcase/specimens/actions.d.ts.map +1 -0
  509. package/dist/showcase/specimens/actions.js +15 -0
  510. package/dist/showcase/specimens/charts.d.ts +17 -0
  511. package/dist/showcase/specimens/charts.d.ts.map +1 -0
  512. package/dist/showcase/specimens/charts.js +104 -0
  513. package/dist/showcase/specimens/choices.d.ts +21 -0
  514. package/dist/showcase/specimens/choices.d.ts.map +1 -0
  515. package/dist/showcase/specimens/choices.js +68 -0
  516. package/dist/showcase/specimens/compositions.d.ts +39 -0
  517. package/dist/showcase/specimens/compositions.d.ts.map +1 -0
  518. package/dist/showcase/specimens/compositions.js +270 -0
  519. package/dist/showcase/specimens/data.d.ts +31 -0
  520. package/dist/showcase/specimens/data.d.ts.map +1 -0
  521. package/dist/showcase/specimens/data.js +111 -0
  522. package/dist/showcase/specimens/feedback.d.ts +23 -0
  523. package/dist/showcase/specimens/feedback.d.ts.map +1 -0
  524. package/dist/showcase/specimens/feedback.js +64 -0
  525. package/dist/showcase/specimens/index.d.ts +164 -0
  526. package/dist/showcase/specimens/index.d.ts.map +1 -0
  527. package/dist/showcase/specimens/index.js +24 -0
  528. package/dist/showcase/specimens/inputs.d.ts +22 -0
  529. package/dist/showcase/specimens/inputs.d.ts.map +1 -0
  530. package/dist/showcase/specimens/inputs.js +60 -0
  531. package/dist/showcase/specimens/menus.d.ts +20 -0
  532. package/dist/showcase/specimens/menus.d.ts.map +1 -0
  533. package/dist/showcase/specimens/menus.js +65 -0
  534. package/dist/showcase/specimens/navigation.d.ts +22 -0
  535. package/dist/showcase/specimens/navigation.d.ts.map +1 -0
  536. package/dist/showcase/specimens/navigation.js +103 -0
  537. package/dist/showcase/specimens/other.d.ts +26 -0
  538. package/dist/showcase/specimens/other.d.ts.map +1 -0
  539. package/dist/showcase/specimens/other.js +73 -0
  540. package/dist/showcase/specimens/specimen.d.ts +5 -0
  541. package/dist/showcase/specimens/specimen.d.ts.map +1 -0
  542. package/dist/showcase/specimens/specimen.js +1 -0
  543. package/dist/showcase/specimens/status.d.ts +22 -0
  544. package/dist/showcase/specimens/status.d.ts.map +1 -0
  545. package/dist/showcase/specimens/status.js +44 -0
  546. package/dist/showcase/usage.generated.d.ts +16 -0
  547. package/dist/showcase/usage.generated.d.ts.map +1 -0
  548. package/dist/showcase/usage.generated.js +1788 -0
  549. package/dist/standalone/index.js +1 -1
  550. package/dist/styles/components.css +21 -0
  551. package/package.json +8 -3
  552. package/dist/components/automation-section.d.ts +0 -78
  553. package/dist/components/automation-section.d.ts.map +0 -1
  554. package/dist/components/automation-section.js +0 -75
  555. package/dist/components/catalog-tile.d.ts +0 -19
  556. package/dist/components/catalog-tile.d.ts.map +0 -1
  557. package/dist/components/catalog-tile.js +0 -13
  558. package/dist/components/feedback-state.d.ts +0 -14
  559. package/dist/components/feedback-state.d.ts.map +0 -1
  560. package/dist/components/feedback-state.js +0 -65
  561. package/dist/components/installer-shell.d.ts +0 -25
  562. package/dist/components/installer-shell.d.ts.map +0 -1
  563. package/dist/components/installer-shell.js +0 -32
  564. package/dist/components/settings-form.d.ts +0 -9
  565. package/dist/components/settings-form.d.ts.map +0 -1
  566. package/dist/components/settings-form.js +0 -83
@@ -1,4 +1,19 @@
1
1
  import * as React from "react";
2
+ /**
3
+ * Consumption against an allowance in a dense spot.
4
+ *
5
+ * @family Data
6
+ * @when `UsageMeter`: consumption against an allowance in a dense spot, such as a run's tokens and
7
+ * cost.
8
+ * @instead A known amount against a real maximum with its label is `Progress`. An unknown wait is
9
+ * the waiting line, never a bar with an invented percentage. A single figure is a `KpiCard`.
10
+ * @behaviour The fill moves only when the reading changes, on `transition`; still under reduced
11
+ * motion. The tone is the product's threshold, never derived from the value. Past the maximum the
12
+ * bar fills and turns red.
13
+ * @words Print the work and its unit: *620 of 1,000*. The meter's fields are short and set in
14
+ * uppercase mono by the stylesheet, so they are written in sentence case.
15
+ * @access The meter's printed figures are the reading; its track is decorative.
16
+ */
2
17
  declare function UsageMeter({ className, fields, trailing, usage, children, ...props }: Omit<React.ComponentProps<"div">, "children"> & {
3
18
  fields?: string[];
4
19
  trailing?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"usage-meter.d.ts","sourceRoot":"","sources":["../../src/components/usage-meter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,MAAW,EACX,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,qBAqCA;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"usage-meter.d.ts","sourceRoot":"","sources":["../../src/components/usage-meter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;GAcG;AACH,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,MAAW,EACX,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,qBAqCA;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,6 +1,21 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { cn } from "../lib/utils.js";
4
+ /**
5
+ * Consumption against an allowance in a dense spot.
6
+ *
7
+ * @family Data
8
+ * @when `UsageMeter`: consumption against an allowance in a dense spot, such as a run's tokens and
9
+ * cost.
10
+ * @instead A known amount against a real maximum with its label is `Progress`. An unknown wait is
11
+ * the waiting line, never a bar with an invented percentage. A single figure is a `KpiCard`.
12
+ * @behaviour The fill moves only when the reading changes, on `transition`; still under reduced
13
+ * motion. The tone is the product's threshold, never derived from the value. Past the maximum the
14
+ * bar fills and turns red.
15
+ * @words Print the work and its unit: *620 of 1,000*. The meter's fields are short and set in
16
+ * uppercase mono by the stylesheet, so they are written in sentence case.
17
+ * @access The meter's printed figures are the reading; its track is decorative.
18
+ */
4
19
  function UsageMeter({ className, fields = [], trailing, usage, children, ...props }) {
5
20
  const hasMeta = fields.length > 0 || trailing != null || children != null;
6
21
  return (_jsxs("div", { "data-slot": "usage-meter", className: cn("nc-usage-meter", className), ...props, children: [hasMeta && (_jsxs("div", { className: "nc-usage-meter-meta", children: [fields.map((field, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx("span", { className: "nc-usage-meter-sep", children: "/" }), _jsx("span", { children: field })] }, index))), trailing != null && (_jsxs(_Fragment, { children: [_jsx("span", { className: "nc-usage-meter-spacer" }), _jsx("span", { children: trailing })] })), children != null && _jsx("span", { "data-slot": "usage-meter-slot", children: children })] })), usage != null && (_jsx("div", { className: "nc-usage-meter-track", children: _jsx("div", { className: "nc-usage-meter-fill",
@@ -13,17 +13,20 @@ type WaitingLineProps = Omit<React.ComponentProps<"div">, "children"> & ({
13
13
  label: string;
14
14
  });
15
15
  /**
16
- * The one moving thing a system wait may show: a 2 px ink track with a 32%
17
- * segment crossing it linearly, after a second of waiting. Under reduced
18
- * motion the whole line breathes in opacity instead of travelling.
16
+ * The one moving thing a system wait may show: a 2 px ink line, after a second.
19
17
  *
20
- * The track takes its 2 px from the moment the wait starts and stays empty and
21
- * unannounced until that second is up, so the line arriving moves nothing
22
- * around it. The interface answers briefly: one thing moves, and only the one
23
- * the person is waiting for.
24
- *
25
- * An Agent's work is not a system wait: it shows that Agent's orb in its state
26
- * and a sentence saying what it is doing.
18
+ * @family Feedback
19
+ * @when A system wait the person asked for that runs past a second: a save, a connection, a
20
+ * download without a count.
21
+ * @instead Under a second the `PendingLabel` alone. A known amount is a progress line with a count.
22
+ * A page load is `Skeleton`. An Agent working is her orb and a sentence.
23
+ * @behaviour Takes its 2 px from the start and stays empty until 1 s, so its arrival moves nothing.
24
+ * No track colour; the segment is ink, never info blue, crossing at 32% width. Under reduced motion
25
+ * it breathes.
26
+ * @words None of its own. The control beside it carries the pending word; a standalone line takes a
27
+ * `label` naming the work: *Connecting Telegram*.
28
+ * @access With a label: `role="status"`, announced once after the second. `decorative` when the
29
+ * control beside it already says it. The segment is hidden.
27
30
  */
28
31
  declare function WaitingLine({ className, decorative, label, ...props }: WaitingLineProps): React.JSX.Element;
29
32
  export { WaitingLine, WAITING_LINE_DELAY_MS };
@@ -1 +1 @@
1
- {"version":3,"file":"waiting-line.d.ts","sourceRoot":"","sources":["../../src/components/waiting-line.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,OAAO,CAAC;AAEnC,KAAK,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GACnE,CAAC;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhF;;;;;;;;;;;;GAYG;AACH,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,UAAkB,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,qBA0BxF;AAED,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"waiting-line.d.ts","sourceRoot":"","sources":["../../src/components/waiting-line.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,OAAO,CAAC;AAEnC,KAAK,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GACnE,CAAC;IAAE,UAAU,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhF;;;;;;;;;;;;;;;GAeG;AACH,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,UAAkB,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,qBA0BxF;AAED,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC"}
@@ -9,17 +9,20 @@ import { cn } from "../lib/utils.js";
9
9
  */
10
10
  const WAITING_LINE_DELAY_MS = 1000;
11
11
  /**
12
- * The one moving thing a system wait may show: a 2 px ink track with a 32%
13
- * segment crossing it linearly, after a second of waiting. Under reduced
14
- * motion the whole line breathes in opacity instead of travelling.
12
+ * The one moving thing a system wait may show: a 2 px ink line, after a second.
15
13
  *
16
- * The track takes its 2 px from the moment the wait starts and stays empty and
17
- * unannounced until that second is up, so the line arriving moves nothing
18
- * around it. The interface answers briefly: one thing moves, and only the one
19
- * the person is waiting for.
20
- *
21
- * An Agent's work is not a system wait: it shows that Agent's orb in its state
22
- * and a sentence saying what it is doing.
14
+ * @family Feedback
15
+ * @when A system wait the person asked for that runs past a second: a save, a connection, a
16
+ * download without a count.
17
+ * @instead Under a second the `PendingLabel` alone. A known amount is a progress line with a count.
18
+ * A page load is `Skeleton`. An Agent working is her orb and a sentence.
19
+ * @behaviour Takes its 2 px from the start and stays empty until 1 s, so its arrival moves nothing.
20
+ * No track colour; the segment is ink, never info blue, crossing at 32% width. Under reduced motion
21
+ * it breathes.
22
+ * @words None of its own. The control beside it carries the pending word; a standalone line takes a
23
+ * `label` naming the work: *Connecting Telegram*.
24
+ * @access With a label: `role="status"`, announced once after the second. `decorative` when the
25
+ * control beside it already says it. The segment is hidden.
23
26
  */
24
27
  function WaitingLine({ className, decorative = false, label, ...props }) {
25
28
  const [elapsed, setElapsed] = React.useState(false);
@@ -3,15 +3,19 @@ import { readdirSync, readFileSync } from "node:fs";
3
3
 
4
4
  import { builtinRules } from "eslint/use-at-your-own-risk";
5
5
 
6
+ import { emptyStateOwner } from "./rules/empty-state-owner.js";
7
+ import { menuOwner } from "./rules/menu-owner.js";
6
8
  import { noAppFeatureComponent } from "./rules/no-app-feature-component.js";
7
9
  import { noChoiceControlWrapper } from "./rules/no-choice-control-wrapper.js";
8
10
  import { noComment } from "./rules/no-comment.js";
11
+ import { noDecorativeIcon } from "./rules/no-decorative-icon.js";
9
12
  import { noDeprecatedZodApi } from "./rules/no-deprecated-zod-api.js";
10
13
  import { noGlobalPatch } from "./rules/no-global-patch.js";
11
14
  import { noPackageComponentRedefinition } from "./rules/no-package-component-redefinition.js";
12
15
  import { noShadcnAppearanceOverride } from "./rules/no-shadcn-appearance-override.js";
13
16
  import { noSubjectDerivedExpectation } from "./rules/no-subject-derived-expectation.js";
14
17
  import { noWriteInSubscription } from "./rules/no-write-in-subscription.js";
18
+ import { pageComposition } from "./rules/page-composition.js";
15
19
  import { serverActionDiscipline } from "./rules/server-action-discipline.js";
16
20
  import { strictDesignSystemSelectors } from "./strict-design-system.js";
17
21
 
@@ -102,15 +106,19 @@ const plugin = {
102
106
  configs: {},
103
107
  rules: {
104
108
  ...strictSelectorRules,
109
+ "empty-state-owner": emptyStateOwner,
110
+ "menu-owner": menuOwner,
105
111
  "no-app-feature-component": noAppFeatureComponent,
106
112
  "no-choice-control-wrapper": noChoiceControlWrapper,
107
113
  "no-comment": noComment,
114
+ "no-decorative-icon": noDecorativeIcon,
108
115
  "no-deprecated-zod-api": noDeprecatedZodApi,
109
116
  "no-global-patch": noGlobalPatch,
110
117
  "no-package-component-redefinition": noPackageComponentRedefinition,
111
118
  "no-shadcn-appearance-override": noShadcnAppearanceOverride,
112
119
  "no-subject-derived-expectation": noSubjectDerivedExpectation,
113
120
  "no-write-in-subscription": noWriteInSubscription,
121
+ "page-composition": pageComposition,
114
122
  "server-action-discipline": serverActionDiscipline,
115
123
  },
116
124
  };
@@ -0,0 +1,145 @@
1
+ /*
2
+ * Standard tool checked first: a `no-restricted-syntax` selector can match
3
+ * `items.length === 0 ? <X/> : …`, but not which branch is the empty one once
4
+ * the test is turned around (`items.length > 0 ? <List/> : <p/>`, an early
5
+ * `if` whose empty branch is the next `return`), so it would either miss those
6
+ * or report the list branch.
7
+ */
8
+ import { renderedImports } from "./rendered-import.js";
9
+
10
+ const OWNERS = [
11
+ "EmptyState",
12
+ "CollectionPage",
13
+ "RecordList",
14
+ "ActivityFeed",
15
+ "LibraryShelf",
16
+ "CatalogDrawer",
17
+ "DataTable",
18
+ "CommandEmpty",
19
+ "ComboboxEmpty",
20
+ ];
21
+
22
+ const SIZE_PROPERTIES = new Set(["length", "size"]);
23
+ const COUNT = /^count$|[a-z0-9]Count$/;
24
+
25
+ const unwrapChain = (node) => (node.type === "ChainExpression" ? node.expression : node);
26
+
27
+ const isSize = (node) => {
28
+ const read = unwrapChain(node);
29
+ if (read.type === "Identifier") return COUNT.test(read.name);
30
+ if (read.type !== "MemberExpression" || read.computed) return false;
31
+ return SIZE_PROPERTIES.has(read.property.name) || COUNT.test(read.property.name);
32
+ };
33
+
34
+ const MIRRORED = { "<": ">", ">": "<", "<=": ">=", ">=": "<=" };
35
+
36
+ const EMPTY_WHEN = {
37
+ "===": { 0: "empty" },
38
+ "==": { 0: "empty" },
39
+ "!==": { 0: "present" },
40
+ "!=": { 0: "present" },
41
+ "<": { 1: "empty" },
42
+ "<=": { 0: "empty" },
43
+ ">": { 0: "present" },
44
+ ">=": { 1: "present" },
45
+ };
46
+
47
+ function emptiness(test) {
48
+ const node = unwrapChain(test);
49
+ if (isSize(node)) return "present";
50
+ if (node.type === "UnaryExpression" && node.operator === "!") {
51
+ const inner = emptiness(node.argument);
52
+ if (inner === "empty") return "present";
53
+ if (inner === "present") return "empty";
54
+ return null;
55
+ }
56
+ if (node.type === "LogicalExpression") {
57
+ const sides = [emptiness(node.left), emptiness(node.right)];
58
+ if (node.operator === "&&" && sides.includes("empty")) return "empty";
59
+ if (node.operator === "||" && sides.includes("present")) return "present";
60
+ return null;
61
+ }
62
+ if (node.type !== "BinaryExpression") return null;
63
+ let { operator, left, right } = node;
64
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- ESTree types Literal.value as string | number | boolean | RegExp | bigint | null; only typeof picks the number.
65
+ if (isSize(right) && typeof left.value === "number") {
66
+ [left, right] = [right, left];
67
+ operator = MIRRORED[operator] ?? operator;
68
+ }
69
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- ESTree types Literal.value as string | number | boolean | RegExp | bigint | null; only typeof picks the number.
70
+ if (!isSize(left) || typeof right.value !== "number") return null;
71
+ return EMPTY_WHEN[operator]?.[right.value] ?? null;
72
+ }
73
+
74
+ function returned(statement) {
75
+ if (!statement) return null;
76
+ if (statement.type === "ReturnStatement") return statement.argument;
77
+ if (statement.type === "BlockStatement") {
78
+ const found = statement.body.find((inner) => inner.type === "ReturnStatement");
79
+ return found?.argument ?? null;
80
+ }
81
+ return null;
82
+ }
83
+
84
+ function nextStatement(statement) {
85
+ const body = statement.parent.body;
86
+ if (!Array.isArray(body)) return null;
87
+ return body[body.indexOf(statement) + 1] ?? null;
88
+ }
89
+
90
+ export const emptyStateOwner = {
91
+ meta: {
92
+ type: "problem",
93
+ docs: {
94
+ description: "An absence renders EmptyState, or a composition that draws its own.",
95
+ },
96
+ schema: [
97
+ {
98
+ type: "object",
99
+ properties: {
100
+ owners: { type: "array", items: { type: "string" }, uniqueItems: true },
101
+ },
102
+ additionalProperties: false,
103
+ },
104
+ ],
105
+ defaultOptions: [{ owners: [] }],
106
+ messages: {
107
+ "absence-branch":
108
+ "An absence is EmptyState: firstUse with the section's picture, nothingYet, noResults with its clear, or failed with its retry.",
109
+ },
110
+ },
111
+ create(context) {
112
+ const owners = new Set([...OWNERS, ...context.options[0].owners]);
113
+ const importOf = renderedImports(context);
114
+ const drawnByAnOwner = (element) =>
115
+ owners.has(importOf(element.openingElement.name)?.name ?? "");
116
+
117
+ function checkEmptyBranch(branch) {
118
+ const drawsItsOwn =
119
+ branch?.type === "JSXFragment" ||
120
+ (branch?.type === "JSXElement" && !drawnByAnOwner(branch));
121
+ if (drawsItsOwn) context.report({ node: branch, messageId: "absence-branch" });
122
+ }
123
+
124
+ return {
125
+ ConditionalExpression(node) {
126
+ const verdict = emptiness(node.test);
127
+ if (verdict === "empty") checkEmptyBranch(node.consequent);
128
+ else if (verdict === "present") checkEmptyBranch(node.alternate);
129
+ },
130
+ LogicalExpression(node) {
131
+ if (node.operator === "&&" && emptiness(node.left) === "empty") {
132
+ checkEmptyBranch(node.right);
133
+ }
134
+ },
135
+ IfStatement(node) {
136
+ const verdict = emptiness(node.test);
137
+ if (verdict === "empty") {
138
+ checkEmptyBranch(returned(node.consequent));
139
+ } else if (verdict === "present" && returned(node.consequent)) {
140
+ checkEmptyBranch(returned(node.alternate ?? nextStatement(node)));
141
+ }
142
+ },
143
+ };
144
+ },
145
+ };
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Standard tool checked first: `no-restricted-imports` holds the menu modules
3
+ * and the ellipsis icons (`repo/menu-owner-imports` in the root config's
4
+ * product-composition blocks), but not a destructive `Button` rendered once per
5
+ * row: that is an import binding joined to where its element renders, which no
6
+ * import rule sees and a selector cannot follow through a renamed import.
7
+ */
8
+ import { PACKAGE_BARREL, partOf, renderedImports, staticAttribute } from "./rendered-import.js";
9
+
10
+ const BUTTON = new Map([
11
+ [
12
+ "Button",
13
+ ["@nadicodeai/ui/components/button", PACKAGE_BARREL].map((from) => ({ from, part: "Button" })),
14
+ ],
15
+ ]);
16
+
17
+ const FUNCTIONS = new Set(["FunctionDeclaration", "FunctionExpression", "ArrowFunctionExpression"]);
18
+ const ROW_CALLBACKS = new Set(["map", "flatMap"]);
19
+ const ROW_RENDERERS = new Set(["cell", "command"]);
20
+ const ROW_COMPONENT = /Row$/;
21
+
22
+ const nameOf = (key) => (key?.type === "Identifier" ? key.name : key?.value);
23
+
24
+ function drawsOneRecord(fn) {
25
+ const { parent } = fn;
26
+ if (
27
+ parent.type === "CallExpression" &&
28
+ parent.arguments[0] === fn &&
29
+ parent.callee.type === "MemberExpression" &&
30
+ !parent.callee.computed &&
31
+ ROW_CALLBACKS.has(parent.callee.property.name)
32
+ ) {
33
+ return true;
34
+ }
35
+ if (parent.type === "Property" && parent.value === fn) {
36
+ return ROW_RENDERERS.has(nameOf(parent.key));
37
+ }
38
+ if (parent.type === "JSXExpressionContainer" && parent.parent.type === "JSXAttribute") {
39
+ return ROW_RENDERERS.has(parent.parent.name.name);
40
+ }
41
+ if (fn.type === "FunctionDeclaration") return ROW_COMPONENT.test(fn.id?.name ?? "");
42
+ return parent.type === "VariableDeclarator" && ROW_COMPONENT.test(nameOf(parent.id) ?? "");
43
+ }
44
+
45
+ function insideARow(node) {
46
+ for (let current = node.parent; current; current = current.parent) {
47
+ if (FUNCTIONS.has(current.type) && drawsOneRecord(current)) return true;
48
+ }
49
+ return false;
50
+ }
51
+
52
+ export const menuOwner = {
53
+ meta: {
54
+ type: "problem",
55
+ docs: {
56
+ description:
57
+ "A record's destructive command is the last item of its ActionMenu, never a destructive button in its row.",
58
+ },
59
+ schema: [],
60
+ messages: {
61
+ "row-destructive-button":
62
+ "A destructive command is the last item of the row's ActionMenu, after a divider.",
63
+ },
64
+ },
65
+ create(context) {
66
+ const importOf = renderedImports(context);
67
+ return {
68
+ JSXOpeningElement(node) {
69
+ if (partOf(importOf(node.name), BUTTON, context.filename) !== "Button") return;
70
+ if (staticAttribute(node, "variant") !== "destructive") return;
71
+ if (insideARow(node)) context.report({ node, messageId: "row-destructive-button" });
72
+ },
73
+ };
74
+ },
75
+ };
@@ -0,0 +1,164 @@
1
+ /*
2
+ * Standard tool checked first: a `no-restricted-syntax` selector such as
3
+ * `CardTitle JSXOpeningElement` matches any element under a title, not the
4
+ * ones bound to an icon module, and cannot stop at a control between the two
5
+ * (`<CardHeader><Button><Plus/></Button></CardHeader>` is allowed). This rule
6
+ * joins the element to its import and reads the nearest container above it.
7
+ */
8
+ import { renderedImports, sourceMatches, writtenName } from "./rendered-import.js";
9
+
10
+ export const noDecorativeIcon = {
11
+ meta: {
12
+ type: "problem",
13
+ docs: {
14
+ description:
15
+ "A title or a label carries no icon; an icon belongs to a control or a menu row.",
16
+ },
17
+ schema: [
18
+ {
19
+ type: "object",
20
+ properties: {
21
+ iconModules: { type: "array", items: { type: "string" }, uniqueItems: true },
22
+ headings: { type: "array", items: { type: "string" }, uniqueItems: true },
23
+ controls: { type: "array", items: { type: "string" }, uniqueItems: true },
24
+ },
25
+ additionalProperties: false,
26
+ },
27
+ ],
28
+ defaultOptions: [
29
+ {
30
+ iconModules: ["lucide-react", "@nadicodeai/ui/components/house-icons"],
31
+ headings: [
32
+ "h1",
33
+ "h2",
34
+ "h3",
35
+ "h4",
36
+ "h5",
37
+ "h6",
38
+ "legend",
39
+ "dt",
40
+ "th",
41
+ "caption",
42
+ "CardTitle",
43
+ "CardDescription",
44
+ "CardHeader",
45
+ "DialogTitle",
46
+ "SheetTitle",
47
+ "AlertDialogTitle",
48
+ "DrawerTitle",
49
+ "FieldLabel",
50
+ "FieldLegend",
51
+ "Label",
52
+ "ItemTitle",
53
+ "TableHead",
54
+ ],
55
+ controls: [
56
+ "button",
57
+ "a",
58
+ "Button",
59
+ "Link",
60
+ "CardAction",
61
+ "TabsTrigger",
62
+ "TabsLink",
63
+ "ToggleGroupItem",
64
+ "Toggle",
65
+ "SidebarMenuButton",
66
+ "InputGroupAddon",
67
+ "InputGroupButton",
68
+ ],
69
+ },
70
+ ],
71
+ messages: {
72
+ "beside-heading":
73
+ "A title or a label carries no icon: an identity mark starts a row or a card (IdentityMark), and an icon belongs to a control or a menu row.",
74
+ },
75
+ },
76
+ create(context) {
77
+ const [{ iconModules, headings, controls }] = context.options;
78
+ const headingNames = new Set(headings);
79
+ const controlNames = new Set(controls);
80
+ const importOf = renderedImports(context);
81
+ const isIconImport = (name) => {
82
+ const imported = importOf({ type: "JSXIdentifier", name });
83
+ return (
84
+ imported !== null &&
85
+ iconModules.some((module) => sourceMatches(imported.source, module, context.filename))
86
+ );
87
+ };
88
+
89
+ function constantOf(name, scope) {
90
+ for (let current = scope; current; current = current.upper) {
91
+ const variable = current.set.get(name);
92
+ if (!variable) continue;
93
+ const [definition] = variable.defs;
94
+ const declared =
95
+ definition?.type === "Variable" && definition.parent.kind === "const"
96
+ ? definition.node.init
97
+ : null;
98
+ return declared ?? null;
99
+ }
100
+ return null;
101
+ }
102
+
103
+ function holdsAnIcon(value, scope, seen = new Set()) {
104
+ if (!value || seen.has(value)) return false;
105
+ seen.add(value);
106
+ switch (value.type) {
107
+ case "Identifier":
108
+ return (
109
+ isIconImport(value.name) || holdsAnIcon(constantOf(value.name, scope), scope, seen)
110
+ );
111
+ case "MemberExpression":
112
+ return holdsAnIcon(value.object, scope, seen);
113
+ case "ConditionalExpression":
114
+ return [value.consequent, value.alternate].some((branch) =>
115
+ holdsAnIcon(branch, scope, seen),
116
+ );
117
+ case "LogicalExpression":
118
+ return [value.left, value.right].some((side) => holdsAnIcon(side, scope, seen));
119
+ case "ObjectExpression":
120
+ return value.properties.some(
121
+ (property) => property.type === "Property" && holdsAnIcon(property.value, scope, seen),
122
+ );
123
+ case "ArrayExpression":
124
+ return value.elements.some((element) => holdsAnIcon(element, scope, seen));
125
+ default:
126
+ return false;
127
+ }
128
+ }
129
+
130
+ function isIcon(openingElement) {
131
+ const imported = importOf(openingElement.name);
132
+ if (imported) {
133
+ return iconModules.some((module) =>
134
+ sourceMatches(imported.source, module, context.filename),
135
+ );
136
+ }
137
+ const { name } = openingElement;
138
+ if (name.type !== "JSXIdentifier" || !/^[A-Z]/.test(name.name)) return false;
139
+ const scope = context.sourceCode.getScope(openingElement);
140
+ return holdsAnIcon(constantOf(name.name, scope), scope);
141
+ }
142
+
143
+ return {
144
+ JSXOpeningElement(node) {
145
+ if (!isIcon(node)) return;
146
+ for (let current = node.parent.parent; current; current = current.parent) {
147
+ if (current.type === "JSXAttribute") {
148
+ if (headingNames.has(writtenName(current.parent.name))) {
149
+ context.report({ node, messageId: "beside-heading" });
150
+ }
151
+ return;
152
+ }
153
+ if (current.type !== "JSXElement") continue;
154
+ const name = writtenName(current.openingElement.name);
155
+ if (controlNames.has(name)) return;
156
+ if (headingNames.has(name)) {
157
+ context.report({ node, messageId: "beside-heading" });
158
+ return;
159
+ }
160
+ }
161
+ },
162
+ };
163
+ },
164
+ };