@echelon-foundry/design-system 0.2.0-main.15.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 (148) hide show
  1. package/README.md +82 -0
  2. package/dist/all.css +3461 -0
  3. package/dist/assessment.css +1123 -0
  4. package/dist/brands/echelon.css +91 -0
  5. package/dist/brands/example-harbor.css +91 -0
  6. package/dist/brands/index.json +17 -0
  7. package/dist/build-metrics.json +152 -0
  8. package/dist/components.css +2123 -0
  9. package/dist/foundations.css +113 -0
  10. package/dist/patterns/alert.html +8 -0
  11. package/dist/patterns/allocation.html +24 -0
  12. package/dist/patterns/best-worst.html +21 -0
  13. package/dist/patterns/binary-choice.html +15 -0
  14. package/dist/patterns/checkbox.html +13 -0
  15. package/dist/patterns/choice-group.html +27 -0
  16. package/dist/patterns/collection-toolbar.html +22 -0
  17. package/dist/patterns/combobox.html +13 -0
  18. package/dist/patterns/command-palette.html +14 -0
  19. package/dist/patterns/composer.html +19 -0
  20. package/dist/patterns/conflict-review.html +17 -0
  21. package/dist/patterns/conversation.html +23 -0
  22. package/dist/patterns/dashboard-grid.html +5 -0
  23. package/dist/patterns/data-grid.html +30 -0
  24. package/dist/patterns/date-range.html +13 -0
  25. package/dist/patterns/dialog.html +15 -0
  26. package/dist/patterns/diff-viewer.html +22 -0
  27. package/dist/patterns/disclosure.html +6 -0
  28. package/dist/patterns/empty-state.html +6 -0
  29. package/dist/patterns/file-upload.html +19 -0
  30. package/dist/patterns/flyout.html +72 -0
  31. package/dist/patterns/hierarchical-choice.html +25 -0
  32. package/dist/patterns/hierarchical-multi-choice.html +27 -0
  33. package/dist/patterns/image-choice.html +25 -0
  34. package/dist/patterns/master-detail.html +16 -0
  35. package/dist/patterns/matrix-single.html +26 -0
  36. package/dist/patterns/menu.html +8 -0
  37. package/dist/patterns/metric-card.html +6 -0
  38. package/dist/patterns/mobile-action-bar.html +4 -0
  39. package/dist/patterns/multi-choice.html +23 -0
  40. package/dist/patterns/numeric-stepper.html +5 -0
  41. package/dist/patterns/obligation-panel.html +36 -0
  42. package/dist/patterns/operation-status.html +12 -0
  43. package/dist/patterns/ordinal-scale.html +42 -0
  44. package/dist/patterns/pagination.html +12 -0
  45. package/dist/patterns/pairwise-choice.html +21 -0
  46. package/dist/patterns/popover.html +6 -0
  47. package/dist/patterns/preview-surface.html +14 -0
  48. package/dist/patterns/provenance-trail.html +9 -0
  49. package/dist/patterns/question.html +13 -0
  50. package/dist/patterns/range-entry.html +18 -0
  51. package/dist/patterns/ranking.html +32 -0
  52. package/dist/patterns/readiness-checklist.html +12 -0
  53. package/dist/patterns/record-header.html +17 -0
  54. package/dist/patterns/rule-builder.html +37 -0
  55. package/dist/patterns/search.html +8 -0
  56. package/dist/patterns/segmented-control.html +13 -0
  57. package/dist/patterns/select.html +12 -0
  58. package/dist/patterns/semantic-differential.html +23 -0
  59. package/dist/patterns/skeleton.html +7 -0
  60. package/dist/patterns/slider.html +11 -0
  61. package/dist/patterns/special-choice.html +15 -0
  62. package/dist/patterns/status-lozenge.html +6 -0
  63. package/dist/patterns/survey-progress.html +8 -0
  64. package/dist/patterns/switch.html +14 -0
  65. package/dist/patterns/symbol-rating.html +31 -0
  66. package/dist/patterns/tabs.html +11 -0
  67. package/dist/patterns/timeline.html +19 -0
  68. package/dist/patterns/toast.html +10 -0
  69. package/dist/patterns/understanding.html +32 -0
  70. package/dist/patterns/validation-message.html +4 -0
  71. package/dist/patterns/validation-summary.html +10 -0
  72. package/dist/patterns/wizard.html +19 -0
  73. package/dist/patterns/work-queue.html +20 -0
  74. package/dist/skins.css +29 -0
  75. package/dist/tokens.css +99 -0
  76. package/docs/BRANDING.md +148 -0
  77. package/package.json +60 -0
  78. package/patterns/alert.html +8 -0
  79. package/patterns/allocation.html +24 -0
  80. package/patterns/assessment.manifest.md +93 -0
  81. package/patterns/best-worst.html +21 -0
  82. package/patterns/binary-choice.html +15 -0
  83. package/patterns/checkbox.html +13 -0
  84. package/patterns/choice-group.html +27 -0
  85. package/patterns/collection-toolbar.html +22 -0
  86. package/patterns/combobox.html +13 -0
  87. package/patterns/command-palette.html +14 -0
  88. package/patterns/composer.html +19 -0
  89. package/patterns/composer.manifest.md +27 -0
  90. package/patterns/conflict-review.html +17 -0
  91. package/patterns/conversation.html +23 -0
  92. package/patterns/conversation.manifest.md +21 -0
  93. package/patterns/dashboard-grid.html +5 -0
  94. package/patterns/data-grid.html +30 -0
  95. package/patterns/date-range.html +13 -0
  96. package/patterns/dialog.html +15 -0
  97. package/patterns/diff-viewer.html +22 -0
  98. package/patterns/disclosure.html +6 -0
  99. package/patterns/empty-state.html +6 -0
  100. package/patterns/file-upload.html +19 -0
  101. package/patterns/flyout.html +72 -0
  102. package/patterns/flyout.manifest.md +43 -0
  103. package/patterns/hierarchical-choice.html +25 -0
  104. package/patterns/hierarchical-multi-choice.html +27 -0
  105. package/patterns/image-choice.html +25 -0
  106. package/patterns/manifest.md +46 -0
  107. package/patterns/master-detail.html +16 -0
  108. package/patterns/matrix-single.html +26 -0
  109. package/patterns/menu.html +8 -0
  110. package/patterns/metric-card.html +6 -0
  111. package/patterns/mobile-action-bar.html +4 -0
  112. package/patterns/multi-choice.html +23 -0
  113. package/patterns/numeric-stepper.html +5 -0
  114. package/patterns/obligation-panel.html +36 -0
  115. package/patterns/operation-status.html +12 -0
  116. package/patterns/ordinal-scale.html +42 -0
  117. package/patterns/pagination.html +12 -0
  118. package/patterns/pairwise-choice.html +21 -0
  119. package/patterns/popover.html +6 -0
  120. package/patterns/preview-surface.html +14 -0
  121. package/patterns/provenance-trail.html +9 -0
  122. package/patterns/question.html +13 -0
  123. package/patterns/range-entry.html +18 -0
  124. package/patterns/ranking.html +32 -0
  125. package/patterns/readiness-checklist.html +12 -0
  126. package/patterns/record-header.html +17 -0
  127. package/patterns/rule-builder.html +37 -0
  128. package/patterns/search.html +8 -0
  129. package/patterns/segmented-control.html +13 -0
  130. package/patterns/select.html +12 -0
  131. package/patterns/semantic-differential.html +23 -0
  132. package/patterns/skeleton.html +7 -0
  133. package/patterns/slider.html +11 -0
  134. package/patterns/special-choice.html +15 -0
  135. package/patterns/status-lozenge.html +6 -0
  136. package/patterns/survey-progress.html +8 -0
  137. package/patterns/switch.html +14 -0
  138. package/patterns/symbol-rating.html +31 -0
  139. package/patterns/tabs.html +11 -0
  140. package/patterns/timeline.html +19 -0
  141. package/patterns/toast.html +10 -0
  142. package/patterns/understanding.html +32 -0
  143. package/patterns/understanding.manifest.md +26 -0
  144. package/patterns/validation-message.html +4 -0
  145. package/patterns/validation-summary.html +10 -0
  146. package/patterns/wizard.html +19 -0
  147. package/patterns/work-queue.html +20 -0
  148. package/schemas/brand-manifest.schema.json +152 -0
