noecosystem-design 0.1.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 (653) hide show
  1. package/.editorconfig +12 -0
  2. package/.github/CODEOWNERS +10 -0
  3. package/.github/dependabot.yml +12 -0
  4. package/.github/pull_request_template.md +17 -0
  5. package/.github/workflows/ci.yml +173 -0
  6. package/.github/workflows/security.yml +40 -0
  7. package/.mcp.json +8 -0
  8. package/.node-version +1 -0
  9. package/AGENTS.md +62 -0
  10. package/CONTRIBUTING.md +9 -0
  11. package/README.md +48 -0
  12. package/SECURITY.md +7 -0
  13. package/apps/showcase/index.html +28 -0
  14. package/apps/showcase/package.json +30 -0
  15. package/apps/showcase/src/app.css +8 -0
  16. package/apps/showcase/src/app.tsx +10 -0
  17. package/apps/showcase/src/catalog/agent-composer-preview.tsx +17 -0
  18. package/apps/showcase/src/catalog/catalog-index.tsx +2676 -0
  19. package/apps/showcase/src/catalog/catalog-shell.browser.test.tsx +73 -0
  20. package/apps/showcase/src/catalog/catalog-shell.tsx +506 -0
  21. package/apps/showcase/src/main.tsx +17 -0
  22. package/apps/showcase/tsconfig.json +11 -0
  23. package/apps/showcase/vite.config.ts +15 -0
  24. package/apps/storybook/.storybook/main.ts +21 -0
  25. package/apps/storybook/.storybook/preview.tsx +87 -0
  26. package/apps/storybook/.storybook/vitest.setup.ts +26 -0
  27. package/apps/storybook/README.md +5 -0
  28. package/apps/storybook/package.json +31 -0
  29. package/apps/storybook/stories/AgentStates.stories.tsx +72 -0
  30. package/apps/storybook/stories/Bidi.stories.tsx +31 -0
  31. package/apps/storybook/stories/Button.stories.tsx +19 -0
  32. package/apps/storybook/stories/Surfaces.stories.tsx +28 -0
  33. package/apps/storybook/stories/catalog/about-page.stories.tsx +18 -0
  34. package/apps/storybook/stories/catalog/activity-feed.stories.tsx +50 -0
  35. package/apps/storybook/stories/catalog/activity-gauge.stories.tsx +18 -0
  36. package/apps/storybook/stories/catalog/agent-composer.stories.tsx +49 -0
  37. package/apps/storybook/stories/catalog/agent-message.stories.tsx +37 -0
  38. package/apps/storybook/stories/catalog/agent-plan.stories.tsx +35 -0
  39. package/apps/storybook/stories/catalog/agent-workspace.stories.tsx +60 -0
  40. package/apps/storybook/stories/catalog/alert.stories.tsx +41 -0
  41. package/apps/storybook/stories/catalog/app-frame.stories.tsx +47 -0
  42. package/apps/storybook/stories/catalog/approval-request.stories.tsx +30 -0
  43. package/apps/storybook/stories/catalog/avatar.stories.tsx +18 -0
  44. package/apps/storybook/stories/catalog/badge-group.stories.tsx +18 -0
  45. package/apps/storybook/stories/catalog/badge.stories.tsx +18 -0
  46. package/apps/storybook/stories/catalog/banner.stories.tsx +18 -0
  47. package/apps/storybook/stories/catalog/bidi-text.stories.tsx +47 -0
  48. package/apps/storybook/stories/catalog/blog-index-page.stories.tsx +18 -0
  49. package/apps/storybook/stories/catalog/blog-post-page.stories.tsx +18 -0
  50. package/apps/storybook/stories/catalog/blog-section.stories.tsx +18 -0
  51. package/apps/storybook/stories/catalog/bottom-navigation.stories.tsx +27 -0
  52. package/apps/storybook/stories/catalog/button-group.stories.tsx +18 -0
  53. package/apps/storybook/stories/catalog/button.stories.tsx +27 -0
  54. package/apps/storybook/stories/catalog/calendar.stories.tsx +47 -0
  55. package/apps/storybook/stories/catalog/card.stories.tsx +40 -0
  56. package/apps/storybook/stories/catalog/careers-section.stories.tsx +18 -0
  57. package/apps/storybook/stories/catalog/carousel.stories.tsx +18 -0
  58. package/apps/storybook/stories/catalog/chart-frame.stories.tsx +34 -0
  59. package/apps/storybook/stories/catalog/chart.stories.tsx +43 -0
  60. package/apps/storybook/stories/catalog/checkbox.stories.tsx +18 -0
  61. package/apps/storybook/stories/catalog/code-and-terminal.stories.tsx +39 -0
  62. package/apps/storybook/stories/catalog/color-picker.stories.tsx +18 -0
  63. package/apps/storybook/stories/catalog/command-menu.stories.tsx +18 -0
  64. package/apps/storybook/stories/catalog/contact-page.stories.tsx +18 -0
  65. package/apps/storybook/stories/catalog/contact-section.stories.tsx +18 -0
  66. package/apps/storybook/stories/catalog/content-divider.stories.tsx +18 -0
  67. package/apps/storybook/stories/catalog/content-section.stories.tsx +18 -0
  68. package/apps/storybook/stories/catalog/context-menu.stories.tsx +66 -0
  69. package/apps/storybook/stories/catalog/credit-card.stories.tsx +18 -0
  70. package/apps/storybook/stories/catalog/cta-section.stories.tsx +18 -0
  71. package/apps/storybook/stories/catalog/dashboard-01.stories.tsx +28 -0
  72. package/apps/storybook/stories/catalog/dashboard-02.stories.tsx +28 -0
  73. package/apps/storybook/stories/catalog/dashboard-shell.stories.tsx +65 -0
  74. package/apps/storybook/stories/catalog/data-list.stories.tsx +37 -0
  75. package/apps/storybook/stories/catalog/data-table.stories.tsx +51 -0
  76. package/apps/storybook/stories/catalog/date-picker.stories.tsx +31 -0
  77. package/apps/storybook/stories/catalog/dialog.stories.tsx +68 -0
  78. package/apps/storybook/stories/catalog/direction-provider.stories.tsx +36 -0
  79. package/apps/storybook/stories/catalog/drawer.stories.tsx +58 -0
  80. package/apps/storybook/stories/catalog/dropdown.stories.tsx +67 -0
  81. package/apps/storybook/stories/catalog/email-template.stories.tsx +18 -0
  82. package/apps/storybook/stories/catalog/empty-state.stories.tsx +19 -0
  83. package/apps/storybook/stories/catalog/error-state.stories.tsx +19 -0
  84. package/apps/storybook/stories/catalog/fab.stories.tsx +22 -0
  85. package/apps/storybook/stories/catalog/faq-page.stories.tsx +18 -0
  86. package/apps/storybook/stories/catalog/faq-section.stories.tsx +18 -0
  87. package/apps/storybook/stories/catalog/feature-section.stories.tsx +18 -0
  88. package/apps/storybook/stories/catalog/featured-icon.stories.tsx +45 -0
  89. package/apps/storybook/stories/catalog/field.stories.tsx +35 -0
  90. package/apps/storybook/stories/catalog/file-uploader.stories.tsx +18 -0
  91. package/apps/storybook/stories/catalog/filter-bar.stories.tsx +33 -0
  92. package/apps/storybook/stories/catalog/footer.stories.tsx +18 -0
  93. package/apps/storybook/stories/catalog/forgot-password-page.stories.tsx +18 -0
  94. package/apps/storybook/stories/catalog/gradient-picker.stories.tsx +18 -0
  95. package/apps/storybook/stories/catalog/header-navigation.stories.tsx +46 -0
  96. package/apps/storybook/stories/catalog/hero-header.stories.tsx +36 -0
  97. package/apps/storybook/stories/catalog/icon-system.stories.tsx +48 -0
  98. package/apps/storybook/stories/catalog/illustration.stories.tsx +18 -0
  99. package/apps/storybook/stories/catalog/image-picker.stories.tsx +18 -0
  100. package/apps/storybook/stories/catalog/informational-page-01.stories.tsx +18 -0
  101. package/apps/storybook/stories/catalog/informational-page-02.stories.tsx +18 -0
  102. package/apps/storybook/stories/catalog/inline-cta.stories.tsx +18 -0
  103. package/apps/storybook/stories/catalog/input.stories.tsx +21 -0
  104. package/apps/storybook/stories/catalog/landing-page.stories.tsx +28 -0
  105. package/apps/storybook/stories/catalog/legal-page.stories.tsx +18 -0
  106. package/apps/storybook/stories/catalog/login-page.stories.tsx +42 -0
  107. package/apps/storybook/stories/catalog/marketing-404-page.stories.tsx +18 -0
  108. package/apps/storybook/stories/catalog/marketing-header.stories.tsx +35 -0
  109. package/apps/storybook/stories/catalog/menu.stories.tsx +46 -0
  110. package/apps/storybook/stories/catalog/messaging.stories.tsx +33 -0
  111. package/apps/storybook/stories/catalog/metric-card.stories.tsx +20 -0
  112. package/apps/storybook/stories/catalog/metrics-section.stories.tsx +18 -0
  113. package/apps/storybook/stories/catalog/mobile-screen.stories.tsx +56 -0
  114. package/apps/storybook/stories/catalog/multi-select.stories.tsx +18 -0
  115. package/apps/storybook/stories/catalog/newsletter.stories.tsx +18 -0
  116. package/apps/storybook/stories/catalog/not-found.stories.tsx +30 -0
  117. package/apps/storybook/stories/catalog/notification.stories.tsx +18 -0
  118. package/apps/storybook/stories/catalog/page-header.stories.tsx +37 -0
  119. package/apps/storybook/stories/catalog/pagination.stories.tsx +27 -0
  120. package/apps/storybook/stories/catalog/pie-chart.stories.tsx +18 -0
  121. package/apps/storybook/stories/catalog/pricing-page.stories.tsx +18 -0
  122. package/apps/storybook/stories/catalog/pricing-section.stories.tsx +18 -0
  123. package/apps/storybook/stories/catalog/progress-indicator.stories.tsx +18 -0
  124. package/apps/storybook/stories/catalog/progress-steps.stories.tsx +33 -0
  125. package/apps/storybook/stories/catalog/qr-code.stories.tsx +18 -0
  126. package/apps/storybook/stories/catalog/radar-chart.stories.tsx +18 -0
  127. package/apps/storybook/stories/catalog/radio-group.stories.tsx +18 -0
  128. package/apps/storybook/stories/catalog/rating.stories.tsx +18 -0
  129. package/apps/storybook/stories/catalog/rich-text-editor.stories.tsx +18 -0
  130. package/apps/storybook/stories/catalog/run-inspector.stories.tsx +23 -0
  131. package/apps/storybook/stories/catalog/section-footer.stories.tsx +18 -0
  132. package/apps/storybook/stories/catalog/section-header.stories.tsx +31 -0
  133. package/apps/storybook/stories/catalog/select.stories.tsx +18 -0
  134. package/apps/storybook/stories/catalog/settings-01.stories.tsx +24 -0
  135. package/apps/storybook/stories/catalog/settings-02.stories.tsx +24 -0
  136. package/apps/storybook/stories/catalog/settings-page.stories.tsx +48 -0
  137. package/apps/storybook/stories/catalog/sidebar-navigation.stories.tsx +40 -0
  138. package/apps/storybook/stories/catalog/sign-in-form.stories.tsx +28 -0
  139. package/apps/storybook/stories/catalog/sign-up-page.stories.tsx +18 -0
  140. package/apps/storybook/stories/catalog/skeleton.stories.tsx +21 -0
  141. package/apps/storybook/stories/catalog/slider.stories.tsx +18 -0
  142. package/apps/storybook/stories/catalog/social-button.stories.tsx +18 -0
  143. package/apps/storybook/stories/catalog/social-proof.stories.tsx +18 -0
  144. package/apps/storybook/stories/catalog/spinner.stories.tsx +15 -0
  145. package/apps/storybook/stories/catalog/store-button.stories.tsx +18 -0
  146. package/apps/storybook/stories/catalog/tabs.stories.tsx +38 -0
  147. package/apps/storybook/stories/catalog/tags.stories.tsx +18 -0
  148. package/apps/storybook/stories/catalog/team-page.stories.tsx +18 -0
  149. package/apps/storybook/stories/catalog/team-section.stories.tsx +18 -0
  150. package/apps/storybook/stories/catalog/testimonial-section.stories.tsx +18 -0
  151. package/apps/storybook/stories/catalog/textarea.stories.tsx +22 -0
  152. package/apps/storybook/stories/catalog/toggle.stories.tsx +18 -0
  153. package/apps/storybook/stories/catalog/tool-call.stories.tsx +40 -0
  154. package/apps/storybook/stories/catalog/tooltip.stories.tsx +30 -0
  155. package/apps/storybook/stories/catalog/tree-view.stories.tsx +18 -0
  156. package/apps/storybook/stories/catalog/utility-button.stories.tsx +60 -0
  157. package/apps/storybook/stories/catalog/verification-code.stories.tsx +18 -0
  158. package/apps/storybook/stories/catalog/verification-page.stories.tsx +18 -0
  159. package/apps/storybook/stories/catalog/video-player.stories.tsx +18 -0
  160. package/apps/storybook/stories/catalog/workflow-canvas.stories.tsx +45 -0
  161. package/apps/storybook/stories/catalog/workflow-node.stories.tsx +24 -0
  162. package/apps/storybook/vitest.config.ts +39 -0
  163. package/apps/web/README.md +13 -0
  164. package/apps/web/app.js +483 -0
  165. package/apps/web/favicon.svg +6 -0
  166. package/apps/web/index.html +205 -0
  167. package/apps/web/styles.css +1823 -0
  168. package/artifacts/original-delivery/NOE-Design-System-Delivery/README-FIRST.txt +20 -0
  169. package/artifacts/original-delivery/NOE-Design-System-Delivery/SHA256SUMS.txt +11 -0
  170. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-delivery-metadata.json +25 -0
  171. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-evidence.zip +0 -0
  172. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-execution-report.md +60 -0
  173. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-manifest.json +106 -0
  174. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-source.tar.gz +0 -0
  175. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-source.zip +0 -0
  176. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system.bundle +0 -0
  177. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-evidence-index.html +38 -0
  178. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-verification-status.txt +15 -0
  179. package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-visual-contact-sheet.png +0 -0
  180. package/artifacts/original-delivery/noe-design-system-evidence/README.txt +13 -0
  181. package/artifacts/original-delivery/noe-design-system-evidence/evidence/browser-console.json +4 -0
  182. package/artifacts/original-delivery/noe-design-system-evidence/evidence/layout-audit.json +4 -0
  183. package/artifacts/original-delivery/noe-design-system-evidence/evidence/review/contact-sheet.png +0 -0
  184. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1024.png +0 -0
  185. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1280.png +0 -0
  186. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1440.png +0 -0
  187. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-390.png +0 -0
  188. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-768.png +0 -0
  189. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1024.png +0 -0
  190. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1280.png +0 -0
  191. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1440.png +0 -0
  192. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-390.png +0 -0
  193. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-768.png +0 -0
  194. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1024.png +0 -0
  195. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1280.png +0 -0
  196. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1440.png +0 -0
  197. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-390.png +0 -0
  198. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-768.png +0 -0
  199. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1024.png +0 -0
  200. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1280.png +0 -0
  201. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1440.png +0 -0
  202. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-390.png +0 -0
  203. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-768.png +0 -0
  204. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-pseudo-ltr-1024.png +0 -0
  205. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-pseudo-rtl-1024.png +0 -0
  206. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/consumer-en-light-1440.png +0 -0
  207. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/consumer-fa-dark-1440.png +0 -0
  208. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/dashboard-en-light-1440.png +0 -0
  209. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/dashboard-fa-dark-1440.png +0 -0
  210. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/workflow-en-light-1440.png +0 -0
  211. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/workflow-fa-dark-1440.png +0 -0
  212. package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots-manifest.json +203 -0
  213. package/artifacts/original-delivery/noe-design-system-evidence/evidence/verification-result.json +165 -0
  214. package/artifacts/original-delivery/noe-design-system-evidence/evidence/verification-result.txt +32 -0
  215. package/artifacts/original-delivery/noe-design-system-evidence/evidence/visual-index.html +1 -0
  216. package/artifacts/original-delivery/noe-design-system-evidence/noe-delivery-metadata.json +25 -0
  217. package/artifacts/original-delivery/noe-design-system-evidence/noe-design-system-execution-report.md +60 -0
  218. package/artifacts/original-delivery/noe-design-system-evidence/noe-design-system-manifest.json +106 -0
  219. package/artifacts/original-delivery/noe-design-system-evidence/noe-verification-status.txt +15 -0
  220. package/artifacts/original-delivery/noe-design-system.bundle +0 -0
  221. package/artifacts/original-delivery/source-evidence/verification-result.json +165 -0
  222. package/artifacts/original-delivery/source-evidence/verification-result.txt +32 -0
  223. package/artifacts/registry-consumer-report.json +153 -0
  224. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Black.woff +0 -0
  225. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Bold.woff +0 -0
  226. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-DemiBold.woff +0 -0
  227. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-ExtraBlack.woff +0 -0
  228. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-ExtraBold.woff +0 -0
  229. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Heavy.woff +0 -0
  230. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Light.woff +0 -0
  231. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Medium.woff +0 -0
  232. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Regular.woff +0 -0
  233. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Thin.woff +0 -0
  234. package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-UltraLight.woff +0 -0
  235. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Black.woff2 +0 -0
  236. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Bold.woff2 +0 -0
  237. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-DemiBold.woff2 +0 -0
  238. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-ExtraBlack.woff2 +0 -0
  239. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-ExtraBold.woff2 +0 -0
  240. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Heavy.woff2 +0 -0
  241. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Light.woff2 +0 -0
  242. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Medium.woff2 +0 -0
  243. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Regular.woff2 +0 -0
  244. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Thin.woff2 +0 -0
  245. package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-UltraLight.woff2 +0 -0
  246. package/biome.json +170 -0
  247. package/components.json +23 -0
  248. package/docs/adr/0001-semantic-foundation.md +5 -0
  249. package/docs/adr/0002-locale-direction.md +5 -0
  250. package/docs/adr/0003-registry-mcp.md +5 -0
  251. package/docs/adr/0004-testing-evidence.md +5 -0
  252. package/docs/adr/0005-noe-package-namespace.md +9 -0
  253. package/docs/adr/0006-icons8-icon-policy.md +9 -0
  254. package/docs/adr/0007-registry-publication-contract.md +9 -0
  255. package/docs/adr/0008-capability-library-adapter-boundaries.md +16 -0
  256. package/docs/adr/0009-calendar-system-jalali.md +29 -0
  257. package/docs/adr/0010-canonical-manifest-ownership.md +29 -0
  258. package/docs/adr/0011-palette-graphite-governance.md +27 -0
  259. package/docs/adr/0012-persian-font-gating.md +25 -0
  260. package/docs/adr/0013-cinematic-token-exception.md +32 -0
  261. package/docs/design-system/README.md +16 -0
  262. package/docs/design-system/accessibility.md +20 -0
  263. package/docs/design-system/agent-guide.md +11 -0
  264. package/docs/design-system/agentic-ui.md +21 -0
  265. package/docs/design-system/architecture.md +40 -0
  266. package/docs/design-system/brand.md +59 -0
  267. package/docs/design-system/ci-cd.md +46 -0
  268. package/docs/design-system/components.md +88 -0
  269. package/docs/design-system/contributing.md +7 -0
  270. package/docs/design-system/foundations.md +40 -0
  271. package/docs/design-system/i18n.md +24 -0
  272. package/docs/design-system/inventory.md +389 -0
  273. package/docs/design-system/mcp.md +7 -0
  274. package/docs/design-system/motion.md +7 -0
  275. package/docs/design-system/noe-brand-audit.md +33 -0
  276. package/docs/design-system/registry.md +16 -0
  277. package/docs/design-system/rtl.md +27 -0
  278. package/docs/design-system/security.md +16 -0
  279. package/docs/design-system/testing.md +39 -0
  280. package/docs/design-system/tokens.md +38 -0
  281. package/docs/design-system/visual-qa.md +10 -0
  282. package/docs/superpowers/plans/2026-08-25-noe-design-system-development-ready.md +833 -0
  283. package/docs/superpowers/plans/2026-08-26-noe-complete-catalog.md +422 -0
  284. package/docs/superpowers/specs/2026-08-25-noe-design-system-development-ready-design.md +260 -0
  285. package/docs/superpowers/specs/2026-08-26-noe-complete-catalog-design.md +187 -0
  286. package/llms.txt +20 -0
  287. package/package.json +68 -0
  288. package/packages/ai-ui/package.json +15 -0
  289. package/packages/ai-ui/src/activity-feed.tsx +60 -0
  290. package/packages/ai-ui/src/agent-composer.tsx +54 -0
  291. package/packages/ai-ui/src/agent-message.tsx +50 -0
  292. package/packages/ai-ui/src/agent-plan.tsx +69 -0
  293. package/packages/ai-ui/src/agent-workspace.tsx +63 -0
  294. package/packages/ai-ui/src/approval-request.tsx +93 -0
  295. package/packages/ai-ui/src/index.ts +8 -0
  296. package/packages/ai-ui/src/run-inspector.tsx +54 -0
  297. package/packages/ai-ui/src/tool-call.tsx +71 -0
  298. package/packages/data-ui/package.json +16 -0
  299. package/packages/data-ui/src/activity-gauge.tsx +38 -0
  300. package/packages/data-ui/src/chart-frame.tsx +41 -0
  301. package/packages/data-ui/src/chart.tsx +131 -0
  302. package/packages/data-ui/src/dashboard-01.tsx +39 -0
  303. package/packages/data-ui/src/dashboard-02.tsx +33 -0
  304. package/packages/data-ui/src/dashboard-shell.tsx +56 -0
  305. package/packages/data-ui/src/data-table.tsx +99 -0
  306. package/packages/data-ui/src/filter-bar.tsx +28 -0
  307. package/packages/data-ui/src/index.ts +12 -0
  308. package/packages/data-ui/src/metric-card.tsx +43 -0
  309. package/packages/data-ui/src/pagination.tsx +67 -0
  310. package/packages/data-ui/src/pie-chart.tsx +38 -0
  311. package/packages/data-ui/src/radar-chart.tsx +38 -0
  312. package/packages/design-tokens/package.json +23 -0
  313. package/packages/design-tokens/src/base.css +255 -0
  314. package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Bold.woff2 +0 -0
  315. package/packages/design-tokens/src/fonts/IRANYekanXFaNum-DemiBold.woff2 +0 -0
  316. package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Medium.woff2 +0 -0
  317. package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Regular.woff2 +0 -0
  318. package/packages/design-tokens/src/fonts/IRANYekanXVF.ttf +0 -0
  319. package/packages/design-tokens/src/fonts/README.md +13 -0
  320. package/packages/design-tokens/src/fonts.css +49 -0
  321. package/packages/design-tokens/src/index.test.ts +36 -0
  322. package/packages/design-tokens/src/index.ts +5 -0
  323. package/packages/design-tokens/src/palette.ts +27 -0
  324. package/packages/design-tokens/src/tailwind.css +3 -0
  325. package/packages/design-tokens/src/theme.css +67 -0
  326. package/packages/design-tokens/src/tokens.css +251 -0
  327. package/packages/design-tokens/src/tokens.json +275 -0
  328. package/packages/design-tokens/src/tokens.mjs +276 -0
  329. package/packages/i18n/package.json +13 -0
  330. package/packages/i18n/src/index.ts +17 -0
  331. package/packages/i18n/src/messages/en.json +116 -0
  332. package/packages/i18n/src/messages/fa.json +116 -0
  333. package/packages/i18n/src/runtime.d.mts +42 -0
  334. package/packages/i18n/src/runtime.mjs +113 -0
  335. package/packages/i18n/src/translate.test.ts +50 -0
  336. package/packages/i18n/src/translate.ts +29 -0
  337. package/packages/icons/package.json +12 -0
  338. package/packages/icons/src/adapters.tsx +167 -0
  339. package/packages/icons/src/index.tsx +103 -0
  340. package/packages/registry/README.md +7 -0
  341. package/packages/registry/catalog-index.json +1345 -0
  342. package/packages/registry/component-audit.json +1038 -0
  343. package/packages/registry/coss-adoption.json +281 -0
  344. package/packages/registry/docs-index.json +1881 -0
  345. package/packages/registry/manifest.json +11081 -0
  346. package/packages/registry/manifest.schema.json +135 -0
  347. package/packages/registry/package.json +10 -0
  348. package/packages/registry/r/activity-feed.json +67 -0
  349. package/packages/registry/r/agent-composer.json +79 -0
  350. package/packages/registry/r/agent-message.json +72 -0
  351. package/packages/registry/r/agent-plan.json +67 -0
  352. package/packages/registry/r/agent-workspace.json +67 -0
  353. package/packages/registry/r/alert.json +68 -0
  354. package/packages/registry/r/app-frame.json +67 -0
  355. package/packages/registry/r/approval-request.json +84 -0
  356. package/packages/registry/r/badge.json +68 -0
  357. package/packages/registry/r/bidi-text.json +70 -0
  358. package/packages/registry/r/bottom-navigation.json +67 -0
  359. package/packages/registry/r/button.json +83 -0
  360. package/packages/registry/r/calendar.json +97 -0
  361. package/packages/registry/r/card.json +67 -0
  362. package/packages/registry/r/chart-frame.json +67 -0
  363. package/packages/registry/r/chart.json +67 -0
  364. package/packages/registry/r/code-block.json +67 -0
  365. package/packages/registry/r/context-menu.json +81 -0
  366. package/packages/registry/r/dashboard-01.json +86 -0
  367. package/packages/registry/r/dashboard-02.json +84 -0
  368. package/packages/registry/r/dashboard-shell.json +67 -0
  369. package/packages/registry/r/data-list.json +67 -0
  370. package/packages/registry/r/data-table.json +72 -0
  371. package/packages/registry/r/date-picker.json +117 -0
  372. package/packages/registry/r/dialog.json +84 -0
  373. package/packages/registry/r/direction-provider.json +54 -0
  374. package/packages/registry/r/drawer.json +80 -0
  375. package/packages/registry/r/dropdown.json +78 -0
  376. package/packages/registry/r/empty-state.json +67 -0
  377. package/packages/registry/r/error-state.json +67 -0
  378. package/packages/registry/r/fab.json +80 -0
  379. package/packages/registry/r/featured-icon.json +71 -0
  380. package/packages/registry/r/filter-bar.json +69 -0
  381. package/packages/registry/r/gradient-picker.json +62 -0
  382. package/packages/registry/r/header-navigation.json +67 -0
  383. package/packages/registry/r/hero-header.json +63 -0
  384. package/packages/registry/r/icon-system.json +59 -0
  385. package/packages/registry/r/image-picker.json +62 -0
  386. package/packages/registry/r/inline-cta.json +73 -0
  387. package/packages/registry/r/input.json +73 -0
  388. package/packages/registry/r/landing-page.json +70 -0
  389. package/packages/registry/r/login-page.json +71 -0
  390. package/packages/registry/r/marketing-header.json +63 -0
  391. package/packages/registry/r/menu.json +74 -0
  392. package/packages/registry/r/messaging.json +69 -0
  393. package/packages/registry/r/metric-card.json +67 -0
  394. package/packages/registry/r/mobile-screen.json +67 -0
  395. package/packages/registry/r/not-found.json +63 -0
  396. package/packages/registry/r/page-header.json +67 -0
  397. package/packages/registry/r/pagination.json +91 -0
  398. package/packages/registry/r/progress-steps.json +69 -0
  399. package/packages/registry/r/run-inspector.json +72 -0
  400. package/packages/registry/r/section-header.json +67 -0
  401. package/packages/registry/r/settings-01.json +94 -0
  402. package/packages/registry/r/settings-02.json +99 -0
  403. package/packages/registry/r/settings-page.json +67 -0
  404. package/packages/registry/r/sidebar-navigation.json +67 -0
  405. package/packages/registry/r/sign-in-form.json +89 -0
  406. package/packages/registry/r/skeleton.json +67 -0
  407. package/packages/registry/r/spinner.json +67 -0
  408. package/packages/registry/r/tabs.json +69 -0
  409. package/packages/registry/r/textarea.json +73 -0
  410. package/packages/registry/r/tool-call.json +72 -0
  411. package/packages/registry/r/tooltip.json +73 -0
  412. package/packages/registry/r/utility-button.json +83 -0
  413. package/packages/registry/r/workflow-canvas.json +67 -0
  414. package/packages/registry/r/workflow-node.json +72 -0
  415. package/packages/registry/r-planned-backup/about-page.json +14 -0
  416. package/packages/registry/r-planned-backup/activity-gauge.json +14 -0
  417. package/packages/registry/r-planned-backup/avatar.json +14 -0
  418. package/packages/registry/r-planned-backup/badge-group.json +14 -0
  419. package/packages/registry/r-planned-backup/banner.json +14 -0
  420. package/packages/registry/r-planned-backup/blog-index-page.json +14 -0
  421. package/packages/registry/r-planned-backup/blog-post-page.json +14 -0
  422. package/packages/registry/r-planned-backup/blog-section.json +14 -0
  423. package/packages/registry/r-planned-backup/button-group.json +14 -0
  424. package/packages/registry/r-planned-backup/careers-section.json +14 -0
  425. package/packages/registry/r-planned-backup/carousel.json +14 -0
  426. package/packages/registry/r-planned-backup/checkbox.json +14 -0
  427. package/packages/registry/r-planned-backup/color-picker.json +14 -0
  428. package/packages/registry/r-planned-backup/command-menu.json +14 -0
  429. package/packages/registry/r-planned-backup/contact-page.json +14 -0
  430. package/packages/registry/r-planned-backup/contact-section.json +14 -0
  431. package/packages/registry/r-planned-backup/content-divider.json +14 -0
  432. package/packages/registry/r-planned-backup/content-section.json +14 -0
  433. package/packages/registry/r-planned-backup/credit-card.json +14 -0
  434. package/packages/registry/r-planned-backup/cta-section.json +14 -0
  435. package/packages/registry/r-planned-backup/email-template.json +14 -0
  436. package/packages/registry/r-planned-backup/faq-page.json +14 -0
  437. package/packages/registry/r-planned-backup/faq-section.json +14 -0
  438. package/packages/registry/r-planned-backup/feature-section.json +14 -0
  439. package/packages/registry/r-planned-backup/file-uploader.json +14 -0
  440. package/packages/registry/r-planned-backup/footer.json +14 -0
  441. package/packages/registry/r-planned-backup/forgot-password-page.json +14 -0
  442. package/packages/registry/r-planned-backup/illustration.json +14 -0
  443. package/packages/registry/r-planned-backup/informational-page-01.json +14 -0
  444. package/packages/registry/r-planned-backup/informational-page-02.json +14 -0
  445. package/packages/registry/r-planned-backup/legal-page.json +14 -0
  446. package/packages/registry/r-planned-backup/marketing-404-page.json +14 -0
  447. package/packages/registry/r-planned-backup/metrics-section.json +14 -0
  448. package/packages/registry/r-planned-backup/multi-select.json +14 -0
  449. package/packages/registry/r-planned-backup/newsletter.json +14 -0
  450. package/packages/registry/r-planned-backup/notification.json +14 -0
  451. package/packages/registry/r-planned-backup/pie-chart.json +14 -0
  452. package/packages/registry/r-planned-backup/pricing-page.json +14 -0
  453. package/packages/registry/r-planned-backup/pricing-section.json +14 -0
  454. package/packages/registry/r-planned-backup/progress-indicator.json +14 -0
  455. package/packages/registry/r-planned-backup/qr-code.json +14 -0
  456. package/packages/registry/r-planned-backup/radar-chart.json +14 -0
  457. package/packages/registry/r-planned-backup/radio-group.json +14 -0
  458. package/packages/registry/r-planned-backup/rating.json +14 -0
  459. package/packages/registry/r-planned-backup/rich-text-editor.json +14 -0
  460. package/packages/registry/r-planned-backup/section-footer.json +14 -0
  461. package/packages/registry/r-planned-backup/select.json +14 -0
  462. package/packages/registry/r-planned-backup/sign-up-page.json +14 -0
  463. package/packages/registry/r-planned-backup/slider.json +14 -0
  464. package/packages/registry/r-planned-backup/social-button.json +14 -0
  465. package/packages/registry/r-planned-backup/social-proof.json +14 -0
  466. package/packages/registry/r-planned-backup/store-button.json +14 -0
  467. package/packages/registry/r-planned-backup/tags.json +14 -0
  468. package/packages/registry/r-planned-backup/team-page.json +14 -0
  469. package/packages/registry/r-planned-backup/team-section.json +14 -0
  470. package/packages/registry/r-planned-backup/testimonial-section.json +14 -0
  471. package/packages/registry/r-planned-backup/toggle.json +14 -0
  472. package/packages/registry/r-planned-backup/tree-view.json +14 -0
  473. package/packages/registry/r-planned-backup/verification-code.json +14 -0
  474. package/packages/registry/r-planned-backup/verification-page.json +14 -0
  475. package/packages/registry/r-planned-backup/video-player.json +14 -0
  476. package/packages/registry/registry.json +1997 -0
  477. package/packages/registry/search-index.json +3942 -0
  478. package/packages/testing/package.json +9 -0
  479. package/packages/testing/src/index.mjs +10 -0
  480. package/packages/ui/package.json +26 -0
  481. package/packages/ui/src/about-page.tsx +19 -0
  482. package/packages/ui/src/alert.tsx +67 -0
  483. package/packages/ui/src/app-frame.tsx +63 -0
  484. package/packages/ui/src/avatar.tsx +19 -0
  485. package/packages/ui/src/badge-group.tsx +19 -0
  486. package/packages/ui/src/badge.tsx +35 -0
  487. package/packages/ui/src/banner.tsx +19 -0
  488. package/packages/ui/src/bidi.tsx +80 -0
  489. package/packages/ui/src/blog-index-page.tsx +19 -0
  490. package/packages/ui/src/blog-post-page.tsx +19 -0
  491. package/packages/ui/src/blog-section.tsx +19 -0
  492. package/packages/ui/src/bottom-navigation.tsx +60 -0
  493. package/packages/ui/src/button-group.tsx +19 -0
  494. package/packages/ui/src/button.browser.test.tsx +38 -0
  495. package/packages/ui/src/button.tsx +81 -0
  496. package/packages/ui/src/calendar-system.test.ts +103 -0
  497. package/packages/ui/src/calendar-system.ts +120 -0
  498. package/packages/ui/src/calendar.browser.test.tsx +52 -0
  499. package/packages/ui/src/calendar.tsx +339 -0
  500. package/packages/ui/src/card.tsx +63 -0
  501. package/packages/ui/src/careers-section.tsx +19 -0
  502. package/packages/ui/src/carousel.tsx +19 -0
  503. package/packages/ui/src/checkbox.tsx +17 -0
  504. package/packages/ui/src/cinematic/cinematic.css +2020 -0
  505. package/packages/ui/src/cinematic/ecosystem-motion-showcase.tsx +265 -0
  506. package/packages/ui/src/cinematic/ecosystem-sphere.tsx +627 -0
  507. package/packages/ui/src/cinematic/index.ts +5 -0
  508. package/packages/ui/src/cinematic/kinetic-experience.tsx +207 -0
  509. package/packages/ui/src/cinematic/portfolio.ts +132 -0
  510. package/packages/ui/src/cinematic/system-anatomy.tsx +173 -0
  511. package/packages/ui/src/code.tsx +119 -0
  512. package/packages/ui/src/color-picker.tsx +22 -0
  513. package/packages/ui/src/command-menu.tsx +19 -0
  514. package/packages/ui/src/contact-page.tsx +19 -0
  515. package/packages/ui/src/contact-section.tsx +19 -0
  516. package/packages/ui/src/content-divider.tsx +19 -0
  517. package/packages/ui/src/content-section.tsx +19 -0
  518. package/packages/ui/src/context-menu.tsx +208 -0
  519. package/packages/ui/src/credit-card.tsx +19 -0
  520. package/packages/ui/src/cta-section.tsx +19 -0
  521. package/packages/ui/src/data-list.tsx +81 -0
  522. package/packages/ui/src/date-picker.browser.test.tsx +48 -0
  523. package/packages/ui/src/date-picker.tsx +248 -0
  524. package/packages/ui/src/dialog.browser.test.tsx +32 -0
  525. package/packages/ui/src/dialog.tsx +144 -0
  526. package/packages/ui/src/direction.tsx +46 -0
  527. package/packages/ui/src/drawer.tsx +179 -0
  528. package/packages/ui/src/dropdown.tsx +200 -0
  529. package/packages/ui/src/email-template.tsx +19 -0
  530. package/packages/ui/src/empty-state.tsx +43 -0
  531. package/packages/ui/src/error-state.tsx +44 -0
  532. package/packages/ui/src/fab.tsx +32 -0
  533. package/packages/ui/src/faq-page.tsx +19 -0
  534. package/packages/ui/src/faq-section.tsx +19 -0
  535. package/packages/ui/src/feature-section.tsx +19 -0
  536. package/packages/ui/src/featured-icon.tsx +63 -0
  537. package/packages/ui/src/field.browser.test.tsx +33 -0
  538. package/packages/ui/src/field.tsx +117 -0
  539. package/packages/ui/src/file-uploader.tsx +19 -0
  540. package/packages/ui/src/footer.tsx +19 -0
  541. package/packages/ui/src/forgot-password-page.tsx +19 -0
  542. package/packages/ui/src/gradient-picker.tsx +65 -0
  543. package/packages/ui/src/header-navigation.tsx +71 -0
  544. package/packages/ui/src/hero-header.tsx +57 -0
  545. package/packages/ui/src/illustration.tsx +19 -0
  546. package/packages/ui/src/image-picker.tsx +56 -0
  547. package/packages/ui/src/index.ts +110 -0
  548. package/packages/ui/src/informational-page-01.tsx +19 -0
  549. package/packages/ui/src/informational-page-02.tsx +19 -0
  550. package/packages/ui/src/inline-cta.tsx +29 -0
  551. package/packages/ui/src/input.tsx +44 -0
  552. package/packages/ui/src/landing-page.tsx +56 -0
  553. package/packages/ui/src/legal-page.tsx +19 -0
  554. package/packages/ui/src/lib/cn.ts +6 -0
  555. package/packages/ui/src/lib/i18n-messages.ts +40 -0
  556. package/packages/ui/src/login-page.tsx +78 -0
  557. package/packages/ui/src/marketing-404-page.tsx +19 -0
  558. package/packages/ui/src/marketing-header.tsx +53 -0
  559. package/packages/ui/src/menu.tsx +220 -0
  560. package/packages/ui/src/messaging.tsx +62 -0
  561. package/packages/ui/src/metrics-section.tsx +19 -0
  562. package/packages/ui/src/mobile-screen.tsx +37 -0
  563. package/packages/ui/src/multi-select.tsx +16 -0
  564. package/packages/ui/src/newsletter.tsx +19 -0
  565. package/packages/ui/src/not-found.tsx +60 -0
  566. package/packages/ui/src/notification.tsx +19 -0
  567. package/packages/ui/src/page-header.tsx +80 -0
  568. package/packages/ui/src/pricing-page.tsx +19 -0
  569. package/packages/ui/src/pricing-section.tsx +19 -0
  570. package/packages/ui/src/progress-indicator.tsx +19 -0
  571. package/packages/ui/src/progress-steps.tsx +85 -0
  572. package/packages/ui/src/qr-code.tsx +19 -0
  573. package/packages/ui/src/radio-group.tsx +26 -0
  574. package/packages/ui/src/rating.tsx +19 -0
  575. package/packages/ui/src/rich-text-editor.tsx +18 -0
  576. package/packages/ui/src/section-footer.tsx +19 -0
  577. package/packages/ui/src/section-header.tsx +37 -0
  578. package/packages/ui/src/select.tsx +27 -0
  579. package/packages/ui/src/settings-01.tsx +49 -0
  580. package/packages/ui/src/settings-02.tsx +58 -0
  581. package/packages/ui/src/settings-page.tsx +62 -0
  582. package/packages/ui/src/sidebar-navigation.tsx +77 -0
  583. package/packages/ui/src/sign-in-form.tsx +60 -0
  584. package/packages/ui/src/sign-up-page.tsx +19 -0
  585. package/packages/ui/src/skeleton.tsx +14 -0
  586. package/packages/ui/src/slider.tsx +13 -0
  587. package/packages/ui/src/social-button.tsx +19 -0
  588. package/packages/ui/src/social-proof.tsx +19 -0
  589. package/packages/ui/src/spinner.tsx +26 -0
  590. package/packages/ui/src/store-button.tsx +19 -0
  591. package/packages/ui/src/tabs.browser.test.tsx +33 -0
  592. package/packages/ui/src/tabs.tsx +175 -0
  593. package/packages/ui/src/tags.tsx +11 -0
  594. package/packages/ui/src/team-page.tsx +19 -0
  595. package/packages/ui/src/team-section.tsx +19 -0
  596. package/packages/ui/src/testimonial-section.tsx +19 -0
  597. package/packages/ui/src/textarea.tsx +45 -0
  598. package/packages/ui/src/theme-provider.browser.test.tsx +90 -0
  599. package/packages/ui/src/theme-provider.tsx +417 -0
  600. package/packages/ui/src/theme-toggle.tsx +107 -0
  601. package/packages/ui/src/toggle.tsx +34 -0
  602. package/packages/ui/src/tooltip.tsx +50 -0
  603. package/packages/ui/src/tree-view.tsx +19 -0
  604. package/packages/ui/src/utility-button.tsx +33 -0
  605. package/packages/ui/src/utils.ts +13 -0
  606. package/packages/ui/src/verification-code.tsx +27 -0
  607. package/packages/ui/src/verification-page.tsx +19 -0
  608. package/packages/ui/src/video-player.tsx +19 -0
  609. package/packages/workflow-ui/package.json +15 -0
  610. package/packages/workflow-ui/src/index.ts +2 -0
  611. package/packages/workflow-ui/src/workflow-canvas.tsx +51 -0
  612. package/packages/workflow-ui/src/workflow-node.tsx +61 -0
  613. package/playwright.config.ts +58 -0
  614. package/pnpm-workspace.yaml +5 -0
  615. package/registry.json +216 -0
  616. package/scripts/build-static.mjs +68 -0
  617. package/scripts/capture-visuals.py +106 -0
  618. package/scripts/capture-visuals.sh +10 -0
  619. package/scripts/create-visual-index.mjs +16 -0
  620. package/scripts/enrich-registry-payloads.mjs +83 -0
  621. package/scripts/fix-noe-imports.mjs +134 -0
  622. package/scripts/fix-registry-closure.mjs +110 -0
  623. package/scripts/fix-registry-deps-cleanup.mjs +149 -0
  624. package/scripts/fix-relative-for-registry.mjs +103 -0
  625. package/scripts/generate-design-tokens.mjs +134 -0
  626. package/scripts/generate-inventory.mjs +62 -0
  627. package/scripts/generate-manifest.mjs +1149 -0
  628. package/scripts/generate-phase4.mjs +875 -0
  629. package/scripts/validate-manifest.mjs +477 -0
  630. package/scripts/validate-pngs.mjs +31 -0
  631. package/scripts/verify-registry-consumer.mjs +319 -0
  632. package/scripts/verify-registry-dependencies.mjs +162 -0
  633. package/scripts/verify.mjs +316 -0
  634. package/tests/catalog-audit.test.mjs +156 -0
  635. package/tests/e2e/capture-visuals.mjs +34 -0
  636. package/tests/e2e/catalog-typography.spec.ts +110 -0
  637. package/tests/e2e/catalog.spec.ts +68 -0
  638. package/tests/e2e/direction.spec.ts +60 -0
  639. package/tests/e2e/responsive.spec.ts +30 -0
  640. package/tests/e2e/surfaces.spec.ts +51 -0
  641. package/tests/i18n.test.mjs +36 -0
  642. package/tests/icons.test.mjs +21 -0
  643. package/tests/registry-publication.test.mjs +88 -0
  644. package/tests/registry.test.mjs +51 -0
  645. package/tests/rtl.test.mjs +21 -0
  646. package/tests/static-app.test.mjs +49 -0
  647. package/tests/tokens.test.mjs +24 -0
  648. package/tests/workspace.test.mjs +25 -0
  649. package/tsconfig.base.json +69 -0
  650. package/tsconfig.json +27 -0
  651. package/tsconfig.verify.json +19 -0
  652. package/types/offline-react.d.ts +73 -0
  653. package/vitest.config.ts +91 -0
