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,833 @@
1
+ # NOE Design System Development-Ready Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Promote the delivered source into the project root and produce a dependency-backed, visually coherent, accessible, multilingual NOE design-system workspace that developers can install, run, test, and extend.
6
+
7
+ **Architecture:** A pnpm monorepo owns framework-agnostic `@noe/*` packages, a React/Vite showcase, and Storybook. Base UI 1.6.0 supplies interaction state machines compatible with current COSS guidance; COSS patterns are normalized behind NOE APIs and semantic tokens. Vitest browser projects, Storybook tests, Playwright, registry verification, and CI enforce the same contracts exercised by the showcase.
8
+
9
+ **Tech Stack:** Node.js >=24.19.0, pnpm 11.23.0, React 19.2.8, TypeScript 7.0.2, Biome 2.5.10, Vite 8.2.2, Tailwind CSS 4.3.3, Base UI 1.6.0, Storybook 10.5.10, Vitest 4.1.11, Playwright 1.62.1.
10
+
11
+ **Spec:** `docs/superpowers/specs/2026-08-25-noe-design-system-development-ready-design.md`
12
+
13
+ ## Global Constraints
14
+
15
+ - Preserve the original delivery without modifying its reports, screenshots, bundle, manifests, or checksums.
16
+ - Keep the project inside the existing parent Git repository; never create a nested `.git` directory.
17
+ - pnpm 11.23.0 is the only package manager and `pnpm-lock.yaml` is committed.
18
+ - Base UI is pinned to 1.6.0 because current official COSS guidance targets that version.
19
+ - Public packages expose only `@noe/*` APIs; applications do not import Base UI or copied COSS internals directly.
20
+ - English/LTR, Persian/RTL, pseudo-LTR, and pseudo-RTL remain first-class configurations.
21
+ - All reusable text is caller-supplied or resolved through `@noe/i18n`.
22
+ - Use logical CSS properties; physical direction requires a documented physical meaning.
23
+ - Never claim hosted CI, deployment, publication, or production validation from local evidence.
24
+ - Run both `pnpm check` in this project and the parent repository's `make check` before completion.
25
+
26
+ ---
27
+
28
+ ### Task 1: Promote the source and preserve original delivery artifacts
29
+
30
+ **Files:**
31
+ - Move: `noe-design-system/{.github,apps,evidence,packages,scripts,tests,types}` to project root
32
+ - Move: `noe-design-system/docs/{adr,design-system}` to `docs/`
33
+ - Move: root metadata files from `noe-design-system/` to project root
34
+ - Move: `NOE-Design-System-Delivery/`, `noe-design-system-evidence/`, and `noe-design-system.bundle` to `artifacts/original-delivery/`
35
+ - Preserve: `docs/superpowers/**`
36
+
37
+ **Interfaces:**
38
+ - Consumes: delivered source tree and existing design specification
39
+ - Produces: one canonical project root with immutable original artifacts under `artifacts/original-delivery/`
40
+
41
+ - [ ] **Step 1: Record the exact pre-move inventory and checksums**
42
+
43
+ Run:
44
+
45
+ ```bash
46
+ find noe-design-system -maxdepth 2 -type f -print | sort > /tmp/noe-source-before.txt
47
+ shasum -a 256 noe-design-system.bundle NOE-Design-System-Delivery/SHA256SUMS.txt > /tmp/noe-artifacts-before.sha256
48
+ ```
49
+
50
+ Expected: both commands exit 0 and record the source/bundle names without modifying them.
51
+
52
+ - [ ] **Step 2: Create the archive and promote non-conflicting directories explicitly**
53
+
54
+ Run from `design-system/`:
55
+
56
+ ```bash
57
+ mkdir -p artifacts/original-delivery
58
+ mv NOE-Design-System-Delivery artifacts/original-delivery/
59
+ mv noe-design-system-evidence artifacts/original-delivery/
60
+ mv noe-design-system.bundle artifacts/original-delivery/
61
+ mv noe-design-system/.github .
62
+ mv noe-design-system/apps .
63
+ mv noe-design-system/evidence .
64
+ mv noe-design-system/packages .
65
+ mv noe-design-system/scripts .
66
+ mv noe-design-system/tests .
67
+ mv noe-design-system/types .
68
+ mv noe-design-system/docs/adr docs/
69
+ mv noe-design-system/docs/design-system docs/
70
+ ```
71
+
72
+ Expected: `apps/`, `packages/`, `docs/design-system/`, and `artifacts/original-delivery/` exist at the project root.
73
+
74
+ - [ ] **Step 3: Promote root metadata explicitly**
75
+
76
+ Run:
77
+
78
+ ```bash
79
+ mv noe-design-system/.editorconfig .
80
+ mv noe-design-system/.gitignore .
81
+ mv noe-design-system/.mcp.json .
82
+ mv noe-design-system/AGENTS.md .
83
+ mv noe-design-system/CONTRIBUTING.md .
84
+ mv noe-design-system/README.md .
85
+ mv noe-design-system/SECURITY.md .
86
+ mv noe-design-system/components.json .
87
+ mv noe-design-system/llms.txt .
88
+ mv noe-design-system/package.json .
89
+ mv noe-design-system/registry.json .
90
+ mv noe-design-system/tsconfig.base.json .
91
+ mv noe-design-system/tsconfig.verify.json .
92
+ rmdir noe-design-system/docs
93
+ rmdir noe-design-system
94
+ ```
95
+
96
+ Expected: the nested source directory is empty before each `rmdir`; any unexpected file stops the operation instead of being deleted.
97
+
98
+ - [ ] **Step 4: Verify artifact identity and root inventory**
99
+
100
+ Run:
101
+
102
+ ```bash
103
+ shasum -a 256 artifacts/original-delivery/noe-design-system.bundle artifacts/original-delivery/NOE-Design-System-Delivery/SHA256SUMS.txt
104
+ test -f package.json
105
+ test -f artifacts/original-delivery/noe-design-system.bundle
106
+ test ! -e noe-design-system
107
+ ```
108
+
109
+ Expected: the hashes match `/tmp/noe-artifacts-before.sha256` and all assertions pass.
110
+
111
+ - [ ] **Step 5: Commit the root promotion**
112
+
113
+ ```bash
114
+ git add design-system
115
+ git commit -m "chore: promote NOE design system source"
116
+ ```
117
+
118
+ ---
119
+
120
+ ### Task 2: Establish the pinned pnpm workspace and executable build baseline
121
+
122
+ **Files:**
123
+ - Create: `.node-version`
124
+ - Create: `pnpm-workspace.yaml`
125
+ - Create: `tsconfig.json`
126
+ - Create: `biome.json`
127
+ - Create: `vitest.config.ts` with unit and browser projects
128
+ - Modify: `package.json`
129
+ - Modify: every `apps/*/package.json` and `packages/*/package.json`
130
+ - Create: `apps/showcase/{index.html,package.json,tsconfig.json,vite.config.ts,src/main.tsx,src/app.tsx,src/app.css}`
131
+ - Remove after migration: `apps/web/{index.html,app.js,styles.css,README.md}`
132
+
133
+ **Interfaces:**
134
+ - Consumes: promoted packages and canonical NOE version policy
135
+ - Produces: `pnpm install --frozen-lockfile`, strict workspace typecheck, package builds, and `pnpm dev`
136
+
137
+ - [ ] **Step 1: Write the workspace manifest test**
138
+
139
+ Create `tests/workspace.test.mjs`:
140
+
141
+ ```js
142
+ import { readFile } from 'node:fs/promises';
143
+ import test from 'node:test';
144
+ import assert from 'node:assert/strict';
145
+
146
+ test('root pins the supported package manager and development commands', async () => {
147
+ const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url)));
148
+ assert.equal(pkg.packageManager, 'pnpm@11.23.0');
149
+ for (const script of ['dev', 'storybook', 'format:check', 'lint', 'typecheck', 'test', 'build', 'build:storybook', 'verify', 'check']) {
150
+ assert.equal(typeof pkg.scripts[script], 'string', `missing ${script}`);
151
+ }
152
+ });
153
+ ```
154
+
155
+ - [ ] **Step 2: Run the test and verify failure**
156
+
157
+ Run: `node --test tests/workspace.test.mjs`
158
+
159
+ Expected: FAIL because `packageManager` and the development scripts are missing.
160
+
161
+ - [ ] **Step 3: Define the root toolchain**
162
+
163
+ Set root package metadata to:
164
+
165
+ ```json
166
+ {
167
+ "name": "noe-design-system",
168
+ "version": "0.1.0",
169
+ "private": true,
170
+ "type": "module",
171
+ "packageManager": "pnpm@11.23.0",
172
+ "engines": { "node": ">=24.19.0" },
173
+ "scripts": {
174
+ "dev": "pnpm --filter @noe/showcase dev",
175
+ "storybook": "pnpm --filter @noe/storybook storybook",
176
+ "format": "biome format --write .",
177
+ "format:check": "biome format .",
178
+ "lint": "biome lint .",
179
+ "typecheck": "tsc -b --pretty false",
180
+ "test": "node --test tests/*.test.mjs && vitest run --project unit",
181
+ "test:components": "vitest run --project browser",
182
+ "test:storybook": "vitest run --project storybook",
183
+ "test:e2e": "playwright test",
184
+ "build": "pnpm -r --if-present build",
185
+ "build:storybook": "pnpm --filter @noe/storybook build-storybook",
186
+ "verify": "node scripts/verify.mjs",
187
+ "check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm test:components && pnpm build && pnpm build:storybook && pnpm verify"
188
+ }
189
+ }
190
+ ```
191
+
192
+ Add these exact root development dependencies and resolve them into the lockfile:
193
+
194
+ ```text
195
+ react 19.2.8
196
+ react-dom 19.2.8
197
+ typescript 7.0.2
198
+ vite 8.2.2
199
+ @vitejs/plugin-react 6.1.0
200
+ tailwindcss 4.3.3
201
+ @tailwindcss/vite 4.3.3
202
+ storybook 10.5.10
203
+ @storybook/react-vite 10.5.10
204
+ @storybook/addon-a11y 10.5.10
205
+ @storybook/addon-docs 10.5.10
206
+ @storybook/addon-vitest 10.5.10
207
+ vitest 4.1.11
208
+ @vitest/browser-playwright 4.1.11
209
+ vitest-browser-react 2.2.0
210
+ @playwright/test 1.62.1
211
+ @testing-library/react 16.3.2
212
+ @testing-library/user-event 14.6.6
213
+ jsdom 30.0.1
214
+ @biomejs/biome 2.5.10
215
+ ```
216
+
217
+ Use `@base-ui/react 1.6.0`, `class-variance-authority 0.7.1`, `clsx 2.1.1`, `tailwind-merge 3.6.0`, and `lucide-react 1.34.0` only in the workspace packages that import them.
218
+
219
+ - [ ] **Step 4: Define workspace boundaries and package dependencies**
220
+
221
+ Create `pnpm-workspace.yaml`:
222
+
223
+ ```yaml
224
+ packages:
225
+ - apps/*
226
+ - packages/*
227
+ ```
228
+
229
+ Each product-pattern package declares `@noe/ui: workspace:*`; apps declare the public `@noe/*` packages they consume. Only `@noe/ui` declares `@base-ui/react: 1.6.0`.
230
+
231
+ - [ ] **Step 5: Create the minimal React showcase shell**
232
+
233
+ Create `apps/showcase/src/app.tsx`:
234
+
235
+ ```tsx
236
+ import { Button } from '@noe/ui';
237
+
238
+ export function App() {
239
+ return (
240
+ <main className="min-h-dvh bg-background text-foreground">
241
+ <section className="mx-auto flex min-h-dvh max-w-7xl items-center px-6 py-16">
242
+ <div className="space-y-6">
243
+ <p className="text-sm font-medium text-muted-foreground">NOE Design System</p>
244
+ <h1 className="max-w-3xl text-4xl font-semibold tracking-tight">Calm, precise product interfaces.</h1>
245
+ <Button>Explore the system</Button>
246
+ </div>
247
+ </section>
248
+ </main>
249
+ );
250
+ }
251
+ ```
252
+
253
+ - [ ] **Step 6: Install and lock dependencies**
254
+
255
+ Run:
256
+
257
+ ```bash
258
+ corepack pnpm install
259
+ corepack pnpm exec playwright install chromium firefox webkit
260
+ ```
261
+
262
+ Expected: `pnpm-lock.yaml` is created and all workspace packages resolve with no missing peer dependency errors.
263
+
264
+ - [ ] **Step 7: Run the workspace test and baseline build**
265
+
266
+ Run:
267
+
268
+ ```bash
269
+ node --test tests/workspace.test.mjs
270
+ corepack pnpm typecheck
271
+ corepack pnpm --filter @noe/showcase build
272
+ ```
273
+
274
+ Expected: all commands PASS.
275
+
276
+ - [ ] **Step 8: Commit the workspace baseline**
277
+
278
+ ```bash
279
+ git add design-system
280
+ git commit -m "build: establish NOE development workspace"
281
+ ```
282
+
283
+ ---
284
+
285
+ ### Task 3: Normalize semantic tokens and Tailwind v4 styling
286
+
287
+ **Files:**
288
+ - Modify: `packages/design-tokens/src/tokens.json`
289
+ - Modify: `packages/design-tokens/src/tokens.css`
290
+ - Create: `packages/design-tokens/src/theme.css`
291
+ - Create: `packages/design-tokens/src/base.css`
292
+ - Create: `packages/design-tokens/src/index.test.ts`
293
+ - Modify: `packages/design-tokens/package.json`
294
+ - Modify: `apps/showcase/src/app.css`
295
+
296
+ **Interfaces:**
297
+ - Consumes: existing semantic token names and NOE brand decisions
298
+ - Produces: CSS variables, Tailwind v4 theme utilities, and typed token exports with one semantic source
299
+
300
+ - [ ] **Step 1: Write failing token parity tests**
301
+
302
+ Create `packages/design-tokens/src/index.test.ts`:
303
+
304
+ ```ts
305
+ import { describe, expect, it } from 'vitest';
306
+ import { tokens } from './index';
307
+
308
+ describe('NOE semantic tokens', () => {
309
+ it('defines independent light and dark semantic surfaces', () => {
310
+ expect(tokens.color.light.background).not.toBe(tokens.color.dark.background);
311
+ expect(tokens.color.light.foreground).not.toBe(tokens.color.dark.foreground);
312
+ });
313
+
314
+ it('defines focus, motion, control, and icon contracts', () => {
315
+ expect(tokens.color.light.focusRing).toBeTruthy();
316
+ expect(tokens.motion.duration.fast).toBeTruthy();
317
+ expect(tokens.control.height.md).toBeTruthy();
318
+ expect(tokens.icon.size.md).toBeTruthy();
319
+ });
320
+ });
321
+ ```
322
+
323
+ - [ ] **Step 2: Run tests and verify the missing typed shape fails**
324
+
325
+ Run: `corepack pnpm vitest run packages/design-tokens/src/index.test.ts`
326
+
327
+ Expected: FAIL on one or more missing nested token contracts.
328
+
329
+ - [ ] **Step 3: Implement one semantic token source and Tailwind mapping**
330
+
331
+ `theme.css` imports Tailwind theme variables without duplicating semantic values:
332
+
333
+ ```css
334
+ @theme inline {
335
+ --color-background: var(--noe-color-background);
336
+ --color-foreground: var(--noe-color-foreground);
337
+ --color-surface: var(--noe-color-surface);
338
+ --color-surface-raised: var(--noe-color-surface-raised);
339
+ --color-muted: var(--noe-color-muted);
340
+ --color-muted-foreground: var(--noe-color-muted-foreground);
341
+ --color-border: var(--noe-color-border);
342
+ --color-accent: var(--noe-color-accent);
343
+ --color-accent-foreground: var(--noe-color-accent-foreground);
344
+ --radius-sm: var(--noe-radius-sm);
345
+ --radius-md: var(--noe-radius-md);
346
+ --radius-lg: var(--noe-radius-lg);
347
+ }
348
+ ```
349
+
350
+ The showcase stylesheet uses official Tailwind v4 monorepo source registration:
351
+
352
+ ```css
353
+ @import "tailwindcss";
354
+ @import "@noe/design-tokens/theme.css";
355
+ @import "@noe/design-tokens/base.css";
356
+ @source "../../../packages/ui/src";
357
+ @source "../../../packages/ai-ui/src";
358
+ @source "../../../packages/data-ui/src";
359
+ @source "../../../packages/workflow-ui/src";
360
+ ```
361
+
362
+ - [ ] **Step 4: Run token, type, and showcase build checks**
363
+
364
+ Run:
365
+
366
+ ```bash
367
+ corepack pnpm vitest run packages/design-tokens/src/index.test.ts
368
+ corepack pnpm typecheck
369
+ corepack pnpm --filter @noe/showcase build
370
+ ```
371
+
372
+ Expected: PASS with no unknown Tailwind utilities.
373
+
374
+ - [ ] **Step 5: Commit semantic styling**
375
+
376
+ ```bash
377
+ git add design-system/packages/design-tokens design-system/apps/showcase
378
+ git commit -m "feat(tokens): normalize NOE semantic theme"
379
+ ```
380
+
381
+ ---
382
+
383
+ ### Task 4: Rebuild core UI on Base UI/COSS-compatible contracts
384
+
385
+ **Files:**
386
+ - Create: `packages/ui/src/lib/cn.ts`
387
+ - Modify: `packages/ui/src/button.tsx`
388
+ - Modify: `packages/ui/src/field.tsx`
389
+ - Replace: `packages/ui/src/dialog.tsx`
390
+ - Replace: `packages/ui/src/drawer.tsx`
391
+ - Replace: `packages/ui/src/tabs.tsx`
392
+ - Create: `packages/ui/src/{input,textarea,badge,alert,card,tooltip,menu,spinner,skeleton,empty-state,error-state}.tsx`
393
+ - Modify: `packages/ui/src/index.ts`
394
+ - Create: `packages/ui/src/button.browser.test.tsx`
395
+ - Create: `packages/ui/src/dialog.browser.test.tsx`
396
+ - Create: `packages/ui/src/tabs.browser.test.tsx`
397
+
398
+ **Interfaces:**
399
+ - Consumes: `@base-ui/react@1.6.0`, semantic tokens, `DirectionProvider`, `cn(...inputs)`
400
+ - Produces: ref-forwarding public NOE primitives with `data-slot` hooks and no raw Base UI leakage
401
+
402
+ - [ ] **Step 1: Write the failing Button browser test**
403
+
404
+ ```tsx
405
+ import { expect, test, vi } from 'vitest';
406
+ import { render } from 'vitest-browser-react';
407
+ import { Button } from './button';
408
+
409
+ test('Button preserves accessible busy and disabled state', async () => {
410
+ const onClick = vi.fn();
411
+ const screen = await render(<Button loading onClick={onClick}>Save</Button>);
412
+ const button = screen.getByRole('button', { name: 'Save' });
413
+ await expect.element(button).toHaveAttribute('aria-busy', 'true');
414
+ await expect.element(button).toBeDisabled();
415
+ });
416
+ ```
417
+
418
+ - [ ] **Step 2: Run the Button test and verify failure**
419
+
420
+ Run: `corepack pnpm vitest run --project browser packages/ui/src/button.browser.test.tsx`
421
+
422
+ Expected: FAIL until the browser project and ref-forwarding Button contract are implemented.
423
+
424
+ - [ ] **Step 3: Implement the public Button contract**
425
+
426
+ ```tsx
427
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
428
+ variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive';
429
+ size?: 'sm' | 'md' | 'lg' | 'icon';
430
+ loading?: boolean;
431
+ }
432
+
433
+ export const buttonVariants = cva(
434
+ 'inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring disabled:pointer-events-none disabled:opacity-50',
435
+ {
436
+ variants: {
437
+ variant: {
438
+ primary: 'bg-accent text-accent-foreground hover:bg-accent/90',
439
+ secondary: 'bg-surface-raised text-foreground hover:bg-muted',
440
+ outline: 'border border-border bg-transparent hover:bg-muted',
441
+ ghost: 'bg-transparent hover:bg-muted',
442
+ destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
443
+ },
444
+ size: {
445
+ sm: 'h-8 px-3 text-sm',
446
+ md: 'h-9 px-4 text-sm',
447
+ lg: 'h-10 px-5 text-base',
448
+ icon: 'size-9',
449
+ },
450
+ },
451
+ defaultVariants: { variant: 'secondary', size: 'md' },
452
+ },
453
+ );
454
+
455
+ export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(
456
+ { className, children, disabled, loading = false, type = 'button', variant, size, ...props },
457
+ ref,
458
+ ) {
459
+ return (
460
+ <button {...props} ref={ref} type={type} data-slot="button" disabled={disabled || loading} aria-busy={loading || undefined} className={cn(buttonVariants({ variant, size }), className)}>
461
+ {loading ? <Spinner aria-hidden="true" /> : null}
462
+ <span>{children}</span>
463
+ </button>
464
+ );
465
+ });
466
+ ```
467
+
468
+ - [ ] **Step 4: Write Dialog focus, dismiss, and RTL portal tests**
469
+
470
+ Test the compound API:
471
+
472
+ ```tsx
473
+ <DirectionProvider direction="rtl">
474
+ <Dialog defaultOpen>
475
+ <DialogContent aria-label="تنظیمات">
476
+ <DialogTitle>تنظیمات</DialogTitle>
477
+ <DialogClose>بستن</DialogClose>
478
+ </DialogContent>
479
+ </Dialog>
480
+ </DirectionProvider>
481
+ ```
482
+
483
+ Assertions: the dialog has `dir="rtl"`, receives initial focus, Escape closes it, and focus returns to the trigger in the controlled-trigger story.
484
+
485
+ - [ ] **Step 5: Implement Dialog, Drawer, Tabs, Tooltip, and Menu with Base UI composition**
486
+
487
+ Use Base UI 1.6 namespace imports, `render` composition rather than Radix `asChild`, and explicit portal containers/direction. Export only NOE names such as `Dialog`, `DialogTrigger`, `DialogContent`, `DialogTitle`, and `DialogClose`.
488
+
489
+ - [ ] **Step 6: Implement form and feedback primitives**
490
+
491
+ Field exposes `Field`, `FieldLabel`, `FieldDescription`, and `FieldError`; generated IDs connect labels, descriptions, and errors. Input and Textarea forward refs and use `aria-invalid`. Alert, Badge, Spinner, Skeleton, EmptyState, and ErrorState use semantic variants without hardcoded user text.
492
+
493
+ - [ ] **Step 7: Run browser, a11y-sensitive, type, and build checks**
494
+
495
+ Run:
496
+
497
+ ```bash
498
+ corepack pnpm test:components
499
+ corepack pnpm lint
500
+ corepack pnpm typecheck
501
+ corepack pnpm --filter @noe/showcase build
502
+ ```
503
+
504
+ Expected: PASS; no package outside `@noe/ui` imports `@base-ui/react`.
505
+
506
+ - [ ] **Step 8: Commit the core UI rebuild**
507
+
508
+ ```bash
509
+ git add design-system/packages/ui design-system/apps/showcase
510
+ git commit -m "feat(ui): rebuild accessible NOE primitives"
511
+ ```
512
+
513
+ ---
514
+
515
+ ### Task 5: Strengthen i18n, bidi, and product-pattern packages
516
+
517
+ **Files:**
518
+ - Modify: `packages/i18n/src/index.ts`
519
+ - Modify: `packages/i18n/src/runtime.mjs`
520
+ - Modify: `packages/ui/src/{bidi,code,direction}.tsx`
521
+ - Refactor: `packages/{ai-ui,data-ui,workflow-ui}/src/*.tsx`
522
+ - Create: colocated unit and browser tests for each public pattern
523
+ - Modify: package public `index.ts` files and manifests
524
+
525
+ **Interfaces:**
526
+ - Consumes: public `@noe/ui`, centralized locale metadata, `Intl`, semantic tokens
527
+ - Produces: typed locale/direction APIs and production-quality agent, data, and workflow patterns
528
+
529
+ - [ ] **Step 1: Write locale and bidi contract tests**
530
+
531
+ ```ts
532
+ import { describe, expect, it } from 'vitest';
533
+ import { getLocaleMetadata, resolveDirection } from './index';
534
+
535
+ describe('locale direction', () => {
536
+ it.each([
537
+ ['en', 'ltr'],
538
+ ['fa', 'rtl'],
539
+ ['en-XA', 'ltr'],
540
+ ['ar-XB', 'rtl'],
541
+ ] as const)('%s resolves to %s', (locale, direction) => {
542
+ expect(resolveDirection(locale)).toBe(direction);
543
+ expect(getLocaleMetadata(locale).direction).toBe(direction);
544
+ });
545
+ });
546
+ ```
547
+
548
+ Browser tests verify technical identifiers remain `dir="ltr"` inside a Persian/RTL provider and free-form agent messages use `dir="auto"`.
549
+
550
+ - [ ] **Step 2: Run the focused tests and capture current failures**
551
+
552
+ Run: `corepack pnpm vitest run packages/i18n packages/ui/src/bidi.browser.test.tsx`
553
+
554
+ Expected: tests reveal any missing typed exports or browser coverage.
555
+
556
+ - [ ] **Step 3: Implement stable locale and direction interfaces**
557
+
558
+ Export:
559
+
560
+ ```ts
561
+ export type Locale = 'en' | 'fa' | 'en-XA' | 'ar-XB';
562
+ export type Direction = 'ltr' | 'rtl';
563
+ export interface LocaleMetadata {
564
+ locale: Locale;
565
+ language: string;
566
+ script: string;
567
+ direction: Direction;
568
+ numberingSystem: string;
569
+ calendar: string;
570
+ }
571
+ export function getLocaleMetadata(locale: Locale): LocaleMetadata;
572
+ export function resolveDirection(locale: Locale): Direction;
573
+ ```
574
+
575
+ - [ ] **Step 4: Refactor product patterns into readable public components**
576
+
577
+ Replace single-line JSX implementations with named props interfaces, focused subcomponents, `data-slot` hooks, public imports, localized labels, and documented state unions. Preserve these minimum state types:
578
+
579
+ ```ts
580
+ export type ToolCallStatus = 'pending' | 'approval-required' | 'running' | 'success' | 'failure' | 'denied';
581
+ export type RunStatus = 'queued' | 'planning' | 'running' | 'waiting' | 'approval' | 'paused' | 'completed' | 'failed' | 'cancelled';
582
+ ```
583
+
584
+ DataTable keeps a semantic HTML table, keyboard-accessible overflow container, technical-cell isolation, caption, empty state, and row keys. WorkflowCanvas treats graph coordinates as physical while its chrome and node content remain direction-aware.
585
+
586
+ - [ ] **Step 5: Run all package tests and boundary checks**
587
+
588
+ Run:
589
+
590
+ ```bash
591
+ corepack pnpm test
592
+ corepack pnpm test:components
593
+ corepack pnpm lint
594
+ corepack pnpm typecheck
595
+ node scripts/verify.mjs
596
+ ```
597
+
598
+ Expected: PASS with no hardcoded reusable labels reported by verification.
599
+
600
+ - [ ] **Step 6: Commit i18n and product patterns**
601
+
602
+ ```bash
603
+ git add design-system/packages
604
+ git commit -m "feat(patterns): harden bidirectional product UI"
605
+ ```
606
+
607
+ ---
608
+
609
+ ### Task 6: Build the representative React showcase
610
+
611
+ **Files:**
612
+ - Create: `apps/showcase/src/providers/app-provider.tsx`
613
+ - Create: `apps/showcase/src/components/showcase-controls.tsx`
614
+ - Create: `apps/showcase/src/surfaces/{consumer,dashboard,agent-workspace,workflow}.tsx`
615
+ - Modify: `apps/showcase/src/app.tsx`
616
+ - Modify: `apps/showcase/src/app.css`
617
+ - Create: `apps/showcase/src/app.browser.test.tsx`
618
+
619
+ **Interfaces:**
620
+ - Consumes: only public `@noe/*` exports
621
+ - Produces: four responsive surfaces with locale, direction, and theme switching
622
+
623
+ - [ ] **Step 1: Write the failing showcase matrix test**
624
+
625
+ ```tsx
626
+ test.each([
627
+ ['en', 'ltr', 'light'],
628
+ ['fa', 'rtl', 'dark'],
629
+ ['en-XA', 'ltr', 'light'],
630
+ ['ar-XB', 'rtl', 'dark'],
631
+ ] as const)('renders %s/%s/%s without document mismatch', async (locale, direction, theme) => {
632
+ const screen = await render(<App initialLocale={locale} initialTheme={theme} />);
633
+ await expect.element(screen.getByRole('main')).toHaveAttribute('dir', direction);
634
+ expect(document.documentElement.lang).toBe(locale);
635
+ });
636
+ ```
637
+
638
+ - [ ] **Step 2: Implement provider and QA controls**
639
+
640
+ `AppProvider` owns `locale`, resolved/overridden direction, and `light | dark | system` theme. It updates `<html lang dir data-theme>` in a layout effect before interactive children render. Controls remain reachable at 390px and expose accessible labels.
641
+
642
+ Use these public showcase types:
643
+
644
+ ```ts
645
+ export type Theme = 'light' | 'dark' | 'system';
646
+
647
+ export interface AppProps {
648
+ initialLocale?: Locale;
649
+ initialTheme?: Theme;
650
+ }
651
+
652
+ export interface AppProviderProps extends AppProps {
653
+ children: React.ReactNode;
654
+ }
655
+ ```
656
+
657
+ - [ ] **Step 3: Implement four representative surfaces**
658
+
659
+ Consumer uses AgentComposer and artifact/result presentation. Dashboard uses MetricCard and DataTable. Agent workspace uses AgentMessage, AgentPlan, ToolCall, ApprovalRequest, and RunInspector. Workflow uses WorkflowCanvas and WorkflowNode. All displayed text comes from the showcase message catalog.
660
+
661
+ - [ ] **Step 4: Run component tests and responsive production build**
662
+
663
+ Run:
664
+
665
+ ```bash
666
+ corepack pnpm vitest run --project browser apps/showcase
667
+ corepack pnpm --filter @noe/showcase build
668
+ ```
669
+
670
+ Expected: PASS with no document direction mismatch or build warnings.
671
+
672
+ - [ ] **Step 5: Commit the showcase**
673
+
674
+ ```bash
675
+ git add design-system/apps/showcase
676
+ git commit -m "feat(showcase): add NOE product surfaces"
677
+ ```
678
+
679
+ ---
680
+
681
+ ### Task 7: Make Storybook executable and testable
682
+
683
+ **Files:**
684
+ - Modify: `apps/storybook/.storybook/main.ts`
685
+ - Modify: `apps/storybook/.storybook/preview.tsx`
686
+ - Create: `apps/storybook/.storybook/vitest.setup.ts`
687
+ - Modify: `vitest.config.ts` to add the Storybook project
688
+ - Rewrite: `apps/storybook/stories/*.stories.tsx`
689
+ - Add: stories for every milestone component and product pattern
690
+
691
+ **Interfaces:**
692
+ - Consumes: package public exports and shared providers
693
+ - Produces: Storybook 10.5.10 build with locale/direction/theme controls, interaction tests, and enforced a11y checks
694
+
695
+ - [ ] **Step 1: Configure Storybook and Vitest browser projects**
696
+
697
+ Use Storybook's official `storybookTest` plugin and `@vitest/browser-playwright`. Define three projects: `unit` in Node, `browser` in Chromium, and `storybook` in Chromium with `vitest.setup.ts` registering project and a11y annotations.
698
+
699
+ - [ ] **Step 2: Migrate stories to public imports and CSF**
700
+
701
+ Each story imports from `@noe/ui`, `@noe/ai-ui`, `@noe/data-ui`, or `@noe/workflow-ui`. Button includes default, primary, loading, disabled, long Persian text, and keyboard interaction stories. Dialog and Tabs include play functions that operate their controls and assert focus/selection.
702
+
703
+ - [ ] **Step 3: Enforce Storybook accessibility behavior**
704
+
705
+ `preview.tsx` sets:
706
+
707
+ ```ts
708
+ parameters: {
709
+ a11y: { test: 'error' },
710
+ controls: { expanded: true },
711
+ layout: 'fullscreen',
712
+ }
713
+ ```
714
+
715
+ The decorator uses `DirectionProvider` and semantic classes rather than inline visual values.
716
+
717
+ - [ ] **Step 4: Run Storybook tests and production build**
718
+
719
+ Run:
720
+
721
+ ```bash
722
+ corepack pnpm test:storybook
723
+ corepack pnpm build:storybook
724
+ ```
725
+
726
+ Expected: Storybook tests PASS and static output is created with no missing module or accessibility failures.
727
+
728
+ - [ ] **Step 5: Commit Storybook**
729
+
730
+ ```bash
731
+ git add design-system/apps/storybook design-system/vitest.config.ts
732
+ git commit -m "test(storybook): add executable component documentation"
733
+ ```
734
+
735
+ ---
736
+
737
+ ### Task 8: Add Playwright visual QA, CI, documentation, and final evidence
738
+
739
+ **Files:**
740
+ - Create: `playwright.config.ts`
741
+ - Create: `tests/e2e/showcase.spec.ts`
742
+ - Create: `tests/e2e/visual.spec.ts`
743
+ - Modify: `.github/workflows/ci.yml`
744
+ - Modify: `.github/workflows/security.yml`
745
+ - Modify: `README.md`, `CONTRIBUTING.md`, `AGENTS.md`, `llms.txt`
746
+ - Modify: `docs/design-system/{architecture,components,testing,visual-qa,ci-cd}.md`
747
+ - Update: `registry.json` and `packages/registry/**`
748
+ - Create: `evidence/development-ready-verification.md`
749
+
750
+ **Interfaces:**
751
+ - Consumes: built showcase, Storybook, registry, and all local checks
752
+ - Produces: reproducible local/CI quality gates and an evidence-based development handoff
753
+
754
+ - [ ] **Step 1: Write critical Playwright flow tests**
755
+
756
+ ```ts
757
+ import { expect, test } from '@playwright/test';
758
+
759
+ test('Persian dark agent workspace is usable at mobile width', async ({ page }) => {
760
+ await page.setViewportSize({ width: 390, height: 844 });
761
+ await page.goto('/?surface=agent&locale=fa&theme=dark');
762
+ await expect(page.locator('html')).toHaveAttribute('lang', 'fa');
763
+ await expect(page.locator('html')).toHaveAttribute('dir', 'rtl');
764
+ await expect(page.getByRole('main')).toBeVisible();
765
+ const overflow = await page.evaluate(() => document.documentElement.scrollWidth > document.documentElement.clientWidth);
766
+ expect(overflow).toBe(false);
767
+ });
768
+ ```
769
+
770
+ Add route-matrix tests for all four surfaces and deterministic screenshots for critical English/light and Persian/dark layouts at 390, 768, 1024, 1280, and 1440 widths.
771
+
772
+ - [ ] **Step 2: Configure browser projects and web server**
773
+
774
+ `playwright.config.ts` starts `pnpm --filter @noe/showcase dev --host 127.0.0.1`, reuses it outside CI, captures trace/screenshot/video only on failure, and defines Chromium, Firefox, and WebKit projects. Critical visual baselines use Chromium to remain deterministic.
775
+
776
+ - [ ] **Step 3: Update secure CI jobs**
777
+
778
+ CI uses `corepack pnpm install --frozen-lockfile`, minimal `contents: read` permissions, PR/push/merge-group triggers, stable job names, concurrency cancellation, Playwright browser caching or installation, and uploads Storybook/Playwright artifacts on failure. Security workflow remains non-privileged and does not execute untrusted PR code with secrets.
779
+
780
+ - [ ] **Step 4: Update registry and developer documentation**
781
+
782
+ Registry items import public package APIs and accurately describe dependencies, RTL behavior, accessibility, and install usage. README quick start is:
783
+
784
+ ```bash
785
+ corepack enable
786
+ corepack pnpm install --frozen-lockfile
787
+ corepack pnpm dev
788
+ corepack pnpm storybook
789
+ corepack pnpm check
790
+ ```
791
+
792
+ Documentation distinguishes implemented local evidence from hosted/production gaps.
793
+
794
+ - [ ] **Step 5: Run the full local verification matrix**
795
+
796
+ Run:
797
+
798
+ ```bash
799
+ corepack pnpm check
800
+ corepack pnpm test:storybook
801
+ corepack pnpm test:e2e
802
+ make check
803
+ git diff --check
804
+ git status --short
805
+ ```
806
+
807
+ Expected: all executable local checks PASS. If parent `make check` fails because of unrelated repository state, record the exact command and failure without weakening any project check.
808
+
809
+ - [ ] **Step 6: Perform manual browser QA**
810
+
811
+ Inspect consumer, dashboard, agent, and workflow surfaces at 390, 768, 1024, 1280, and 1440 pixels in English/light, English/dark, Persian/light, Persian/dark, pseudo-LTR, and pseudo-RTL. Record and fix overflow, clipping, bidi, focus, portal, contrast, generic-library styling, excessive cards, and motion issues.
812
+
813
+ - [ ] **Step 7: Record actual evidence**
814
+
815
+ Create `evidence/development-ready-verification.md` with exact commands, exit results, artifact paths, known gaps, and final maturity level. Never copy expected results into evidence without execution.
816
+
817
+ - [ ] **Step 8: Commit the verified development baseline**
818
+
819
+ ```bash
820
+ git add design-system
821
+ git commit -m "chore: verify NOE development baseline"
822
+ ```
823
+
824
+ ---
825
+
826
+ ## Final Review Gate
827
+
828
+ - [ ] Confirm every spec section maps to Tasks 1–8.
829
+ - [ ] Search source and plan for placeholder markers, broad dependency ranges, hardcoded reusable labels, and undocumented physical direction.
830
+ - [ ] Review the final diff for accidental edits outside `design-system/`.
831
+ - [ ] Confirm original artifact checksums still match.
832
+ - [ ] Confirm all claimed commands have saved observable output.
833
+ - [ ] Use `superpowers:verification-before-completion` before reporting completion.