@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.
- package/README.md +82 -0
- package/dist/all.css +3461 -0
- package/dist/assessment.css +1123 -0
- package/dist/brands/echelon.css +91 -0
- package/dist/brands/example-harbor.css +91 -0
- package/dist/brands/index.json +17 -0
- package/dist/build-metrics.json +152 -0
- package/dist/components.css +2123 -0
- package/dist/foundations.css +113 -0
- package/dist/patterns/alert.html +8 -0
- package/dist/patterns/allocation.html +24 -0
- package/dist/patterns/best-worst.html +21 -0
- package/dist/patterns/binary-choice.html +15 -0
- package/dist/patterns/checkbox.html +13 -0
- package/dist/patterns/choice-group.html +27 -0
- package/dist/patterns/collection-toolbar.html +22 -0
- package/dist/patterns/combobox.html +13 -0
- package/dist/patterns/command-palette.html +14 -0
- package/dist/patterns/composer.html +19 -0
- package/dist/patterns/conflict-review.html +17 -0
- package/dist/patterns/conversation.html +23 -0
- package/dist/patterns/dashboard-grid.html +5 -0
- package/dist/patterns/data-grid.html +30 -0
- package/dist/patterns/date-range.html +13 -0
- package/dist/patterns/dialog.html +15 -0
- package/dist/patterns/diff-viewer.html +22 -0
- package/dist/patterns/disclosure.html +6 -0
- package/dist/patterns/empty-state.html +6 -0
- package/dist/patterns/file-upload.html +19 -0
- package/dist/patterns/flyout.html +72 -0
- package/dist/patterns/hierarchical-choice.html +25 -0
- package/dist/patterns/hierarchical-multi-choice.html +27 -0
- package/dist/patterns/image-choice.html +25 -0
- package/dist/patterns/master-detail.html +16 -0
- package/dist/patterns/matrix-single.html +26 -0
- package/dist/patterns/menu.html +8 -0
- package/dist/patterns/metric-card.html +6 -0
- package/dist/patterns/mobile-action-bar.html +4 -0
- package/dist/patterns/multi-choice.html +23 -0
- package/dist/patterns/numeric-stepper.html +5 -0
- package/dist/patterns/obligation-panel.html +36 -0
- package/dist/patterns/operation-status.html +12 -0
- package/dist/patterns/ordinal-scale.html +42 -0
- package/dist/patterns/pagination.html +12 -0
- package/dist/patterns/pairwise-choice.html +21 -0
- package/dist/patterns/popover.html +6 -0
- package/dist/patterns/preview-surface.html +14 -0
- package/dist/patterns/provenance-trail.html +9 -0
- package/dist/patterns/question.html +13 -0
- package/dist/patterns/range-entry.html +18 -0
- package/dist/patterns/ranking.html +32 -0
- package/dist/patterns/readiness-checklist.html +12 -0
- package/dist/patterns/record-header.html +17 -0
- package/dist/patterns/rule-builder.html +37 -0
- package/dist/patterns/search.html +8 -0
- package/dist/patterns/segmented-control.html +13 -0
- package/dist/patterns/select.html +12 -0
- package/dist/patterns/semantic-differential.html +23 -0
- package/dist/patterns/skeleton.html +7 -0
- package/dist/patterns/slider.html +11 -0
- package/dist/patterns/special-choice.html +15 -0
- package/dist/patterns/status-lozenge.html +6 -0
- package/dist/patterns/survey-progress.html +8 -0
- package/dist/patterns/switch.html +14 -0
- package/dist/patterns/symbol-rating.html +31 -0
- package/dist/patterns/tabs.html +11 -0
- package/dist/patterns/timeline.html +19 -0
- package/dist/patterns/toast.html +10 -0
- package/dist/patterns/understanding.html +32 -0
- package/dist/patterns/validation-message.html +4 -0
- package/dist/patterns/validation-summary.html +10 -0
- package/dist/patterns/wizard.html +19 -0
- package/dist/patterns/work-queue.html +20 -0
- package/dist/skins.css +29 -0
- package/dist/tokens.css +99 -0
- package/docs/BRANDING.md +148 -0
- package/package.json +60 -0
- package/patterns/alert.html +8 -0
- package/patterns/allocation.html +24 -0
- package/patterns/assessment.manifest.md +93 -0
- package/patterns/best-worst.html +21 -0
- package/patterns/binary-choice.html +15 -0
- package/patterns/checkbox.html +13 -0
- package/patterns/choice-group.html +27 -0
- package/patterns/collection-toolbar.html +22 -0
- package/patterns/combobox.html +13 -0
- package/patterns/command-palette.html +14 -0
- package/patterns/composer.html +19 -0
- package/patterns/composer.manifest.md +27 -0
- package/patterns/conflict-review.html +17 -0
- package/patterns/conversation.html +23 -0
- package/patterns/conversation.manifest.md +21 -0
- package/patterns/dashboard-grid.html +5 -0
- package/patterns/data-grid.html +30 -0
- package/patterns/date-range.html +13 -0
- package/patterns/dialog.html +15 -0
- package/patterns/diff-viewer.html +22 -0
- package/patterns/disclosure.html +6 -0
- package/patterns/empty-state.html +6 -0
- package/patterns/file-upload.html +19 -0
- package/patterns/flyout.html +72 -0
- package/patterns/flyout.manifest.md +43 -0
- package/patterns/hierarchical-choice.html +25 -0
- package/patterns/hierarchical-multi-choice.html +27 -0
- package/patterns/image-choice.html +25 -0
- package/patterns/manifest.md +46 -0
- package/patterns/master-detail.html +16 -0
- package/patterns/matrix-single.html +26 -0
- package/patterns/menu.html +8 -0
- package/patterns/metric-card.html +6 -0
- package/patterns/mobile-action-bar.html +4 -0
- package/patterns/multi-choice.html +23 -0
- package/patterns/numeric-stepper.html +5 -0
- package/patterns/obligation-panel.html +36 -0
- package/patterns/operation-status.html +12 -0
- package/patterns/ordinal-scale.html +42 -0
- package/patterns/pagination.html +12 -0
- package/patterns/pairwise-choice.html +21 -0
- package/patterns/popover.html +6 -0
- package/patterns/preview-surface.html +14 -0
- package/patterns/provenance-trail.html +9 -0
- package/patterns/question.html +13 -0
- package/patterns/range-entry.html +18 -0
- package/patterns/ranking.html +32 -0
- package/patterns/readiness-checklist.html +12 -0
- package/patterns/record-header.html +17 -0
- package/patterns/rule-builder.html +37 -0
- package/patterns/search.html +8 -0
- package/patterns/segmented-control.html +13 -0
- package/patterns/select.html +12 -0
- package/patterns/semantic-differential.html +23 -0
- package/patterns/skeleton.html +7 -0
- package/patterns/slider.html +11 -0
- package/patterns/special-choice.html +15 -0
- package/patterns/status-lozenge.html +6 -0
- package/patterns/survey-progress.html +8 -0
- package/patterns/switch.html +14 -0
- package/patterns/symbol-rating.html +31 -0
- package/patterns/tabs.html +11 -0
- package/patterns/timeline.html +19 -0
- package/patterns/toast.html +10 -0
- package/patterns/understanding.html +32 -0
- package/patterns/understanding.manifest.md +26 -0
- package/patterns/validation-message.html +4 -0
- package/patterns/validation-summary.html +10 -0
- package/patterns/wizard.html +19 -0
- package/patterns/work-queue.html +20 -0
- 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
|
+
<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>
|