@@ -0,0 +1,187 @@
1
+ # Complete NOE Design Catalog and Coss/Base UI Adoption
2
+
3
+ **Date:** 2026-08-26
4
+ **Status:** Draft for user review
5
+ **Scope root:** `/Users/ali/Documents/NoEcosystem/design-system`
6
+
7
+ ## Objective
8
+
9
+ Make every public NOE design component inspectable in one running catalog. The
10
+ catalog is both the product team's visual audit surface and the source of
11
+ executable component documentation. It must be complete by contract: no public
12
+ component may be shipped without an entry, states to inspect, locale/direction
13
+ coverage, accessibility evidence, and registry metadata where it is
14
+ installable.
15
+
16
+ The user-supplied Coss, Base UI, dark component-grid, and responsive dashboard
17
+ examples are visual and architectural reference material. They do not grant a
18
+ license to copy their source or visual assets, and they do not override the NOE
19
+ token, accessibility, direction, or ownership contracts.
20
+
21
+ ## Definition of Complete
22
+
23
+ "Complete" means the catalog reflects the complete public NOE component
24
+ surface, not that it silently presents planned external components as finished.
25
+
26
+ For every exported NOE component or documented composition, the catalog must
27
+ provide:
28
+
29
+ - a discoverable entry and category;
30
+ - a live preview using the public package export;
31
+ - a concise purpose and do/don't guidance;
32
+ - all supported variants and meaningful interaction states;
33
+ - keyboard, focus, disabled, loading, error, long-content, light, dark, LTR,
34
+ RTL, Persian, and English audit coverage as applicable;
35
+ - source and registry/install metadata where the component is distributable;
36
+ - an explicit maturity state: `available`, `in-progress`, or `planned`.
37
+
38
+ `available` requires executable evidence. The catalog must never visually
39
+ imply that a planned item has been implemented.
40
+
41
+ ## Information Architecture
42
+
43
+ The canonical audit experience is a React Storybook application, supplemented
44
+ by a curated NOE Catalog landing page.
45
+
46
+ ```text
47
+ Catalog landing
48
+ Foundations
49
+ Typography, colour roles, spacing, elevation, motion, icons, bidi
50
+ Primitives
51
+ Controls, inputs, feedback, overlays, navigation, layout
52
+ Patterns
53
+ Data, agent, approval, artifact, workflow compositions
54
+ Product surfaces
55
+ Consumer, dashboard, agent workspace, workflow builder
56
+ Audit
57
+ Component matrix, accessibility, direction, locale, responsive evidence
58
+ ```
59
+
60
+ The landing page uses a dense, quiet component grid inspired by the supplied
61
+ references: clear labels, real previews, restrained borders, deliberate empty
62
+ space, and no decorative treatment outside existing NOE tokens. The dashboard
63
+ surface demonstrates the same components in responsive product context. It is
64
+ not a copy of any reference site.
65
+
66
+ Global controls switch theme, locale, direction, density, and viewport preview.
67
+ Controls apply before first paint where document `lang` and `dir` are involved.
68
+ Links permit a reviewer to enter any component or state directly.
69
+
70
+ ## Typography Contract
71
+
72
+ Typography is a semantic token contract, not a per-story convention.
73
+
74
+ - English and other Latin UI copy use `SF Pro Text`; display headings use
75
+ `SF Pro Display`.
76
+ - Persian and Arabic UI copy use the locally supplied `IRANYekanXFaNum` for
77
+ regular, medium, semibold, and bold weights.
78
+ - `html[lang="fa"]`, `html[lang="ar"]`, and nested matching language scopes
79
+ override the semantic sans and heading variables rather than relying on a
80
+ glyph fallback.
81
+ - Technical values keep the semantic monospace family and explicit LTR
82
+ isolation even inside RTL layouts.
83
+
84
+ The self-hosted IRANYekan files remain subject to the existing licensing note;
85
+ no proprietary SF Pro files are added to the repository. SF Pro remains a
86
+ system-font reference with documented platform fallbacks.
87
+
88
+ ## Coss and Base UI Strategy
89
+
90
+ Base UI supplies accessible behaviour and Coss supplies verified composition
91
+ patterns. Neither library's default visual language may escape as a NOE product
92
+ API.
93
+
94
+ ```text
95
+ Base UI behaviour
96
+ -> selected, locally owned Coss-derived compositions
97
+ -> NOE semantic-token styling and bidi contracts
98
+ -> @noe public packages and registry
99
+ -> catalog and product consumers
100
+ ```
101
+
102
+ Each Coss primitive is tracked in a machine-readable adoption matrix with one
103
+ of these outcomes:
104
+
105
+ - `adopted`: implemented as a NOE-owned public component and fully auditable;
106
+ - `compose-only`: used internally by an NOE pattern, not exposed as a second
107
+ public primitive;
108
+ - `deferred`: intentionally not yet in the NOE public surface, with rationale;
109
+ - `blocked`: needs an explicit dependency, API, or design decision.
110
+
111
+ Coss particles inform NOE patterns such as authentication, command surfaces,
112
+ forms, tables, and settings. They are adapted only when they add a real product
113
+ contract; the catalog does not bulk-copy the external particle library.
114
+
115
+ No Coss or Base UI API is guessed. Version compatibility, installation source,
116
+ licenses, accessibility behaviour, portal direction, and controlled state are
117
+ verified before each adoption.
118
+
119
+ ## Package and Catalog Boundaries
120
+
121
+ - `@noe/design-tokens` owns the semantic font, colour, spacing, motion, and
122
+ theme decisions.
123
+ - `@noe/i18n` owns locales, messages, direction, formatting, and pseudo-locales.
124
+ - `@noe/ui` owns direction-safe primitives and the Base UI/Coss adapters.
125
+ - `@noe/data-ui`, `@noe/ai-ui`, and `@noe/workflow-ui` own NOE pattern-level
126
+ compositions.
127
+ - `@noe/registry` owns installable component metadata and adoption/maturity
128
+ information.
129
+ - `apps/storybook` owns the executable documentation and audit controls.
130
+ - `apps/showcase` owns curated product and catalog entry surfaces; it does not
131
+ duplicate Storybook's component implementation.
132
+
133
+ The registry becomes the inventory source. Automated checks compare public
134
+ exports, registry entries, story coverage, and the audit matrix, failing if an
135
+ available component is absent from any required surface.
136
+
137
+ ## Interaction, Accessibility, and Direction
138
+
139
+ Interactive primitives use verified Base UI/Coss hierarchy and composition
140
+ rules, especially for dialogs, menus, selects, popovers, drawers, forms, and
141
+ toasts. Every portalled UI receives explicit direction. Components retain
142
+ logical CSS and do not solve RTL with global reversal or global icon mirroring.
143
+
144
+ The catalog exposes keyboard instructions and accessibility state rather than
145
+ requiring a reviewer to infer them from source. Overlay, focus, label,
146
+ description, error, disabled, and destructive-action behaviour are interaction
147
+ tests, not visual claims.
148
+
149
+ ## Verification and Evidence
150
+
151
+ The implementation adds a coverage contract that reports all public components
152
+ and their documentation/audit status. Completion evidence includes:
153
+
154
+ - token tests proving the explicit English and Persian font contracts;
155
+ - component tests for relevant Base UI/Coss interaction semantics;
156
+ - Storybook interaction and accessibility tests for every available story;
157
+ - Playwright audit flows for theme, locale, direction, responsive widths, search,
158
+ filters, and component deep-links;
159
+ - deterministic visual review for selected foundations, primitives, patterns,
160
+ and product surfaces;
161
+ - registry and public-export parity checks;
162
+ - `pnpm check`, `pnpm test:storybook`, `pnpm test:e2e`, and repository-level
163
+ `make check` results.
164
+
165
+ ## Non-goals
166
+
167
+ - Copying Coss, Base UI, or the supplied reference websites pixel-for-pixel.
168
+ - Shipping all externally available Coss particles merely because they exist.
169
+ - Replacing NOE tokens, i18n, or public package boundaries with external APIs.
170
+ - Claiming a component is implemented before its story and executable audit
171
+ coverage exist.
172
+ - Publishing, deploying, or changing production infrastructure.
173
+
174
+ ## Delivery Sequence
175
+
176
+ 1. Establish catalog inventory, maturity metadata, and coverage checks.
177
+ 2. Correct the explicit language-aware typography contract with tests.
178
+ 3. Install or normalize only the verified Base UI/Coss foundations required by
179
+ the adoption matrix.
180
+ 4. Build the catalog shell, global audit controls, navigation, search, and
181
+ preview grid.
182
+ 5. Add and group complete stories for every existing public NOE component.
183
+ 6. Adopt missing primitives and patterns in dependency order, each with public
184
+ API, registry data, story, interaction test, and RTL coverage.
185
+ 7. Build curated product surfaces from the same public components.
186
+ 8. Run the full automated and visual verification matrix, report gaps honestly,
187
+ and retain a visible `planned` state for anything not yet available.
package/llms.txt ADDED
@@ -0,0 +1,20 @@
1
+ # NOE Design System retrieval map
2
+
3
+ - Repository overview: README.md
4
+ - Agent rules: AGENTS.md
5
+ - Architecture: docs/design-system/architecture.md
6
+ - Brand audit: docs/design-system/noe-brand-audit.md
7
+ - Foundations and tokens: docs/design-system/foundations.md, docs/design-system/tokens.md
8
+ - Components: docs/design-system/components.md
9
+ - Internationalization: docs/design-system/i18n.md
10
+ - RTL and bidi: docs/design-system/rtl.md
11
+ - Motion: docs/design-system/motion.md
12
+ - Accessibility: docs/design-system/accessibility.md
13
+ - Agentic UI: docs/design-system/agentic-ui.md
14
+ - Testing and visual QA: docs/design-system/testing.md, docs/design-system/visual-qa.md
15
+ - CI/CD and security: docs/design-system/ci-cd.md, docs/design-system/security.md
16
+ - Registry and MCP: docs/design-system/registry.md, docs/design-system/mcp.md
17
+ - Contribution workflow: docs/design-system/contributing.md
18
+ - Decisions: docs/adr/
19
+ - Static reference app: apps/web/
20
+ - Storybook source: apps/storybook/
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "noecosystem-design",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "type": "module",
9
+ "packageManager": "pnpm@11.23.0",
10
+ "engines": {
11
+ "node": ">=24.19.0"
12
+ },
13
+ "scripts": {
14
+ "dev": "pnpm --filter @noe/showcase dev",
15
+ "storybook": "pnpm --filter @noe/storybook storybook",
16
+ "format": "biome format --write .",
17
+ "format:check": "biome format .",
18
+ "gen:inventory": "node scripts/generate-inventory.mjs",
19
+ "gen:manifest": "node scripts/generate-manifest.mjs",
20
+ "validate:manifest": "node scripts/validate-manifest.mjs",
21
+ "lint": "biome lint .",
22
+ "typecheck": "tsc -p tsconfig.json --pretty false",
23
+ "test": "node --test tests/*.test.mjs && vitest run --project unit",
24
+ "test:components": "vitest run --project browser",
25
+ "test:storybook": "vitest run --project storybook --config apps/storybook/vitest.config.ts",
26
+ "test:e2e": "playwright test",
27
+ "test:registry:consumer": "node scripts/verify-registry-consumer.mjs",
28
+ "test:registry": "node scripts/validate-manifest.mjs",
29
+ "test:manifest": "node scripts/validate-manifest.mjs",
30
+ "test:exports": "node scripts/validate-manifest.mjs",
31
+ "test:coverage": "node scripts/validate-manifest.mjs",
32
+ "test:tokens": "node scripts/verify.mjs",
33
+ "build": "pnpm -r --if-present build",
34
+ "build:storybook": "pnpm --filter @noe/storybook build-storybook",
35
+ "verify": "node scripts/verify.mjs && node scripts/validate-manifest.mjs",
36
+ "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm test:components && pnpm gen:manifest && pnpm validate:manifest && pnpm build && pnpm build:storybook && pnpm verify",
37
+ "test:offline": "node --test tests/*.test.mjs",
38
+ "typecheck:offline": "tsc -p tsconfig.verify.json --pretty false",
39
+ "build:static": "node scripts/build-static.mjs",
40
+ "visual:legacy": "bash scripts/capture-visuals.sh"
41
+ },
42
+ "devDependencies": {
43
+ "@biomejs/biome": "2.5.10",
44
+ "@playwright/test": "1.62.1",
45
+ "@storybook/addon-a11y": "10.5.10",
46
+ "@storybook/addon-docs": "10.5.10",
47
+ "@storybook/addon-vitest": "10.5.10",
48
+ "@storybook/react-vite": "10.5.10",
49
+ "@tailwindcss/vite": "4.3.3",
50
+ "@testing-library/react": "16.3.2",
51
+ "@testing-library/user-event": "14.6.6",
52
+ "@types/node": "26.2.0",
53
+ "@types/react": "19.2.18",
54
+ "@types/react-dom": "19.2.5",
55
+ "@vitejs/plugin-react": "6.1.0",
56
+ "@vitest/browser-playwright": "4.1.11",
57
+ "jsdom": "30.0.1",
58
+ "react": "19.2.8",
59
+ "react-dom": "19.2.8",
60
+ "storybook": "10.5.10",
61
+ "tailwindcss": "4.3.3",
62
+ "typescript": "7.0.2",
63
+ "vite": "8.2.2",
64
+ "vite-tsconfig-paths": "^6.1.1",
65
+ "vitest": "4.1.11",
66
+ "vitest-browser-react": "2.2.0"
67
+ }
68
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@noe/ai-ui",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "dependencies": {
7
+ "@noe/ui": "workspace:*"
8
+ },
9
+ "peerDependencies": {
10
+ "react": "^19.2.0"
11
+ },
12
+ "exports": {
13
+ ".": "./src/index.ts"
14
+ }
15
+ }
@@ -0,0 +1,60 @@
1
+
2
+ import type * as React from 'react';
3
+ import { cn } from '@noe/ui/lib/cn';
4
+
5
+ export interface ActivityFeedItem {
6
+ id: string;
7
+ label: React.ReactNode;
8
+ meta?: React.ReactNode;
9
+ timestamp?: React.ReactNode;
10
+ status?: 'neutral' | 'positive' | 'warning' | 'error';
11
+ }
12
+
13
+ export interface ActivityFeedProps extends React.ComponentProps<'ol'> {
14
+ label: string;
15
+ items: readonly ActivityFeedItem[];
16
+ }
17
+
18
+ const statusClassName = {
19
+ neutral: 'bg-muted-foreground',
20
+ positive: 'bg-success',
21
+ warning: 'bg-warning',
22
+ error: 'bg-destructive',
23
+ } as const;
24
+
25
+ export function ActivityFeed({ label, items, className, ...props }: ActivityFeedProps) {
26
+ return (
27
+ <ol
28
+ aria-label={label}
29
+ className={cn('m-0 flex list-none flex-col p-0', className)}
30
+ data-slot="activity-feed"
31
+ {...props}
32
+ >
33
+ {items.map((item) => (
34
+ <li
35
+ className="relative flex gap-3 pb-4 ps-1 last:pb-0"
36
+ data-slot="activity-feed-item"
37
+ data-status={item.status ?? 'neutral'}
38
+ key={item.id}
39
+ >
40
+ <span
41
+ aria-hidden="true"
42
+ className={cn(
43
+ 'mt-2 size-2 shrink-0 rounded-full',
44
+ statusClassName[item.status ?? 'neutral'],
45
+ )}
46
+ />
47
+ <div className="flex min-w-0 flex-1 flex-col gap-0.5 text-start">
48
+ <span className="text-sm leading-normal text-foreground">{item.label}</span>
49
+ {item.meta || item.timestamp ? (
50
+ <span className="flex flex-wrap items-center gap-x-2 text-xs leading-normal text-muted-foreground">
51
+ {item.meta ? <span>{item.meta}</span> : null}
52
+ {item.timestamp ? <span className="tabular-nums">{item.timestamp}</span> : null}
53
+ </span>
54
+ ) : null}
55
+ </div>
56
+ </li>
57
+ ))}
58
+ </ol>
59
+ );
60
+ }
@@ -0,0 +1,54 @@
1
+ import type * as React from 'react';
2
+ import { Button } from '@noe/ui/button';
3
+ import { cn } from '@noe/ui/lib/cn';
4
+
5
+ export function AgentComposer({
6
+ value,
7
+ onChange,
8
+ onSubmit,
9
+ placeholder,
10
+ submitLabel,
11
+ disabled,
12
+ className,
13
+ }: {
14
+ value: string;
15
+ onChange(value: string): void;
16
+ onSubmit(): void;
17
+ placeholder: string;
18
+ submitLabel: string;
19
+ disabled?: boolean;
20
+ className?: string;
21
+ }) {
22
+ return (
23
+ <form
24
+ className={cn(
25
+ 'flex flex-col gap-3 rounded-lg border border-border bg-surface-raised p-3 transition-[border-color,box-shadow] duration-(--noe-motion-duration-fast) focus-within:border-accent focus-within:ring-2 focus-within:ring-focus-ring',
26
+ className,
27
+ )}
28
+ data-slot="agent-composer"
29
+ onSubmit={(event: React.FormEvent<HTMLFormElement>) => {
30
+ event.preventDefault();
31
+ onSubmit();
32
+ }}
33
+ >
34
+ <textarea
35
+ className="field-sizing-content max-h-48 min-h-16 w-full resize-none rounded-md border-0 bg-transparent px-1 text-sm text-foreground outline-none placeholder:text-muted-foreground"
36
+ data-slot="agent-composer-input"
37
+ dir="auto"
38
+ disabled={disabled}
39
+ onChange={(event: React.ChangeEvent<HTMLTextAreaElement>) => onChange(event.target.value)}
40
+ placeholder={placeholder}
41
+ rows={3}
42
+ value={value}
43
+ />
44
+ <div className="flex items-center justify-between gap-2">
45
+ <span aria-live="polite" className="font-mono text-xs text-muted-foreground" dir="ltr">
46
+ {value.length}
47
+ </span>
48
+ <Button disabled={disabled || !value.trim()} size="sm" type="submit" variant="primary">
49
+ {submitLabel}
50
+ </Button>
51
+ </div>
52
+ </form>
53
+ );
54
+ }
@@ -0,0 +1,50 @@
1
+ import type * as React from 'react';
2
+ import { AutoDirectionText, TechnicalValue } from '@noe/ui/bidi';
3
+ import { cn } from '@noe/ui/lib/cn';
4
+
5
+ const roleClassName = {
6
+ user: 'items-end',
7
+ assistant: 'items-start',
8
+ system: 'items-start',
9
+ } as const;
10
+
11
+ const bubbleClassName = {
12
+ user: 'bg-accent text-accent-foreground',
13
+ assistant: 'border border-border bg-surface-raised text-foreground',
14
+ system: 'border border-dashed border-border bg-surface-sunken/50 text-muted-foreground',
15
+ } as const;
16
+
17
+ export function AgentMessage({
18
+ role,
19
+ name,
20
+ content,
21
+ model,
22
+ className,
23
+ }: {
24
+ role: 'user' | 'assistant' | 'system';
25
+ name: React.ReactNode;
26
+ content: React.ReactNode;
27
+ model?: string;
28
+ className?: string;
29
+ }) {
30
+ return (
31
+ <article
32
+ className={cn('flex w-full flex-col gap-1.5', roleClassName[role], className)}
33
+ data-role={role}
34
+ data-slot="agent-message"
35
+ >
36
+ <header className="flex items-center gap-2 px-1 text-xs text-muted-foreground">
37
+ <strong className="font-medium text-foreground">{name}</strong>
38
+ {model ? <TechnicalValue>{model}</TechnicalValue> : null}
39
+ </header>
40
+ <AutoDirectionText
41
+ className={cn(
42
+ 'max-w-prose rounded-lg px-4 py-3 text-sm leading-normal',
43
+ bubbleClassName[role],
44
+ )}
45
+ >
46
+ {content}
47
+ </AutoDirectionText>
48
+ </article>
49
+ );
50
+ }
@@ -0,0 +1,69 @@
1
+ import { useId } from 'react';
2
+ import type * as React from 'react';
3
+ import { cn } from '@noe/ui/lib/cn';
4
+
5
+ export type PlanState = 'queued' | 'running' | 'completed' | 'failed';
6
+ export type PlanStep = { id: string; label: React.ReactNode; state: PlanState };
7
+
8
+ const dotClassName = {
9
+ queued: 'bg-muted-foreground/40',
10
+ running: 'animate-pulse bg-accent',
11
+ completed: 'bg-success',
12
+ failed: 'bg-destructive',
13
+ } as const;
14
+
15
+ const stepLabelClassName = {
16
+ queued: 'text-muted-foreground',
17
+ running: 'text-foreground',
18
+ completed: 'text-foreground',
19
+ failed: 'text-destructive',
20
+ } as const;
21
+
22
+ export function AgentPlan({
23
+ title,
24
+ steps,
25
+ stateLabels,
26
+ className,
27
+ }: {
28
+ title: React.ReactNode;
29
+ steps: PlanStep[];
30
+ stateLabels: Record<PlanState, React.ReactNode>;
31
+ className?: string;
32
+ }) {
33
+ const titleId = useId();
34
+ return (
35
+ <section
36
+ aria-labelledby={titleId}
37
+ className={cn('rounded-lg border border-border bg-surface-raised p-4', className)}
38
+ data-slot="agent-plan"
39
+ >
40
+ <h3
41
+ className="m-0 mb-3 font-heading text-sm font-semibold leading-snug text-foreground"
42
+ id={titleId}
43
+ >
44
+ {title}
45
+ </h3>
46
+ <ol className="m-0 flex list-none flex-col gap-3 p-0">
47
+ {steps.map((step) => (
48
+ <li
49
+ className="flex items-start gap-3"
50
+ data-slot="agent-plan-step"
51
+ data-state={step.state}
52
+ key={step.id}
53
+ >
54
+ <span
55
+ aria-hidden="true"
56
+ className={cn('mt-1.5 size-2 shrink-0 rounded-pill', dotClassName[step.state])}
57
+ />
58
+ <div className="flex min-w-0 flex-1 flex-col gap-0.5">
59
+ <span className={cn('text-sm leading-normal', stepLabelClassName[step.state])}>
60
+ {step.label}
61
+ </span>
62
+ <small className="text-xs text-muted-foreground">{stateLabels[step.state]}</small>
63
+ </div>
64
+ </li>
65
+ ))}
66
+ </ol>
67
+ </section>
68
+ );
69
+ }
@@ -0,0 +1,63 @@
1
+
2
+ import type * as React from 'react';
3
+ import { cn } from '@noe/ui/lib/cn';
4
+
5
+ export interface AgentWorkspaceProps extends React.ComponentProps<'div'> {
6
+ label: string;
7
+ navigation: React.ReactNode;
8
+ inspector?: React.ReactNode;
9
+ children: React.ReactNode;
10
+ /**
11
+ * Landmark ownership: application shell (AppFrame) owns the primary <main>.
12
+ * AgentWorkspace defaults to a non-main region for the conversation area to avoid nested <main> when placed inside AppFrame.
13
+ * Use `as="main"` when rendering as a standalone top-level page.
14
+ */
15
+ as?: 'div' | 'main';
16
+ }
17
+
18
+ export function AgentWorkspace({
19
+ label,
20
+ navigation,
21
+ inspector,
22
+ children,
23
+ className,
24
+ as: Tag = 'div',
25
+ ...props
26
+ }: AgentWorkspaceProps) {
27
+ const ContentTag = Tag === 'main' ? 'main' : 'div';
28
+ return (
29
+ <section
30
+ aria-label={label}
31
+ className={cn(
32
+ 'grid w-full grid-cols-[15rem_minmax(0,1fr)] overflow-hidden rounded-lg border border-border bg-surface lg:grid-cols-[15rem_minmax(0,1fr)_18rem]',
33
+ className,
34
+ )}
35
+ data-slot="agent-workspace"
36
+ {...props}
37
+ >
38
+ <aside
39
+ aria-label="Workspace navigation"
40
+ className="border-e border-border bg-surface-raised p-4"
41
+ data-slot="agent-workspace-navigation"
42
+ >
43
+ {navigation}
44
+ </aside>
45
+ <ContentTag
46
+ aria-label="Conversation and artifacts"
47
+ className="flex min-w-0 flex-col gap-4 p-5"
48
+ data-slot="agent-workspace-conversation"
49
+ >
50
+ {children}
51
+ </ContentTag>
52
+ {inspector ? (
53
+ <aside
54
+ aria-label="Run inspector"
55
+ className="hidden flex-col gap-4 border-s border-border bg-surface-raised p-5 lg:flex"
56
+ data-slot="agent-workspace-inspector"
57
+ >
58
+ {inspector}
59
+ </aside>
60
+ ) : null}
61
+ </section>
62
+ );
63
+ }
@@ -0,0 +1,93 @@
1
+ import { useId } from 'react';
2
+ import type * as React from 'react';
3
+ import { TechnicalValue } from '@noe/ui/bidi';
4
+ import { Button } from '@noe/ui/button';
5
+ import { cn } from '@noe/ui/lib/cn';
6
+
7
+ export type ApprovalParameter = {
8
+ /** Stable identity for rendering; must be unique within one request. */
9
+ id: string;
10
+ label: React.ReactNode;
11
+ value: string;
12
+ };
13
+
14
+ export function ApprovalRequest({
15
+ title,
16
+ consequence,
17
+ target,
18
+ targetLabel,
19
+ parameters,
20
+ labels,
21
+ onDecision,
22
+ className,
23
+ }: {
24
+ title: React.ReactNode;
25
+ consequence: React.ReactNode;
26
+ target: string;
27
+ targetLabel: React.ReactNode;
28
+ parameters: ApprovalParameter[];
29
+ labels: { once: React.ReactNode; session: React.ReactNode; deny: React.ReactNode };
30
+ onDecision(decision: 'once' | 'session' | 'deny'): void;
31
+ className?: string;
32
+ }) {
33
+ const titleId = useId();
34
+ const decideOnce = () => onDecision('once');
35
+ const decideSession = () => onDecision('session');
36
+ const decideDeny = () => onDecision('deny');
37
+
38
+ return (
39
+ <section
40
+ aria-labelledby={titleId}
41
+ className={cn(
42
+ 'flex flex-col gap-4 rounded-lg border border-warning/40 bg-warning/10 p-4',
43
+ className,
44
+ )}
45
+ data-slot="approval-request"
46
+ >
47
+ <header className="flex items-start gap-3">
48
+ <span
49
+ aria-hidden="true"
50
+ className="mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-pill border border-warning/50 bg-surface-raised text-sm font-semibold text-warning-foreground"
51
+ >
52
+ !
53
+ </span>
54
+ <div className="flex min-w-0 flex-col gap-1">
55
+ <h3
56
+ className="m-0 font-heading text-sm font-semibold leading-snug text-foreground"
57
+ id={titleId}
58
+ >
59
+ {title}
60
+ </h3>
61
+ <p className="m-0 text-sm leading-normal text-muted-foreground">{consequence}</p>
62
+ </div>
63
+ </header>
64
+ <dl className="m-0 grid grid-cols-1 gap-x-4 gap-y-2 rounded-md border border-border bg-surface-raised p-3 sm:grid-cols-2">
65
+ <div className="flex flex-col gap-0.5">
66
+ <dt className="text-xs text-muted-foreground">{targetLabel}</dt>
67
+ <dd className="m-0">
68
+ <TechnicalValue>{target}</TechnicalValue>
69
+ </dd>
70
+ </div>
71
+ {parameters.map((parameter) => (
72
+ <div className="flex flex-col gap-0.5" key={parameter.id}>
73
+ <dt className="text-xs text-muted-foreground">{parameter.label}</dt>
74
+ <dd className="m-0">
75
+ <TechnicalValue>{parameter.value}</TechnicalValue>
76
+ </dd>
77
+ </div>
78
+ ))}
79
+ </dl>
80
+ <footer className="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end">
81
+ <Button onClick={decideDeny} variant="quiet">
82
+ {labels.deny}
83
+ </Button>
84
+ <Button onClick={decideSession} variant="outline">
85
+ {labels.session}
86
+ </Button>
87
+ <Button onClick={decideOnce} variant="primary">
88
+ {labels.once}
89
+ </Button>
90
+ </footer>
91
+ </section>
92
+ );
93
+ }