@echelon-foundry/design-system 0.3.0 → 0.4.0-main.222.1

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 (76) hide show
  1. package/README.md +29 -0
  2. package/contracts/diagram-presentation.json +109 -0
  3. package/contracts/machine-operability.json +48 -0
  4. package/contracts/workflow-capabilities.json +25 -0
  5. package/dist/all.css +175 -3
  6. package/dist/build-metrics.json +33 -5
  7. package/dist/components.css +173 -3
  8. package/dist/foundations.css +2 -0
  9. package/dist/marketing/forma-all.css +176 -4
  10. package/dist/marketing/forma-echelon-marketing.css +3 -1
  11. package/dist/marketing/forma-marketing-theme-echelon.css +1 -1
  12. package/dist/marketing/forma-marketing.css +3 -1
  13. package/dist/marketing/forma-marketing.manifest.json +9 -9
  14. package/dist/marketing/forma-marketing.sha256 +4 -4
  15. package/dist/patterns/bounded-overflow.html +9 -0
  16. package/dist/patterns/button.html +5 -0
  17. package/dist/patterns/container.html +6 -0
  18. package/dist/patterns/date-time-field.html +5 -0
  19. package/dist/patterns/grid.html +5 -0
  20. package/dist/patterns/image-choice.html +2 -2
  21. package/dist/patterns/key-value-list.html +5 -0
  22. package/dist/patterns/section.html +4 -0
  23. package/dist/patterns/skip-link.html +6 -0
  24. package/dist/patterns/spatial-canvas.html +2 -2
  25. package/dist/patterns/split.html +12 -0
  26. package/dist/patterns/surface.html +4 -0
  27. package/dist/patterns/text-field.html +5 -0
  28. package/dist/patterns/text-roles.html +7 -0
  29. package/dist/patterns/textarea.html +5 -0
  30. package/dist/patterns/visually-hidden.html +4 -0
  31. package/docs/MARKETING-SITES.md +1 -1
  32. package/docs/workflow/EMBEDDING.md +148 -0
  33. package/docs/workflow/EXTERNAL-PRODUCERS.md +34 -0
  34. package/docs/workflow/FORMAT.md +196 -0
  35. package/docs/workflow/RENDERING.md +90 -0
  36. package/docs/workflow/REQUIREMENTS-AUDIT-2026-10-01.md +55 -0
  37. package/docs/workflow/VALIDATION.md +91 -0
  38. package/examples/workflows/fixtures.json +101 -0
  39. package/examples/workflows/forma/workflows/accessible.forma-workflow.json +90 -0
  40. package/examples/workflows/forma/workflows/branching.forma-workflow.json +91 -0
  41. package/examples/workflows/forma/workflows/branded.forma-workflow.json +85 -0
  42. package/examples/workflows/forma/workflows/color-mapping.forma-workflow.json +111 -0
  43. package/examples/workflows/forma/workflows/colored.forma-workflow.json +131 -0
  44. package/examples/workflows/forma/workflows/edge-metadata.forma-workflow.json +66 -0
  45. package/examples/workflows/forma/workflows/embedded-edit.forma-workflow.json +117 -0
  46. package/examples/workflows/forma/workflows/embedded-view.forma-workflow.json +93 -0
  47. package/examples/workflows/forma/workflows/extensions.forma-workflow.json +90 -0
  48. package/examples/workflows/forma/workflows/groups.forma-workflow.json +89 -0
  49. package/examples/workflows/forma/workflows/interactive-export.forma-workflow.json +62 -0
  50. package/examples/workflows/forma/workflows/minimal.forma-workflow.json +17 -0
  51. package/examples/workflows/forma/workflows/mobile.forma-workflow.json +80 -0
  52. package/examples/workflows/forma/workflows/multi-step.forma-workflow.json +82 -0
  53. package/examples/workflows/forma/workflows/no-layout.forma-workflow.json +90 -0
  54. package/examples/workflows/forma/workflows/node-metadata.forma-workflow.json +80 -0
  55. package/examples/workflows/forma/workflows/runtime-ports.forma-workflow.json +118 -0
  56. package/examples/workflows/forma/workflows/static-export.forma-workflow.json +77 -0
  57. package/examples/workflows/forma/workflows/swimlanes.forma-workflow.json +130 -0
  58. package/figma/component-contracts.json +140 -0
  59. package/package.json +33 -10
  60. package/patterns/bounded-overflow.html +9 -0
  61. package/patterns/button.html +5 -0
  62. package/patterns/container.html +6 -0
  63. package/patterns/date-time-field.html +5 -0
  64. package/patterns/grid.html +5 -0
  65. package/patterns/image-choice.html +2 -2
  66. package/patterns/key-value-list.html +5 -0
  67. package/patterns/section.html +4 -0
  68. package/patterns/skip-link.html +6 -0
  69. package/patterns/spatial-canvas.html +2 -2
  70. package/patterns/split.html +12 -0
  71. package/patterns/surface.html +4 -0
  72. package/patterns/text-field.html +5 -0
  73. package/patterns/text-roles.html +7 -0
  74. package/patterns/textarea.html +5 -0
  75. package/patterns/visually-hidden.html +4 -0
  76. package/schemas/workflow/1.0/forma-workflow.schema.json +1045 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@echelon-foundry/design-system",
