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.
- package/.editorconfig +12 -0
- package/.github/CODEOWNERS +10 -0
- package/.github/dependabot.yml +12 -0
- package/.github/pull_request_template.md +17 -0
- package/.github/workflows/ci.yml +173 -0
- package/.github/workflows/security.yml +40 -0
- package/.mcp.json +8 -0
- package/.node-version +1 -0
- package/AGENTS.md +62 -0
- package/CONTRIBUTING.md +9 -0
- package/README.md +48 -0
- package/SECURITY.md +7 -0
- package/apps/showcase/index.html +28 -0
- package/apps/showcase/package.json +30 -0
- package/apps/showcase/src/app.css +8 -0
- package/apps/showcase/src/app.tsx +10 -0
- package/apps/showcase/src/catalog/agent-composer-preview.tsx +17 -0
- package/apps/showcase/src/catalog/catalog-index.tsx +2676 -0
- package/apps/showcase/src/catalog/catalog-shell.browser.test.tsx +73 -0
- package/apps/showcase/src/catalog/catalog-shell.tsx +506 -0
- package/apps/showcase/src/main.tsx +17 -0
- package/apps/showcase/tsconfig.json +11 -0
- package/apps/showcase/vite.config.ts +15 -0
- package/apps/storybook/.storybook/main.ts +21 -0
- package/apps/storybook/.storybook/preview.tsx +87 -0
- package/apps/storybook/.storybook/vitest.setup.ts +26 -0
- package/apps/storybook/README.md +5 -0
- package/apps/storybook/package.json +31 -0
- package/apps/storybook/stories/AgentStates.stories.tsx +72 -0
- package/apps/storybook/stories/Bidi.stories.tsx +31 -0
- package/apps/storybook/stories/Button.stories.tsx +19 -0
- package/apps/storybook/stories/Surfaces.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/about-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/activity-feed.stories.tsx +50 -0
- package/apps/storybook/stories/catalog/activity-gauge.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/agent-composer.stories.tsx +49 -0
- package/apps/storybook/stories/catalog/agent-message.stories.tsx +37 -0
- package/apps/storybook/stories/catalog/agent-plan.stories.tsx +35 -0
- package/apps/storybook/stories/catalog/agent-workspace.stories.tsx +60 -0
- package/apps/storybook/stories/catalog/alert.stories.tsx +41 -0
- package/apps/storybook/stories/catalog/app-frame.stories.tsx +47 -0
- package/apps/storybook/stories/catalog/approval-request.stories.tsx +30 -0
- package/apps/storybook/stories/catalog/avatar.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/badge-group.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/badge.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/banner.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/bidi-text.stories.tsx +47 -0
- package/apps/storybook/stories/catalog/blog-index-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/blog-post-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/blog-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/bottom-navigation.stories.tsx +27 -0
- package/apps/storybook/stories/catalog/button-group.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/button.stories.tsx +27 -0
- package/apps/storybook/stories/catalog/calendar.stories.tsx +47 -0
- package/apps/storybook/stories/catalog/card.stories.tsx +40 -0
- package/apps/storybook/stories/catalog/careers-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/carousel.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/chart-frame.stories.tsx +34 -0
- package/apps/storybook/stories/catalog/chart.stories.tsx +43 -0
- package/apps/storybook/stories/catalog/checkbox.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/code-and-terminal.stories.tsx +39 -0
- package/apps/storybook/stories/catalog/color-picker.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/command-menu.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/contact-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/contact-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/content-divider.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/content-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/context-menu.stories.tsx +66 -0
- package/apps/storybook/stories/catalog/credit-card.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/cta-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/dashboard-01.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/dashboard-02.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/dashboard-shell.stories.tsx +65 -0
- package/apps/storybook/stories/catalog/data-list.stories.tsx +37 -0
- package/apps/storybook/stories/catalog/data-table.stories.tsx +51 -0
- package/apps/storybook/stories/catalog/date-picker.stories.tsx +31 -0
- package/apps/storybook/stories/catalog/dialog.stories.tsx +68 -0
- package/apps/storybook/stories/catalog/direction-provider.stories.tsx +36 -0
- package/apps/storybook/stories/catalog/drawer.stories.tsx +58 -0
- package/apps/storybook/stories/catalog/dropdown.stories.tsx +67 -0
- package/apps/storybook/stories/catalog/email-template.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/empty-state.stories.tsx +19 -0
- package/apps/storybook/stories/catalog/error-state.stories.tsx +19 -0
- package/apps/storybook/stories/catalog/fab.stories.tsx +22 -0
- package/apps/storybook/stories/catalog/faq-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/faq-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/feature-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/featured-icon.stories.tsx +45 -0
- package/apps/storybook/stories/catalog/field.stories.tsx +35 -0
- package/apps/storybook/stories/catalog/file-uploader.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/filter-bar.stories.tsx +33 -0
- package/apps/storybook/stories/catalog/footer.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/forgot-password-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/gradient-picker.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/header-navigation.stories.tsx +46 -0
- package/apps/storybook/stories/catalog/hero-header.stories.tsx +36 -0
- package/apps/storybook/stories/catalog/icon-system.stories.tsx +48 -0
- package/apps/storybook/stories/catalog/illustration.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/image-picker.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/informational-page-01.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/informational-page-02.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/inline-cta.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/input.stories.tsx +21 -0
- package/apps/storybook/stories/catalog/landing-page.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/legal-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/login-page.stories.tsx +42 -0
- package/apps/storybook/stories/catalog/marketing-404-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/marketing-header.stories.tsx +35 -0
- package/apps/storybook/stories/catalog/menu.stories.tsx +46 -0
- package/apps/storybook/stories/catalog/messaging.stories.tsx +33 -0
- package/apps/storybook/stories/catalog/metric-card.stories.tsx +20 -0
- package/apps/storybook/stories/catalog/metrics-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/mobile-screen.stories.tsx +56 -0
- package/apps/storybook/stories/catalog/multi-select.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/newsletter.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/not-found.stories.tsx +30 -0
- package/apps/storybook/stories/catalog/notification.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/page-header.stories.tsx +37 -0
- package/apps/storybook/stories/catalog/pagination.stories.tsx +27 -0
- package/apps/storybook/stories/catalog/pie-chart.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/pricing-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/pricing-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/progress-indicator.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/progress-steps.stories.tsx +33 -0
- package/apps/storybook/stories/catalog/qr-code.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/radar-chart.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/radio-group.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/rating.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/rich-text-editor.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/run-inspector.stories.tsx +23 -0
- package/apps/storybook/stories/catalog/section-footer.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/section-header.stories.tsx +31 -0
- package/apps/storybook/stories/catalog/select.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/settings-01.stories.tsx +24 -0
- package/apps/storybook/stories/catalog/settings-02.stories.tsx +24 -0
- package/apps/storybook/stories/catalog/settings-page.stories.tsx +48 -0
- package/apps/storybook/stories/catalog/sidebar-navigation.stories.tsx +40 -0
- package/apps/storybook/stories/catalog/sign-in-form.stories.tsx +28 -0
- package/apps/storybook/stories/catalog/sign-up-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/skeleton.stories.tsx +21 -0
- package/apps/storybook/stories/catalog/slider.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/social-button.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/social-proof.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/spinner.stories.tsx +15 -0
- package/apps/storybook/stories/catalog/store-button.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/tabs.stories.tsx +38 -0
- package/apps/storybook/stories/catalog/tags.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/team-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/team-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/testimonial-section.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/textarea.stories.tsx +22 -0
- package/apps/storybook/stories/catalog/toggle.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/tool-call.stories.tsx +40 -0
- package/apps/storybook/stories/catalog/tooltip.stories.tsx +30 -0
- package/apps/storybook/stories/catalog/tree-view.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/utility-button.stories.tsx +60 -0
- package/apps/storybook/stories/catalog/verification-code.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/verification-page.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/video-player.stories.tsx +18 -0
- package/apps/storybook/stories/catalog/workflow-canvas.stories.tsx +45 -0
- package/apps/storybook/stories/catalog/workflow-node.stories.tsx +24 -0
- package/apps/storybook/vitest.config.ts +39 -0
- package/apps/web/README.md +13 -0
- package/apps/web/app.js +483 -0
- package/apps/web/favicon.svg +6 -0
- package/apps/web/index.html +205 -0
- package/apps/web/styles.css +1823 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/README-FIRST.txt +20 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/SHA256SUMS.txt +11 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-delivery-metadata.json +25 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-evidence.zip +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-execution-report.md +60 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-manifest.json +106 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-source.tar.gz +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system-source.zip +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-design-system.bundle +0 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-evidence-index.html +38 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-verification-status.txt +15 -0
- package/artifacts/original-delivery/NOE-Design-System-Delivery/noe-visual-contact-sheet.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/README.txt +13 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/browser-console.json +4 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/layout-audit.json +4 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/review/contact-sheet.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-dark-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-en-light-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-dark-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1280.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-390.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-fa-light-768.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-pseudo-ltr-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/agent-pseudo-rtl-1024.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/consumer-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/consumer-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/dashboard-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/dashboard-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/workflow-en-light-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots/workflow-fa-dark-1440.png +0 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/screenshots-manifest.json +203 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/verification-result.json +165 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/verification-result.txt +32 -0
- package/artifacts/original-delivery/noe-design-system-evidence/evidence/visual-index.html +1 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-delivery-metadata.json +25 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-design-system-execution-report.md +60 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-design-system-manifest.json +106 -0
- package/artifacts/original-delivery/noe-design-system-evidence/noe-verification-status.txt +15 -0
- package/artifacts/original-delivery/noe-design-system.bundle +0 -0
- package/artifacts/original-delivery/source-evidence/verification-result.json +165 -0
- package/artifacts/original-delivery/source-evidence/verification-result.txt +32 -0
- package/artifacts/registry-consumer-report.json +153 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Black.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Bold.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-DemiBold.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-ExtraBlack.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-ExtraBold.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Heavy.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Light.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Medium.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Regular.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-Thin.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff/IRANYekanXFaNum-UltraLight.woff +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Black.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Bold.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-DemiBold.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-ExtraBlack.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-ExtraBold.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Heavy.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Light.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Medium.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Regular.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-Thin.woff2 +0 -0
- package/artifacts/source-inputs/persian-fonts/Woff2/IRANYekanXFaNum-UltraLight.woff2 +0 -0
- package/biome.json +170 -0
- package/components.json +23 -0
- package/docs/adr/0001-semantic-foundation.md +5 -0
- package/docs/adr/0002-locale-direction.md +5 -0
- package/docs/adr/0003-registry-mcp.md +5 -0
- package/docs/adr/0004-testing-evidence.md +5 -0
- package/docs/adr/0005-noe-package-namespace.md +9 -0
- package/docs/adr/0006-icons8-icon-policy.md +9 -0
- package/docs/adr/0007-registry-publication-contract.md +9 -0
- package/docs/adr/0008-capability-library-adapter-boundaries.md +16 -0
- package/docs/adr/0009-calendar-system-jalali.md +29 -0
- package/docs/adr/0010-canonical-manifest-ownership.md +29 -0
- package/docs/adr/0011-palette-graphite-governance.md +27 -0
- package/docs/adr/0012-persian-font-gating.md +25 -0
- package/docs/adr/0013-cinematic-token-exception.md +32 -0
- package/docs/design-system/README.md +16 -0
- package/docs/design-system/accessibility.md +20 -0
- package/docs/design-system/agent-guide.md +11 -0
- package/docs/design-system/agentic-ui.md +21 -0
- package/docs/design-system/architecture.md +40 -0
- package/docs/design-system/brand.md +59 -0
- package/docs/design-system/ci-cd.md +46 -0
- package/docs/design-system/components.md +88 -0
- package/docs/design-system/contributing.md +7 -0
- package/docs/design-system/foundations.md +40 -0
- package/docs/design-system/i18n.md +24 -0
- package/docs/design-system/inventory.md +389 -0
- package/docs/design-system/mcp.md +7 -0
- package/docs/design-system/motion.md +7 -0
- package/docs/design-system/noe-brand-audit.md +33 -0
- package/docs/design-system/registry.md +16 -0
- package/docs/design-system/rtl.md +27 -0
- package/docs/design-system/security.md +16 -0
- package/docs/design-system/testing.md +39 -0
- package/docs/design-system/tokens.md +38 -0
- package/docs/design-system/visual-qa.md +10 -0
- package/docs/superpowers/plans/2026-08-25-noe-design-system-development-ready.md +833 -0
- package/docs/superpowers/plans/2026-08-26-noe-complete-catalog.md +422 -0
- package/docs/superpowers/specs/2026-08-25-noe-design-system-development-ready-design.md +260 -0
- package/docs/superpowers/specs/2026-08-26-noe-complete-catalog-design.md +187 -0
- package/llms.txt +20 -0
- package/package.json +68 -0
- package/packages/ai-ui/package.json +15 -0
- package/packages/ai-ui/src/activity-feed.tsx +60 -0
- package/packages/ai-ui/src/agent-composer.tsx +54 -0
- package/packages/ai-ui/src/agent-message.tsx +50 -0
- package/packages/ai-ui/src/agent-plan.tsx +69 -0
- package/packages/ai-ui/src/agent-workspace.tsx +63 -0
- package/packages/ai-ui/src/approval-request.tsx +93 -0
- package/packages/ai-ui/src/index.ts +8 -0
- package/packages/ai-ui/src/run-inspector.tsx +54 -0
- package/packages/ai-ui/src/tool-call.tsx +71 -0
- package/packages/data-ui/package.json +16 -0
- package/packages/data-ui/src/activity-gauge.tsx +38 -0
- package/packages/data-ui/src/chart-frame.tsx +41 -0
- package/packages/data-ui/src/chart.tsx +131 -0
- package/packages/data-ui/src/dashboard-01.tsx +39 -0
- package/packages/data-ui/src/dashboard-02.tsx +33 -0
- package/packages/data-ui/src/dashboard-shell.tsx +56 -0
- package/packages/data-ui/src/data-table.tsx +99 -0
- package/packages/data-ui/src/filter-bar.tsx +28 -0
- package/packages/data-ui/src/index.ts +12 -0
- package/packages/data-ui/src/metric-card.tsx +43 -0
- package/packages/data-ui/src/pagination.tsx +67 -0
- package/packages/data-ui/src/pie-chart.tsx +38 -0
- package/packages/data-ui/src/radar-chart.tsx +38 -0
- package/packages/design-tokens/package.json +23 -0
- package/packages/design-tokens/src/base.css +255 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Bold.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-DemiBold.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Medium.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXFaNum-Regular.woff2 +0 -0
- package/packages/design-tokens/src/fonts/IRANYekanXVF.ttf +0 -0
- package/packages/design-tokens/src/fonts/README.md +13 -0
- package/packages/design-tokens/src/fonts.css +49 -0
- package/packages/design-tokens/src/index.test.ts +36 -0
- package/packages/design-tokens/src/index.ts +5 -0
- package/packages/design-tokens/src/palette.ts +27 -0
- package/packages/design-tokens/src/tailwind.css +3 -0
- package/packages/design-tokens/src/theme.css +67 -0
- package/packages/design-tokens/src/tokens.css +251 -0
- package/packages/design-tokens/src/tokens.json +275 -0
- package/packages/design-tokens/src/tokens.mjs +276 -0
- package/packages/i18n/package.json +13 -0
- package/packages/i18n/src/index.ts +17 -0
- package/packages/i18n/src/messages/en.json +116 -0
- package/packages/i18n/src/messages/fa.json +116 -0
- package/packages/i18n/src/runtime.d.mts +42 -0
- package/packages/i18n/src/runtime.mjs +113 -0
- package/packages/i18n/src/translate.test.ts +50 -0
- package/packages/i18n/src/translate.ts +29 -0
- package/packages/icons/package.json +12 -0
- package/packages/icons/src/adapters.tsx +167 -0
- package/packages/icons/src/index.tsx +103 -0
- package/packages/registry/README.md +7 -0
- package/packages/registry/catalog-index.json +1345 -0
- package/packages/registry/component-audit.json +1038 -0
- package/packages/registry/coss-adoption.json +281 -0
- package/packages/registry/docs-index.json +1881 -0
- package/packages/registry/manifest.json +11081 -0
- package/packages/registry/manifest.schema.json +135 -0
- package/packages/registry/package.json +10 -0
- package/packages/registry/r/activity-feed.json +67 -0
- package/packages/registry/r/agent-composer.json +79 -0
- package/packages/registry/r/agent-message.json +72 -0
- package/packages/registry/r/agent-plan.json +67 -0
- package/packages/registry/r/agent-workspace.json +67 -0
- package/packages/registry/r/alert.json +68 -0
- package/packages/registry/r/app-frame.json +67 -0
- package/packages/registry/r/approval-request.json +84 -0
- package/packages/registry/r/badge.json +68 -0
- package/packages/registry/r/bidi-text.json +70 -0
- package/packages/registry/r/bottom-navigation.json +67 -0
- package/packages/registry/r/button.json +83 -0
- package/packages/registry/r/calendar.json +97 -0
- package/packages/registry/r/card.json +67 -0
- package/packages/registry/r/chart-frame.json +67 -0
- package/packages/registry/r/chart.json +67 -0
- package/packages/registry/r/code-block.json +67 -0
- package/packages/registry/r/context-menu.json +81 -0
- package/packages/registry/r/dashboard-01.json +86 -0
- package/packages/registry/r/dashboard-02.json +84 -0
- package/packages/registry/r/dashboard-shell.json +67 -0
- package/packages/registry/r/data-list.json +67 -0
- package/packages/registry/r/data-table.json +72 -0
- package/packages/registry/r/date-picker.json +117 -0
- package/packages/registry/r/dialog.json +84 -0
- package/packages/registry/r/direction-provider.json +54 -0
- package/packages/registry/r/drawer.json +80 -0
- package/packages/registry/r/dropdown.json +78 -0
- package/packages/registry/r/empty-state.json +67 -0
- package/packages/registry/r/error-state.json +67 -0
- package/packages/registry/r/fab.json +80 -0
- package/packages/registry/r/featured-icon.json +71 -0
- package/packages/registry/r/filter-bar.json +69 -0
- package/packages/registry/r/gradient-picker.json +62 -0
- package/packages/registry/r/header-navigation.json +67 -0
- package/packages/registry/r/hero-header.json +63 -0
- package/packages/registry/r/icon-system.json +59 -0
- package/packages/registry/r/image-picker.json +62 -0
- package/packages/registry/r/inline-cta.json +73 -0
- package/packages/registry/r/input.json +73 -0
- package/packages/registry/r/landing-page.json +70 -0
- package/packages/registry/r/login-page.json +71 -0
- package/packages/registry/r/marketing-header.json +63 -0
- package/packages/registry/r/menu.json +74 -0
- package/packages/registry/r/messaging.json +69 -0
- package/packages/registry/r/metric-card.json +67 -0
- package/packages/registry/r/mobile-screen.json +67 -0
- package/packages/registry/r/not-found.json +63 -0
- package/packages/registry/r/page-header.json +67 -0
- package/packages/registry/r/pagination.json +91 -0
- package/packages/registry/r/progress-steps.json +69 -0
- package/packages/registry/r/run-inspector.json +72 -0
- package/packages/registry/r/section-header.json +67 -0
- package/packages/registry/r/settings-01.json +94 -0
- package/packages/registry/r/settings-02.json +99 -0
- package/packages/registry/r/settings-page.json +67 -0
- package/packages/registry/r/sidebar-navigation.json +67 -0
- package/packages/registry/r/sign-in-form.json +89 -0
- package/packages/registry/r/skeleton.json +67 -0
- package/packages/registry/r/spinner.json +67 -0
- package/packages/registry/r/tabs.json +69 -0
- package/packages/registry/r/textarea.json +73 -0
- package/packages/registry/r/tool-call.json +72 -0
- package/packages/registry/r/tooltip.json +73 -0
- package/packages/registry/r/utility-button.json +83 -0
- package/packages/registry/r/workflow-canvas.json +67 -0
- package/packages/registry/r/workflow-node.json +72 -0
- package/packages/registry/r-planned-backup/about-page.json +14 -0
- package/packages/registry/r-planned-backup/activity-gauge.json +14 -0
- package/packages/registry/r-planned-backup/avatar.json +14 -0
- package/packages/registry/r-planned-backup/badge-group.json +14 -0
- package/packages/registry/r-planned-backup/banner.json +14 -0
- package/packages/registry/r-planned-backup/blog-index-page.json +14 -0
- package/packages/registry/r-planned-backup/blog-post-page.json +14 -0
- package/packages/registry/r-planned-backup/blog-section.json +14 -0
- package/packages/registry/r-planned-backup/button-group.json +14 -0
- package/packages/registry/r-planned-backup/careers-section.json +14 -0
- package/packages/registry/r-planned-backup/carousel.json +14 -0
- package/packages/registry/r-planned-backup/checkbox.json +14 -0
- package/packages/registry/r-planned-backup/color-picker.json +14 -0
- package/packages/registry/r-planned-backup/command-menu.json +14 -0
- package/packages/registry/r-planned-backup/contact-page.json +14 -0
- package/packages/registry/r-planned-backup/contact-section.json +14 -0
- package/packages/registry/r-planned-backup/content-divider.json +14 -0
- package/packages/registry/r-planned-backup/content-section.json +14 -0
- package/packages/registry/r-planned-backup/credit-card.json +14 -0
- package/packages/registry/r-planned-backup/cta-section.json +14 -0
- package/packages/registry/r-planned-backup/email-template.json +14 -0
- package/packages/registry/r-planned-backup/faq-page.json +14 -0
- package/packages/registry/r-planned-backup/faq-section.json +14 -0
- package/packages/registry/r-planned-backup/feature-section.json +14 -0
- package/packages/registry/r-planned-backup/file-uploader.json +14 -0
- package/packages/registry/r-planned-backup/footer.json +14 -0
- package/packages/registry/r-planned-backup/forgot-password-page.json +14 -0
- package/packages/registry/r-planned-backup/illustration.json +14 -0
- package/packages/registry/r-planned-backup/informational-page-01.json +14 -0
- package/packages/registry/r-planned-backup/informational-page-02.json +14 -0
- package/packages/registry/r-planned-backup/legal-page.json +14 -0
- package/packages/registry/r-planned-backup/marketing-404-page.json +14 -0
- package/packages/registry/r-planned-backup/metrics-section.json +14 -0
- package/packages/registry/r-planned-backup/multi-select.json +14 -0
- package/packages/registry/r-planned-backup/newsletter.json +14 -0
- package/packages/registry/r-planned-backup/notification.json +14 -0
- package/packages/registry/r-planned-backup/pie-chart.json +14 -0
- package/packages/registry/r-planned-backup/pricing-page.json +14 -0
- package/packages/registry/r-planned-backup/pricing-section.json +14 -0
- package/packages/registry/r-planned-backup/progress-indicator.json +14 -0
- package/packages/registry/r-planned-backup/qr-code.json +14 -0
- package/packages/registry/r-planned-backup/radar-chart.json +14 -0
- package/packages/registry/r-planned-backup/radio-group.json +14 -0
- package/packages/registry/r-planned-backup/rating.json +14 -0
- package/packages/registry/r-planned-backup/rich-text-editor.json +14 -0
- package/packages/registry/r-planned-backup/section-footer.json +14 -0
- package/packages/registry/r-planned-backup/select.json +14 -0
- package/packages/registry/r-planned-backup/sign-up-page.json +14 -0
- package/packages/registry/r-planned-backup/slider.json +14 -0
- package/packages/registry/r-planned-backup/social-button.json +14 -0
- package/packages/registry/r-planned-backup/social-proof.json +14 -0
- package/packages/registry/r-planned-backup/store-button.json +14 -0
- package/packages/registry/r-planned-backup/tags.json +14 -0
- package/packages/registry/r-planned-backup/team-page.json +14 -0
- package/packages/registry/r-planned-backup/team-section.json +14 -0
- package/packages/registry/r-planned-backup/testimonial-section.json +14 -0
- package/packages/registry/r-planned-backup/toggle.json +14 -0
- package/packages/registry/r-planned-backup/tree-view.json +14 -0
- package/packages/registry/r-planned-backup/verification-code.json +14 -0
- package/packages/registry/r-planned-backup/verification-page.json +14 -0
- package/packages/registry/r-planned-backup/video-player.json +14 -0
- package/packages/registry/registry.json +1997 -0
- package/packages/registry/search-index.json +3942 -0
- package/packages/testing/package.json +9 -0
- package/packages/testing/src/index.mjs +10 -0
- package/packages/ui/package.json +26 -0
- package/packages/ui/src/about-page.tsx +19 -0
- package/packages/ui/src/alert.tsx +67 -0
- package/packages/ui/src/app-frame.tsx +63 -0
- package/packages/ui/src/avatar.tsx +19 -0
- package/packages/ui/src/badge-group.tsx +19 -0
- package/packages/ui/src/badge.tsx +35 -0
- package/packages/ui/src/banner.tsx +19 -0
- package/packages/ui/src/bidi.tsx +80 -0
- package/packages/ui/src/blog-index-page.tsx +19 -0
- package/packages/ui/src/blog-post-page.tsx +19 -0
- package/packages/ui/src/blog-section.tsx +19 -0
- package/packages/ui/src/bottom-navigation.tsx +60 -0
- package/packages/ui/src/button-group.tsx +19 -0
- package/packages/ui/src/button.browser.test.tsx +38 -0
- package/packages/ui/src/button.tsx +81 -0
- package/packages/ui/src/calendar-system.test.ts +103 -0
- package/packages/ui/src/calendar-system.ts +120 -0
- package/packages/ui/src/calendar.browser.test.tsx +52 -0
- package/packages/ui/src/calendar.tsx +339 -0
- package/packages/ui/src/card.tsx +63 -0
- package/packages/ui/src/careers-section.tsx +19 -0
- package/packages/ui/src/carousel.tsx +19 -0
- package/packages/ui/src/checkbox.tsx +17 -0
- package/packages/ui/src/cinematic/cinematic.css +2020 -0
- package/packages/ui/src/cinematic/ecosystem-motion-showcase.tsx +265 -0
- package/packages/ui/src/cinematic/ecosystem-sphere.tsx +627 -0
- package/packages/ui/src/cinematic/index.ts +5 -0
- package/packages/ui/src/cinematic/kinetic-experience.tsx +207 -0
- package/packages/ui/src/cinematic/portfolio.ts +132 -0
- package/packages/ui/src/cinematic/system-anatomy.tsx +173 -0
- package/packages/ui/src/code.tsx +119 -0
- package/packages/ui/src/color-picker.tsx +22 -0
- package/packages/ui/src/command-menu.tsx +19 -0
- package/packages/ui/src/contact-page.tsx +19 -0
- package/packages/ui/src/contact-section.tsx +19 -0
- package/packages/ui/src/content-divider.tsx +19 -0
- package/packages/ui/src/content-section.tsx +19 -0
- package/packages/ui/src/context-menu.tsx +208 -0
- package/packages/ui/src/credit-card.tsx +19 -0
- package/packages/ui/src/cta-section.tsx +19 -0
- package/packages/ui/src/data-list.tsx +81 -0
- package/packages/ui/src/date-picker.browser.test.tsx +48 -0
- package/packages/ui/src/date-picker.tsx +248 -0
- package/packages/ui/src/dialog.browser.test.tsx +32 -0
- package/packages/ui/src/dialog.tsx +144 -0
- package/packages/ui/src/direction.tsx +46 -0
- package/packages/ui/src/drawer.tsx +179 -0
- package/packages/ui/src/dropdown.tsx +200 -0
- package/packages/ui/src/email-template.tsx +19 -0
- package/packages/ui/src/empty-state.tsx +43 -0
- package/packages/ui/src/error-state.tsx +44 -0
- package/packages/ui/src/fab.tsx +32 -0
- package/packages/ui/src/faq-page.tsx +19 -0
- package/packages/ui/src/faq-section.tsx +19 -0
- package/packages/ui/src/feature-section.tsx +19 -0
- package/packages/ui/src/featured-icon.tsx +63 -0
- package/packages/ui/src/field.browser.test.tsx +33 -0
- package/packages/ui/src/field.tsx +117 -0
- package/packages/ui/src/file-uploader.tsx +19 -0
- package/packages/ui/src/footer.tsx +19 -0
- package/packages/ui/src/forgot-password-page.tsx +19 -0
- package/packages/ui/src/gradient-picker.tsx +65 -0
- package/packages/ui/src/header-navigation.tsx +71 -0
- package/packages/ui/src/hero-header.tsx +57 -0
- package/packages/ui/src/illustration.tsx +19 -0
- package/packages/ui/src/image-picker.tsx +56 -0
- package/packages/ui/src/index.ts +110 -0
- package/packages/ui/src/informational-page-01.tsx +19 -0
- package/packages/ui/src/informational-page-02.tsx +19 -0
- package/packages/ui/src/inline-cta.tsx +29 -0
- package/packages/ui/src/input.tsx +44 -0
- package/packages/ui/src/landing-page.tsx +56 -0
- package/packages/ui/src/legal-page.tsx +19 -0
- package/packages/ui/src/lib/cn.ts +6 -0
- package/packages/ui/src/lib/i18n-messages.ts +40 -0
- package/packages/ui/src/login-page.tsx +78 -0
- package/packages/ui/src/marketing-404-page.tsx +19 -0
- package/packages/ui/src/marketing-header.tsx +53 -0
- package/packages/ui/src/menu.tsx +220 -0
- package/packages/ui/src/messaging.tsx +62 -0
- package/packages/ui/src/metrics-section.tsx +19 -0
- package/packages/ui/src/mobile-screen.tsx +37 -0
- package/packages/ui/src/multi-select.tsx +16 -0
- package/packages/ui/src/newsletter.tsx +19 -0
- package/packages/ui/src/not-found.tsx +60 -0
- package/packages/ui/src/notification.tsx +19 -0
- package/packages/ui/src/page-header.tsx +80 -0
- package/packages/ui/src/pricing-page.tsx +19 -0
- package/packages/ui/src/pricing-section.tsx +19 -0
- package/packages/ui/src/progress-indicator.tsx +19 -0
- package/packages/ui/src/progress-steps.tsx +85 -0
- package/packages/ui/src/qr-code.tsx +19 -0
- package/packages/ui/src/radio-group.tsx +26 -0
- package/packages/ui/src/rating.tsx +19 -0
- package/packages/ui/src/rich-text-editor.tsx +18 -0
- package/packages/ui/src/section-footer.tsx +19 -0
- package/packages/ui/src/section-header.tsx +37 -0
- package/packages/ui/src/select.tsx +27 -0
- package/packages/ui/src/settings-01.tsx +49 -0
- package/packages/ui/src/settings-02.tsx +58 -0
- package/packages/ui/src/settings-page.tsx +62 -0
- package/packages/ui/src/sidebar-navigation.tsx +77 -0
- package/packages/ui/src/sign-in-form.tsx +60 -0
- package/packages/ui/src/sign-up-page.tsx +19 -0
- package/packages/ui/src/skeleton.tsx +14 -0
- package/packages/ui/src/slider.tsx +13 -0
- package/packages/ui/src/social-button.tsx +19 -0
- package/packages/ui/src/social-proof.tsx +19 -0
- package/packages/ui/src/spinner.tsx +26 -0
- package/packages/ui/src/store-button.tsx +19 -0
- package/packages/ui/src/tabs.browser.test.tsx +33 -0
- package/packages/ui/src/tabs.tsx +175 -0
- package/packages/ui/src/tags.tsx +11 -0
- package/packages/ui/src/team-page.tsx +19 -0
- package/packages/ui/src/team-section.tsx +19 -0
- package/packages/ui/src/testimonial-section.tsx +19 -0
- package/packages/ui/src/textarea.tsx +45 -0
- package/packages/ui/src/theme-provider.browser.test.tsx +90 -0
- package/packages/ui/src/theme-provider.tsx +417 -0
- package/packages/ui/src/theme-toggle.tsx +107 -0
- package/packages/ui/src/toggle.tsx +34 -0
- package/packages/ui/src/tooltip.tsx +50 -0
- package/packages/ui/src/tree-view.tsx +19 -0
- package/packages/ui/src/utility-button.tsx +33 -0
- package/packages/ui/src/utils.ts +13 -0
- package/packages/ui/src/verification-code.tsx +27 -0
- package/packages/ui/src/verification-page.tsx +19 -0
- package/packages/ui/src/video-player.tsx +19 -0
- package/packages/workflow-ui/package.json +15 -0
- package/packages/workflow-ui/src/index.ts +2 -0
- package/packages/workflow-ui/src/workflow-canvas.tsx +51 -0
- package/packages/workflow-ui/src/workflow-node.tsx +61 -0
- package/playwright.config.ts +58 -0
- package/pnpm-workspace.yaml +5 -0
- package/registry.json +216 -0
- package/scripts/build-static.mjs +68 -0
- package/scripts/capture-visuals.py +106 -0
- package/scripts/capture-visuals.sh +10 -0
- package/scripts/create-visual-index.mjs +16 -0
- package/scripts/enrich-registry-payloads.mjs +83 -0
- package/scripts/fix-noe-imports.mjs +134 -0
- package/scripts/fix-registry-closure.mjs +110 -0
- package/scripts/fix-registry-deps-cleanup.mjs +149 -0
- package/scripts/fix-relative-for-registry.mjs +103 -0
- package/scripts/generate-design-tokens.mjs +134 -0
- package/scripts/generate-inventory.mjs +62 -0
- package/scripts/generate-manifest.mjs +1149 -0
- package/scripts/generate-phase4.mjs +875 -0
- package/scripts/validate-manifest.mjs +477 -0
- package/scripts/validate-pngs.mjs +31 -0
- package/scripts/verify-registry-consumer.mjs +319 -0
- package/scripts/verify-registry-dependencies.mjs +162 -0
- package/scripts/verify.mjs +316 -0
- package/tests/catalog-audit.test.mjs +156 -0
- package/tests/e2e/capture-visuals.mjs +34 -0
- package/tests/e2e/catalog-typography.spec.ts +110 -0
- package/tests/e2e/catalog.spec.ts +68 -0
- package/tests/e2e/direction.spec.ts +60 -0
- package/tests/e2e/responsive.spec.ts +30 -0
- package/tests/e2e/surfaces.spec.ts +51 -0
- package/tests/i18n.test.mjs +36 -0
- package/tests/icons.test.mjs +21 -0
- package/tests/registry-publication.test.mjs +88 -0
- package/tests/registry.test.mjs +51 -0
- package/tests/rtl.test.mjs +21 -0
- package/tests/static-app.test.mjs +49 -0
- package/tests/tokens.test.mjs +24 -0
- package/tests/workspace.test.mjs +25 -0
- package/tsconfig.base.json +69 -0
- package/tsconfig.json +27 -0
- package/tsconfig.verify.json +19 -0
- package/types/offline-react.d.ts +73 -0
- 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.
|