@@ -0,0 +1,22 @@
1
+ <section class="ef-collection-toolbar" aria-label="Collection controls">
2
+ <form class="ef-search ef-collection-toolbar__search" role="search">
3
+ <label class="ef-search__label" for="collection-search">Search records</label>
4
+ <input id="collection-search" type="search" placeholder="Search">
5
+ </form>
6
+ <div class="ef-collection-toolbar__controls">
7
+ <details class="ef-collection-toolbar__filters">
8
+ <summary>Filters <span class="ef-status-lozenge">2 active</span></summary>
9
+ <div class="ef-collection-toolbar__filter-panel">
10
+ <label>Status <select><option>Any status</option><option>Needs attention</option><option>Complete</option></select></label>
11
+ <label>Owner <select><option>Anyone</option><option>Me</option></select></label>
12
+ </div>
13
+ </details>
14
+ <label class="ef-collection-toolbar__sort">Sort
15
+ <select><option>Most recent</option><option>Oldest</option><option>Name</option></select>
16
+ </label>
17
+ <label class="ef-collection-toolbar__view">Saved view
18
+ <select><option>All records</option><option>Needs my attention</option></select>
19
+ </label>
20
+ </div>
21
+ <p class="ef-collection-toolbar__count" role="status">24 records</p>
22
+ </section>
@@ -0,0 +1,13 @@
1
+ <div class="ef-combobox">
2
+ <label for="combo-project">Project</label>
3
+ <div class="ef-combobox__control">
4
+ <input id="combo-project" name="project" list="project-options" autocomplete="off" placeholder="Search projects">
5
+ <span class="ef-combobox__indicator" aria-hidden="true">⌄</span>
6
+ </div>
7
+ <datalist id="project-options">
8
+ <option value="Architecture assessment"></option>
9
+ <option value="Signal research"></option>
10
+ <option value="Platform modernization"></option>
11
+ </datalist>
12
+ <p class="ef-combobox__help">Type to filter available projects.</p>
13
+ </div>
@@ -0,0 +1,14 @@
1
+ <dialog class="ef-command-palette" open aria-labelledby="command-title" data-ef-motion-weight="heavy">
2
+ <header class="ef-command-palette__header">
3
+ <h3 id="command-title">Commands</h3>
4
+ <kbd>Esc</kbd>
5
+ </header>
6
+ <label class="ef-visually-hidden" for="command-search">Find a command</label>
7
+ <input id="command-search" type="search" placeholder="Type a command or record">
8
+ <div class="ef-command-palette__group">
9
+ <h4>Suggested</h4>
10
+ <button type="button"><span>Create invoice</span><kbd>⌘ I</kbd></button>
11
+ <button type="button"><span>Show items needing attention</span></button>
12
+ <button type="button" disabled><span>Publish report</span><small>Unavailable until validation passes</small></button>
13
+ </div>
14
+ </dialog>
@@ -0,0 +1,19 @@
1
+ <section class="ef-composer" aria-labelledby="composer-title">
2
+ <div class="ef-composer__context">
3
+ <span class="ef-component-kicker">Capture</span>
4
+ <h2 id="composer-title">What do you want this record to know?</h2>
5
+ <p id="composer-help">Type, dictate, paste, or attach information in your own words. The application decides how it is interpreted and whether follow-up is required.</p>
6
+ </div>
7
+ <label class="ef-composer__field">
8
+ <span class="ef-sr-only">Tell the application what happened</span>
9
+ <textarea rows="4" aria-describedby="composer-help" placeholder="Tell me what happened…"></textarea>
10
+ </label>
11
+ <div class="ef-composer__actions">
12
+ <div class="ef-composer__input-actions" aria-label="Additional input methods">
13
+ <button type="button">Attach</button>
14
+ <button type="button">Dictate</button>
15
+ </div>
16
+ <button type="submit" class="ef-composer__submit">Continue</button>
17
+ </div>
18
+ <p class="ef-composer__status" role="status">Nothing is added to the record until the application confirms the transition.</p>
19
+ </section>
@@ -0,0 +1,27 @@
1
+ # Feature Manifest — composer pattern
2
+
3
+ ## Purpose
4
+
5
+ Provide a calm, application-neutral natural-language composition surface for typing, dictation, paste, and attachment affordances without embedding AI, parsing, or domain transition behavior in Forma.
6
+
7
+ ## Ownership
8
+
9
+ - State: application/Limen; native textarea validity remains browser-owned.
10
+ - Transitions / commands / messages: application/Limen.
11
+ - Invariants and guards: semantic field labeling, visible context, reachable input methods, status region, responsive actions.
12
+ - Capabilities / authority: none. The composer never decides what may be committed.
13
+ - Effects: application-owned.
14
+
15
+ ## Interfaces
16
+
17
+ - Inbound: context title/help, text value, available input actions, submit label, status.
18
+ - Outbound: native textarea/input/button events.
19
+
20
+ ## Modification boundaries
21
+
22
+ Keep interpretation, agent behavior, recording, upload, persistence, permissions, and legal transitions outside Forma.
23
+
24
+ ## Maintenance
25
+
26
+ - Owner: Echelon Foundry design system
27
+ - Introduced for cross-application agent/capture workflows: 2026-09-23
@@ -0,0 +1,17 @@
1
+ <article class="ef-conflict-review" aria-labelledby="conflict-title">
2
+ <header class="ef-conflict-review__header">
3
+ <span class="ef-status-lozenge" data-state="attention">Conflict</span>
4
+ <h3 id="conflict-title">This record changed while you were reviewing it</h3>
5
+ <p>No changes were applied. Review the current version before choosing a legal recovery action.</p>
6
+ </header>
7
+ <div class="ef-diff-viewer">
8
+ <div class="ef-diff-viewer__grid">
9
+ <section class="ef-diff-viewer__side"><h4>You reviewed</h4><p>Outstanding balance: $5,000</p></section>
10
+ <section class="ef-diff-viewer__side"><h4>Current</h4><p>Outstanding balance: $2,500</p></section>
11
+ </div>
12
+ </div>
13
+ <footer class="ef-conflict-review__actions">
14
+ <button type="button">Reload current</button>
15
+ <button type="button">Cancel</button>
16
+ </footer>
17
+ </article>
@@ -0,0 +1,23 @@
1
+ <section class="ef-conversation" aria-labelledby="conversation-title">
2
+ <header class="ef-conversation__header">
3
+ <span class="ef-component-kicker">Conversation</span>
4
+ <h2 id="conversation-title">Record assistant</h2>
5
+ </header>
6
+ <ol class="ef-conversation__turns">
7
+ <li class="ef-turn" data-ef-speaker="user">
8
+ <p class="ef-turn__speaker">You</p>
9
+ <div class="ef-turn__content">
10
+ <p>Dad saw Dr. Smith yesterday. He increased the medication to 40 mg because the ankle swelling returned.</p>
11
+ </div>
12
+ </li>
13
+ <li class="ef-turn" data-ef-speaker="assistant">
14
+ <p class="ef-turn__speaker">Record assistant</p>
15
+ <div class="ef-turn__content">
16
+ <p>I found a medication change, a returning symptom, and a visit. One detail may need clarification before the medication change can be recorded precisely.</p>
17
+ </div>
18
+ <div class="ef-turn__actions">
19
+ <button type="button">Review understanding</button>
20
+ </div>
21
+ </li>
22
+ </ol>
23
+ </section>
@@ -0,0 +1,21 @@
1
+ # Feature Manifest — conversation pattern
2
+
3
+ ## Purpose
4
+
5
+ Render inspectable user/application turns without assuming consumer-chat bubble semantics or granting generated text special authority.
6
+
7
+ ## Ownership
8
+
9
+ - State and turn contents: application.
10
+ - Behavior: application/Limen.
11
+ - Semantics: ordered conversation history, explicit speaker labels, optional actions.
12
+ - Capabilities / authority: none.
13
+
14
+ ## Modification boundaries
15
+
16
+ Do not encode model confidence, truth, clinical authority, or transition legality from speaker position, color, or visual treatment.
17
+
18
+ ## Maintenance
19
+
20
+ - Owner: Echelon Foundry design system
21
+ - Introduced: 2026-09-23
@@ -0,0 +1,5 @@
1
+ <section class="ef-dashboard-grid" aria-label="Operational dashboard">
2
+ <article class="ef-metric-card"><div class="ef-metric-card__label">Needs attention</div><div class="ef-metric-card__value">7</div><p>Items requiring action.</p></article>
3
+ <article class="ef-metric-card"><div class="ef-metric-card__label">Open work</div><div class="ef-metric-card__value">18</div><p>Currently active records.</p></article>
4
+ <article class="ef-metric-card"><div class="ef-metric-card__label">Completed</div><div class="ef-metric-card__value">42</div><p>Completed this month.</p></article>
5
+ </section>
@@ -0,0 +1,30 @@
1
+ <div class="ef-data-grid" role="region" tabindex="0" aria-label="Invoice records">
2
+ <table>
3
+ <caption class="ef-visually-hidden">Invoice records</caption>
4
+ <thead>
5
+ <tr>
6
+ <th scope="col" aria-sort="ascending"><button type="button">Invoice</button></th>
7
+ <th scope="col"><button type="button">Customer</button></th>
8
+ <th scope="col"><button type="button">Due</button></th>
9
+ <th scope="col"><button type="button">Status</button></th>
10
+ <th scope="col"><span class="ef-visually-hidden">Actions</span></th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <tr>
15
+ <td data-label="Invoice">INV-1042</td>
16
+ <td data-label="Customer">Acme Manufacturing</td>
17
+ <td data-label="Due">Oct 4, 2026</td>
18
+ <td data-label="Status"><span class="ef-status-lozenge" data-state="attention">Overdue</span></td>
19
+ <td data-label="Actions"><button type="button">Open</button></td>
20
+ </tr>
21
+ <tr>
22
+ <td data-label="Invoice">INV-1043</td>
23
+ <td data-label="Customer">Northstar Labs</td>
24
+ <td data-label="Due">Oct 18, 2026</td>
25
+ <td data-label="Status"><span class="ef-status-lozenge" data-state="ok">Current</span></td>
26
+ <td data-label="Actions"><button type="button">Open</button></td>
27
+ </tr>
28
+ </tbody>
29
+ </table>
30
+ </div>
@@ -0,0 +1,13 @@
1
+ <fieldset class="ef-date-range">
2
+ <legend>Date range</legend>
3
+ <div class="ef-date-range__fields">
4
+ <label>From <input type="date" name="from"></label>
5
+ <span class="ef-date-range__separator" aria-hidden="true">→</span>
6
+ <label>To <input type="date" name="to"></label>
7
+ </div>
8
+ <div class="ef-date-range__presets" aria-label="Common ranges">
9
+ <button type="button">This month</button>
10
+ <button type="button">Last 30 days</button>
11
+ <button type="button">Year to date</button>
12
+ </div>
13
+ </fieldset>
@@ -0,0 +1,15 @@
1
+ <button type="button" commandfor="example-dialog" command="show-modal">Open modal</button>
2
+ <dialog
3
+ class="ef-dialog"
4
+ id="example-dialog"
5
+ data-ef-motion-weight="heavy"
6
+ aria-labelledby="example-dialog-title"
7
+ aria-describedby="example-dialog-description">
8
+ <div class="ef-dialog__body">
9
+ <h2 id="example-dialog-title">Confirm action</h2>
10
+ <p id="example-dialog-description">The browser owns modal focus, inertness, Escape behavior, and focus restoration.</p>
11
+ </div>
12
+ <div class="ef-dialog__actions">
13
+ <button type="button" commandfor="example-dialog" command="close">Cancel</button>
14
+ </div>
15
+ </dialog>
@@ -0,0 +1,22 @@
1
+ <section class="ef-diff-viewer" aria-labelledby="diff-title">
2
+ <header class="ef-diff-viewer__header">
3
+ <h3 id="diff-title">Version comparison</h3>
4
+ <p>2 fields changed</p>
5
+ </header>
6
+ <div class="ef-diff-viewer__grid">
7
+ <section class="ef-diff-viewer__side" aria-label="Previous version">
8
+ <h4>Before</h4>
9
+ <dl>
10
+ <div class="ef-diff-row" data-change="changed"><dt>Status</dt><dd>Draft</dd></div>
11
+ <div class="ef-diff-row"><dt>Owner</dt><dd>Operations</dd></div>
12
+ </dl>
13
+ </section>
14
+ <section class="ef-diff-viewer__side" aria-label="Current version">
15
+ <h4>After</h4>
16
+ <dl>
17
+ <div class="ef-diff-row" data-change="changed"><dt>Status</dt><dd>Ready for review</dd></div>
18
+ <div class="ef-diff-row"><dt>Owner</dt><dd>Operations</dd></div>
19
+ </dl>
20
+ </section>
21
+ </div>
22
+ </section>
@@ -0,0 +1,6 @@
1
+ <details class="ef-disclosure" data-ef-motion-weight="light">
2
+ <summary>Advanced options</summary>
3
+ <div class="ef-disclosure__content">
4
+ <p>Additional controls or explanatory content go here.</p>
5
+ </div>
6
+ </details>
@@ -0,0 +1,6 @@
1
+ <section class="ef-empty-state" aria-labelledby="empty-title">
2
+ <div class="ef-empty-state__symbol" aria-hidden="true">□</div>
3
+ <h3 id="empty-title">No results match these filters</h3>
4
+ <p>Clear one or more filters or broaden the search to see records.</p>
5
+ <button type="button">Clear filters</button>
6
+ </section>
@@ -0,0 +1,19 @@
1
+ <section class="ef-file-upload" aria-labelledby="upload-title">
2
+ <div class="ef-file-upload__drop">
3
+ <h3 id="upload-title">Add evidence files</h3>
4
+ <p>Choose files. Drag and drop may be provided as an optional enhancement.</p>
5
+ <label class="ef-button">Choose files <input type="file" multiple></label>
6
+ </div>
7
+ <ul class="ef-file-upload__queue">
8
+ <li>
9
+ <div><strong>survey-results.csv</strong><small>1.8 MB</small></div>
10
+ <progress value="100" max="100" aria-label="survey-results.csv upload progress">100%</progress>
11
+ <span class="ef-status-lozenge" data-state="ok">Uploaded</span>
12
+ </li>
13
+ <li>
14
+ <div><strong>evidence.pdf</strong><small>4.2 MB</small></div>
15
+ <progress value="64" max="100" aria-label="evidence.pdf upload progress">64%</progress>
16
+ <button type="button">Cancel</button>
17
+ </li>
18
+ </ul>
19
+ </section>
@@ -0,0 +1,72 @@
1
+ <button type="button" commandfor="left-flyout" command="show-modal">Open left flyout</button>
2
+ <dialog
3
+ class="ef-flyout"
4
+ id="left-flyout"
5
+ data-ef-side="left"
6
+ data-ef-motion-weight="heavy"
7
+ aria-labelledby="left-flyout-title"
8
+ aria-describedby="left-flyout-description">
9
+ <div class="ef-flyout__surface">
10
+ <header class="ef-flyout__header">
11
+ <div>
12
+ <p class="ef-component-kicker">Filters</p>
13
+ <h2 id="left-flyout-title">Refine results</h2>
14
+ </div>
15
+ <button
16
+ class="ef-flyout__close"
17
+ type="button"
18
+ commandfor="left-flyout"
19
+ command="close"
20
+ aria-label="Close left flyout">Close</button>
21
+ </header>
22
+ <div class="ef-flyout__body">
23
+ <p id="left-flyout-description">A left-edge modal surface for contextual controls or navigation.</p>
24
+ <label class="ef-checkbox" data-ef-motion-weight="standard">
25
+ <input class="ef-checkbox__input" type="checkbox" name="open-only" value="yes">
26
+ <span class="ef-checkbox__box" aria-hidden="true"></span>
27
+ <span class="ef-checkbox__text">
28
+ <span class="ef-checkbox__label">Open items only</span>
29
+ </span>
30
+ </label>
31
+ </div>
32
+ <footer class="ef-flyout__actions">
33
+ <button type="button" commandfor="left-flyout" command="close">Apply</button>
34
+ </footer>
35
+ </div>
36
+ </dialog>
37
+
38
+ <button type="button" commandfor="right-flyout" command="show-modal">Open right flyout</button>
39
+ <dialog
40
+ class="ef-flyout"
41
+ id="right-flyout"
42
+ data-ef-side="right"
43
+ data-ef-motion-weight="heavy"
44
+ aria-labelledby="right-flyout-title"
45
+ aria-describedby="right-flyout-description">
46
+ <div class="ef-flyout__surface">
47
+ <header class="ef-flyout__header">
48
+ <div>
49
+ <p class="ef-component-kicker">Details</p>
50
+ <h2 id="right-flyout-title">Record context</h2>
51
+ </div>
52
+ <button
53
+ class="ef-flyout__close"
54
+ type="button"
55
+ commandfor="right-flyout"
56
+ command="close"
57
+ aria-label="Close right flyout">Close</button>
58
+ </header>
59
+ <div class="ef-flyout__body">
60
+ <p id="right-flyout-description">A right-edge modal surface for detail, inspection, or contextual work.</p>
61
+ <dl>
62
+ <dt>Status</dt>
63
+ <dd>Needs review</dd>
64
+ <dt>Owner</dt>
65
+ <dd>Application supplied</dd>
66
+ </dl>
67
+ </div>
68
+ <footer class="ef-flyout__actions">
69
+ <button type="button" commandfor="right-flyout" command="close">Done</button>
70
+ </footer>
71
+ </div>
72
+ </dialog>
@@ -0,0 +1,43 @@
1
+ # Feature Manifest — flyout pattern
2
+
3
+ ## Purpose
4
+
5
+ Provide left- and right-edge modal surfaces for contextual navigation, filters, inspection, and bounded tasks while preserving native dialog semantics and Forma's zero-runtime boundary.
6
+
7
+ ## Ownership
8
+
9
+ - State: native `dialog.open` / top-layer state
10
+ - Transitions / commands / messages: browser-native dialog commands and Escape behavior
11
+ - Invariants and guards: native modal focus, document inertness, accessible labeling, side-specific presentation
12
+ - Capabilities / authority: none
13
+ - Effects: native focus placement/restoration and dialog close events
14
+
15
+ ## Interfaces
16
+
17
+ - Inbound: semantic dialog content, `data-ef-side="left|right"`, optional `data-ef-motion-weight="light|standard|heavy"`
18
+ - Outbound: native dialog open/close state and events
19
+
20
+ ## Motion
21
+
22
+ - Entry travels from the occupied edge using Forma's shared physics-derived inertia model.
23
+ - Exit is shorter and uses the damped response rather than spring overshoot.
24
+ - The backdrop coordinates with the temporary surface without becoming semantic authority.
25
+ - Reduced motion removes the large edge translation and scale while preserving an immediate, clear state change.
26
+ - Direct swipe/drag manipulation is not implemented by Forma; if required, Limen/application behavior owns it.
27
+
28
+ ## Tests and verification
29
+
30
+ - `tests/browser/overlay-motion.spec.mjs`
31
+ - `tests/browser/accessibility.spec.mjs`
32
+ - Repository-wide mobile, zero-runtime, package, browser, and site checks
33
+
34
+ ## Modification boundaries
35
+
36
+ - Keep modal flyouts on native `dialog` unless a documented application requirement cannot be met.
37
+ - Nonmodal persistent drawers, resize/drag behavior, and swipe-to-close belong to Limen/application code.
38
+ - Application/Ordo owns domain legality and the actions presented in the flyout.
39
+
40
+ ## Maintenance
41
+
42
+ - Owner: Echelon Foundry design system
43
+ - Last checked against implementation: 2026-09-23
@@ -0,0 +1,25 @@
1
+ <fieldset class="ef-hierarchy">
2
+ <legend class="ef-hierarchy__legend">Choose the affected service.</legend>
3
+ <p class="ef-field__description">Published hierarchy data is immutable. Limen coordinates expansion/cascading behavior when needed.</p>
4
+
5
+ <ul class="ef-hierarchy__tree">
6
+ <li>
7
+ <details open>
8
+ <summary>Platform</summary>
9
+ <ul>
10
+ <li><label><input type="radio" name="service" value="identity"> Identity</label></li>
11
+ <li><label><input type="radio" name="service" value="billing"> Billing</label></li>
12
+ </ul>
13
+ </details>
14
+ </li>
15
+ <li>
16
+ <details>
17
+ <summary>Data</summary>
18
+ <ul>
19
+ <li><label><input type="radio" name="service" value="warehouse"> Warehouse</label></li>
20
+ <li><label><input type="radio" name="service" value="analytics"> Analytics</label></li>
21
+ </ul>
22
+ </details>
23
+ </li>
24
+ </ul>
25
+ </fieldset>
@@ -0,0 +1,27 @@
1
+ <fieldset class="ef-hierarchy">
2
+ <legend class="ef-hierarchy__legend">Choose affected services.</legend>
3
+ <p class="ef-field__description">Parent/descendant selection semantics are supplied by the application. The design system does not infer whether selecting a parent includes its children.</p>
4
+
5
+ <ul class="ef-hierarchy__tree">
6
+ <li>
7
+ <details open>
8
+ <summary>Platform</summary>
9
+ <ul>
10
+ <li><label><input type="checkbox" name="services" value="identity"> Identity</label></li>
11
+ <li><label><input type="checkbox" name="services" value="billing"> Billing</label></li>
12
+ </ul>
13
+ </details>
14
+ </li>
15
+ <li>
16
+ <details>
17
+ <summary>Data</summary>
18
+ <ul>
19
+ <li><label><input type="checkbox" name="services" value="warehouse"> Warehouse</label></li>
20
+ <li><label><input type="checkbox" name="services" value="analytics"> Analytics</label></li>
21
+ </ul>
22
+ </details>
23
+ </li>
24
+ </ul>
25
+
26
+ <p class="ef-selection-status" data-ef-state="valid" aria-live="polite">2 services selected</p>
27
+ </fieldset>
@@ -0,0 +1,25 @@
1
+ <fieldset class="ef-choice-group">
2
+ <legend class="ef-choice-group__legend">Which layout is easiest to scan?</legend>
3
+
4
+ <label class="ef-choice ef-choice--media">
5
+ <input type="radio" name="layout-choice" value="compact" required>
6
+ <span class="ef-choice__media">
7
+ <img src="/path/to/compact-layout.png" alt="">
8
+ </span>
9
+ <span class="ef-choice__content">
10
+ <strong>Compact layout</strong>
11
+ <span>Dense rows with minimal whitespace.</span>
12
+ </span>
13
+ </label>
14
+
15
+ <label class="ef-choice ef-choice--media">
16
+ <input type="radio" name="layout-choice" value="spacious">
17
+ <span class="ef-choice__media">
18
+ <img src="/path/to/spacious-layout.png" alt="">
19
+ </span>
20
+ <span class="ef-choice__content">
21
+ <strong>Spacious layout</strong>
22
+ <span>More separation and larger grouping regions.</span>
23
+ </span>
24
+ </label>
25
+ </fieldset>
@@ -0,0 +1,46 @@
1
+ # Feature Manifest — HTML patterns
2
+
3
+ ## Purpose
4
+
5
+ Own the canonical semantic HTML structures consumed by Echelon applications. Patterns contain no JavaScript and no hidden behavior.
6
+
7
+ ## Ownership
8
+
9
+ - State, including presentation state: native HTML states such as checked, open, disabled, required, invalid, and popover-open
10
+ - Transitions / commands / messages: browser-native behavior only; application behavior belongs to Limen/application code
11
+ - Invariants and guards: semantic markup, labels, form association, accessible names, documented class structure
12
+ - Capabilities / authority: none — patterns cannot decide domain legality
13
+ - Important effects and effect contracts: native DOM events and native browser state
14
+
15
+ ## Interfaces
16
+
17
+ - Inbound: semantic HTML attributes, application-rendered state, design tokens
18
+ - Outbound: native DOM events, form values, focus behavior, CSS-selectable native state
19
+
20
+ ## Tests and verification
21
+
22
+ - Local behavior tests: `tests/browser/**`
23
+ - Boundary/contract tests: `tests/zero-runtime.test.mjs`
24
+ - Integration/live verification: Chromium, Firefox, and WebKit
25
+
26
+ ## Dependencies
27
+
28
+ - Allowed direct dependencies: semantic HTML, generated tokens CSS, Echelon CSS
29
+ - Required composition context: consuming application supplies behavior beyond native HTML
30
+
31
+ ## Modification boundaries
32
+
33
+ - Normal: `patterns/**`, `src/styles/components.css`, associated tests
34
+ - Escalation required: adding script, custom-element registration, hidden runtime behavior, or changing required markup structure
35
+
36
+ ## Local agent instructions
37
+
38
+ - Documentation and consumer examples wrap the canonical pattern in `<ef-{slug} class="ef-component-tag">`.
39
+ - The `ef-*` wrapper is inert and must never replace the native semantic element inside it or be registered with `customElements.define()`.
40
+ - Modal flyouts stay on native `dialog`; gesture-driven or persistent drawer behavior belongs to Limen/application code.
41
+
42
+ ## Maintenance
43
+
44
+ - Owner: Echelon Foundry design system
45
+ - Last checked against implementation: 2026-09-23
46
+ - Known gaps: advanced behavioral patterns require separate Limen contracts
@@ -0,0 +1,16 @@
1
+ <section class="ef-master-detail" aria-label="Record workspace">
2
+ <nav class="ef-master-detail__master" aria-label="Records">
3
+ <a href="#record-1" aria-current="page"><strong>INV-1042</strong><span>Acme Manufacturing</span></a>
4
+ <a href="#record-2"><strong>INV-1043</strong><span>Northstar Labs</span></a>
5
+ <a href="#record-3"><strong>INV-1044</strong><span>Atlas Works</span></a>
6
+ </nav>
7
+ <article class="ef-master-detail__detail" id="record-1">
8
+ <span class="ef-status-lozenge" data-state="attention">Overdue</span>
9
+ <h3>INV-1042</h3>
10
+ <dl class="ef-key-value-list">
11
+ <div><dt>Customer</dt><dd>Acme Manufacturing</dd></div>
12
+ <div><dt>Outstanding</dt><dd>$5,000</dd></div>
13
+ <div><dt>Due</dt><dd>October 4, 2026</dd></div>
14
+ </dl>
15
+ </article>
16
+ </section>
@@ -0,0 +1,26 @@
1
+ <fieldset class="ef-matrix">
2
+ <legend class="ef-matrix__legend">Rate each practice.</legend>
3
+ <p class="ef-field__description">Each row is an independent single-choice question. On narrow screens rows stack into ordinary controls.</p>
4
+
5
+ <div class="ef-matrix__rows">
6
+ <fieldset class="ef-matrix__row">
7
+ <legend>Automated testing</legend>
8
+ <div class="ef-matrix__choices">
9
+ <label><input type="radio" name="testing-maturity" value="1" required><span>Initial</span></label>
10
+ <label><input type="radio" name="testing-maturity" value="2"><span>Developing</span></label>
11
+ <label><input type="radio" name="testing-maturity" value="3"><span>Established</span></label>
12
+ <label><input type="radio" name="testing-maturity" value="4"><span>Optimized</span></label>
13
+ </div>
14
+ </fieldset>
15
+
16
+ <fieldset class="ef-matrix__row">
17
+ <legend>Deployment automation</legend>
18
+ <div class="ef-matrix__choices">
19
+ <label><input type="radio" name="deployment-maturity" value="1" required><span>Initial</span></label>
20
+ <label><input type="radio" name="deployment-maturity" value="2"><span>Developing</span></label>
21
+ <label><input type="radio" name="deployment-maturity" value="3"><span>Established</span></label>
22
+ <label><input type="radio" name="deployment-maturity" value="4"><span>Optimized</span></label>
23
+ </div>
24
+ </fieldset>
25
+ </div>
26
+ </fieldset>
@@ -0,0 +1,8 @@
1
+ <button type="button" popovertarget="record-actions">More actions</button>
2
+ <div class="ef-menu" id="record-actions" popover data-ef-motion-weight="light">
3
+ <ul class="ef-menu__list">
4
+ <li><button type="button">Duplicate record</button></li>
5
+ <li><button type="button">Export record</button></li>
6
+ <li><button type="button">Archive record</button></li>
7
+ </ul>
8
+ </div>
@@ -0,0 +1,6 @@
1
+ <article class="ef-metric-card">
2
+ <div class="ef-metric-card__label">Outstanding AR</div>
3
+ <div class="ef-metric-card__value">$42,500</div>
4
+ <div class="ef-metric-card__context"><span class="ef-status-lozenge" data-state="attention">$12,500 overdue</span></div>
5
+ <a href="#details">View receivables</a>
6
+ </article>
@@ -0,0 +1,4 @@
1
+ <nav class="ef-mobile-action-bar" aria-label="Record actions">
2
+ <button type="button" class="ef-mobile-action-bar__secondary">Cancel</button>
3
+ <button type="button" class="ef-mobile-action-bar__primary">Save changes</button>
4
+ </nav>