3
- "version": "0.3.0",
3
+ "version": "0.4.0-main.222.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Zero-runtime HTML and CSS design system for Echelon Foundry applications.",
@@ -23,7 +23,12 @@
23
23
  "./marketing.css": "./dist/marketing.css",
24
24
  "./marketing/*": "./dist/marketing/*",
25
25
  "./tokens.json": "./tokens/echelon.tokens.json",
26
- "./figma/components.json": "./figma/component-contracts.json"
26
+ "./figma/components.json": "./figma/component-contracts.json",
27
+ "./contracts/diagram-presentation.json": "./contracts/diagram-presentation.json",
28
+ "./workflow/forma-workflow.schema.json": "./schemas/workflow/1.0/forma-workflow.schema.json",
29
+ "./contracts/workflow-capabilities.json": "./contracts/workflow-capabilities.json",
30
+ "./workflow/examples/*": "./examples/workflows/forma/workflows/*",
31
+ "./contracts/machine-operability.json": "./contracts/machine-operability.json"
27
32
  },
28
33
  "files": [
29
34
  "dist",
@@ -32,7 +37,14 @@
32
37
  "docs/BRANDING.md",
33
38
  "docs/MARKETING-SITES.md",
34
39
  "tokens/echelon.tokens.json",
35
- "figma/component-contracts.json"
40
+ "figma/component-contracts.json",
41
+ "contracts/diagram-presentation.json",
42
+ "schemas/workflow/1.0/forma-workflow.schema.json",
43
+ "contracts/workflow-capabilities.json",
44
+ "examples/workflows/forma/workflows",
45
+ "examples/workflows/fixtures.json",
46
+ "docs/workflow",
47
+ "contracts/machine-operability.json"
36
48
  ],
37
49
  "scripts": {
38
50
  "clean": "node tools/clean.mjs",
@@ -45,14 +57,14 @@
45
57
  "test:runtime": "node --test tests/zero-runtime.test.mjs",
46
58
  "motion:audit": "node tools/motion-audit.mjs",
47
59
  "test:motion": "node --test tests/motion-audit.test.mjs tests/motion-gate.test.mjs && node tools/motion-audit.mjs --strict",
48
- "check": "npm run build && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:figma && npm run test:css && npm run test:package && npm run test:browser",
60
+ "check": "npm run build && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:figma && npm run test:css && npm run test:package && npm run workflow:test && npm run workflow:build && npm run test:workflow-package && npm run test:browser",
49
61
  "site:build": "npm run build && node tools/build-site.mjs",
50
- "site:test": "node --test tests/site-build.test.mjs",
51
- "site:check": "npm run site:build && npm run site:test && npm run site:mobile",
62
+ "site:test": "node --test tests/site-build.test.mjs tests/catalog-coverage.test.mjs",
63
+ "site:check": "npm run site:build && npm run catalog:check && npm run site:test && npm run site:mobile",
52
64
  "site:mobile": "playwright test --config=playwright.site.config.mjs",
53
65
  "pack:verify": "npm run build && npm pack --dry-run",
54
66
  "test:package": "node --test tests/package-contract.test.mjs",
55
- "test:css": "node --test tests/css-source.test.mjs",
67
+ "test:css": "node --test tests/css-source.test.mjs tests/diagram-contract.test.mjs",
56
68
  "brands:build": "dotnet run --project tools/BrandCompiler/BrandCompiler.fsproj -- brands dist/brands",
57
69
  "test:brands": "node --test tests/brand-compiler.test.mjs",
58
70
  "test:character-grid": "node --test tests/character-grid.test.mjs",
@@ -61,8 +73,17 @@
61
73
  "test:marketing": "node --test tests/marketing-tokens.test.mjs tests/marketing-distribution.test.mjs tests/marketing-structure.test.mjs tests/site-css-policy.test.mjs",
62
74
  "example:install": "mkdir -p build/example && cp examples/echelon-marketing-site/forma.lock build/example/forma.lock && bash actions/install-presentation/install.sh --lock build/example/forma.lock --source dist/marketing --update --output examples/echelon-marketing-site/assets/forma",
63
75
  "policy:check": "dotnet run --project tools/SiteCssPolicy/SiteCssPolicy.fsproj --",
64
- "release:check": "npm run build && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:css && npm run test:package && playwright test tests/browser/marketing.spec.mjs && npm run site:check",
65
- "test:figma": "node --test tests/figma-contract.test.mjs"
76
+ "release:check": "npm run build && npm run test:tokens && npm run test:brands && npm run test:runtime && npm run test:motion && npm run test:marketing && npm run test:character-grid && npm run test:css && npm run test:package && npm run test:machine && playwright test tests/browser/marketing.spec.mjs && npm run site:check",
77
+ "test:figma": "node --test tests/figma-contract.test.mjs",
78
+ "catalog:check": "node tools/catalog/validate.mjs && node tools/catalog/inventory.mjs --check",
79
+ "catalog:inventory": "node tools/catalog/inventory.mjs",
80
+ "workflow:test": "dotnet run --project tests/workflow/Forma.Workflow.Tests -c Release",
81
+ "workflow:build": "node tools/build-workflow-package.mjs",
82
+ "workflow:validate": "dotnet run --project src/workflow/Forma.Workflow.Cli -c Release -- validate examples/workflows/forma/workflows/*.forma-workflow.json",
83
+ "test:workflow-package": "node --test tests/workflow-package.test.mjs",
84
+ "test:workflow-browser": "playwright test tests/browser/workflow-static.spec.mjs tests/browser/workflow-embed.spec.mjs",
85
+ "workflow:check": "npm run workflow:test && npm run workflow:build && npm run test:workflow-package && npm run test:workflow-browser",
86
+ "test:machine": "playwright test tests/browser/machine-operability.spec.mjs"
66
87
  },
67
88
  "devDependencies": {
68
89
  "@axe-core/playwright": "4.13.0",
@@ -81,6 +102,8 @@
81
102
  "design-system",
82
103
  "zero-runtime",
83
104
  "marketing-presentation",
84
- "accessibility"
105
+ "accessibility",
106
+ "workflow",
107
+ "machine-operability"
85
108
  ]
86
109
  }
@@ -0,0 +1,9 @@
1
+ <div class="ef-bounded-overflow" role="region" aria-label="Quarterly totals by region" tabindex="0">
2
+ <table>
3
+ <thead><tr><th scope="col">Region</th><th scope="col">Q1</th><th scope="col">Q2</th><th scope="col">Q3</th><th scope="col">Q4</th><th scope="col">Year</th></tr></thead>
4
+ <tbody>
5
+ <tr><th scope="row">North America</th><td>1,204,000</td><td>1,318,500</td><td>1,402,250</td><td>1,511,000</td><td>5,435,750</td></tr>
6
+ <tr><th scope="row">Europe</th><td>904,100</td><td>931,000</td><td>1,010,400</td><td>1,120,900</td><td>3,966,400</td></tr>
7
+ </tbody>
8
+ </table>
9
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="ef-actions">
2
+ <button type="submit">Save changes</button>
3
+ <button type="button">Cancel</button>
4
+ <a class="ef-button" href="#button-help">Read the help article</a>
5
+ </div>
@@ -0,0 +1,6 @@
1
+ <div class="ef-site">
2
+ <div class="ef-container" data-ef-width="narrow">
3
+ <h2>Privacy notice</h2>
4
+ <p>Narrow containers keep reading-focused regions at a comfortable measure while the page background stays full width.</p>
5
+ </div>
6
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="ef-field">
2
+ <label class="ef-field__label" for="date-time-field-due">Due date</label>
3
+ <span class="ef-field__description" id="date-time-field-due-description">The browser supplies its own date picker; typing the date also works.</span>
4
+ <input id="date-time-field-due" name="due" type="date" aria-describedby="date-time-field-due-description">
5
+ </div>
@@ -0,0 +1,5 @@
1
+ <ul class="ef-grid" aria-label="Environments" role="list">
2
+ <li class="ef-surface"><h3>Production</h3><p>12 services, all reporting.</p></li>
3
+ <li class="ef-surface"><h3>Staging</h3><p>12 services, 1 deploying.</p></li>
4
+ <li class="ef-surface"><h3>Development</h3><p>9 services, 3 idle.</p></li>
5
+ </ul>
@@ -4,7 +4,7 @@
4
4
  <label class="ef-choice ef-choice--media">
5
5
  <input type="radio" name="layout-choice" value="compact" required>
6
6
  <span class="ef-choice__media">
7
- <img src="/path/to/compact-layout.png" alt="">
7
+ <img width="160" height="90" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect width='160' height='90' fill='%23e3e0d7'/%3E%3Crect x='10' y='10' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='21' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='32' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='43' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='54' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='65' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='76' width='140' height='8' fill='%23686d68'/%3E%3C/svg%3E" alt="">
8
8
  </span>
9
9
  <span class="ef-choice__content">
10
10
  <strong>Compact layout</strong>
@@ -15,7 +15,7 @@
15
15
  <label class="ef-choice ef-choice--media">
16
16
  <input type="radio" name="layout-choice" value="spacious">
17
17
  <span class="ef-choice__media">
18
- <img src="/path/to/spacious-layout.png" alt="">
18
+ <img width="160" height="90" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect width='160' height='90' fill='%23e3e0d7'/%3E%3Crect x='10' y='10' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='34' width='140' height='8' fill='%23686d68'/%3E%3Crect x='10' y='58' width='140' height='8' fill='%23686d68'/%3E%3C/svg%3E" alt="">
19
19
  </span>
20
20
  <span class="ef-choice__content">
21
21
  <strong>Spacious layout</strong>
@@ -0,0 +1,5 @@
1
+ <dl class="ef-key-value-list">
2
+ <div><dt>Account</dt><dd>Northwind Logistics</dd></div>
3
+ <div><dt>Plan</dt><dd>Team, billed annually</dd></div>
4
+ <div><dt>Renewal</dt><dd><time datetime="2027-03-01">1 March 2027</time></dd></div>
5
+ </dl>
@@ -0,0 +1,4 @@
1
+ <section class="ef-section" aria-labelledby="section-title">
2
+ <h2 id="section-title">Recent activity</h2>
3
+ <p>Sections separate page regions with a consistent block rhythm.</p>
4
+ </section>
@@ -0,0 +1,6 @@
1
+ <div class="ef-site">
2
+ <a class="ef-skip-link" href="#skip-link-main">Skip to main content</a>
3
+ <main id="skip-link-main" tabindex="-1">
4
+ <h1>Account settings</h1>
5
+ </main>
6
+ </div>
@@ -5,8 +5,8 @@
5
5
  </header>
6
6
  <div class="ef-spatial-canvas__viewport" tabindex="0" aria-label="Scrollable system map">
7
7
  <div class="ef-spatial-canvas__surface">
8
- <article class="ef-surface"><h3>Billing</h3><p>Selected node</p></article>
9
- <article class="ef-surface"><h3>Chrona</h3><p>Time source</p></article>
8
+ <article class="ef-surface" id="billing"><h3>Billing</h3><p>Selected node</p></article>
9
+ <article class="ef-surface" id="chrona"><h3>Chrona</h3><p>Time source</p></article>
10
10
  </div>
11
11
  </div>
12
12
  <details class="ef-spatial-canvas__index"><summary>Objects in this view</summary><nav aria-label="Canvas objects"><a href="#billing">Billing</a><a href="#chrona">Chrona</a></nav></details>
@@ -0,0 +1,12 @@
1
+ <div class="ef-site">
2
+ <div class="ef-split">
3
+ <div>
4
+ <h2>Install</h2>
5
+ <p>The primary region takes the available space. The supporting region wraps below it when the row runs out of room.</p>
6
+ </div>
7
+ <aside aria-label="Requirements">
8
+ <h3>Requirements</h3>
9
+ <p>Node 22 or later.</p>
10
+ </aside>
11
+ </div>
12
+ </div>
@@ -0,0 +1,4 @@
1
+ <section class="ef-surface" aria-labelledby="surface-title">
2
+ <h2 id="surface-title">Billing contact</h2>
3
+ <p>Invoices are sent to the finance team on the first business day of each month.</p>
4
+ </section>
@@ -0,0 +1,5 @@
1
+ <div class="ef-field">
2
+ <label class="ef-field__label" for="text-field-email">Work email</label>
3
+ <span class="ef-field__description" id="text-field-email-description">We send sign-in links to this address.</span>
4
+ <input id="text-field-email" name="email" type="email" autocomplete="email" aria-describedby="text-field-email-description" required>
5
+ </div>
@@ -0,0 +1,7 @@
1
+ <div class="ef-site">
2
+ <p class="ef-eyebrow">Release 0.3</p>
3
+ <h2>Faster onboarding for new teams</h2>
4
+ <p class="ef-lead">A lead paragraph introduces the section in one or two sentences.</p>
5
+ <blockquote class="ef-statement"><p>Forma keeps behavior in the application and presentation in the design system.</p></blockquote>
6
+ <span class="ef-component-kicker">Component kicker</span>
7
+ </div>
@@ -0,0 +1,5 @@
1
+ <div class="ef-field">
2
+ <label class="ef-field__label" for="textarea-summary">Change summary</label>
3
+ <span class="ef-field__description" id="textarea-summary-description">Describe what changed and why. Plain text, up to 500 characters.</span>
4
+ <textarea id="textarea-summary" name="summary" rows="4" maxlength="500" aria-describedby="textarea-summary-description"></textarea>
5
+ </div>
@@ -0,0 +1,4 @@
1
+ <button type="button">
2
+ <span aria-hidden="true">×</span>
3
+ <span class="ef-visually-hidden">Remove filter: Region is Europe</span>
4
+ </button>