@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,113 @@
1
+ @layer echelon.foundations {
2
+ *, *::before, *::after { box-sizing: border-box; }
3
+
4
+ :where(html) {
5
+ color-scheme: light dark;
6
+ -webkit-text-size-adjust: 100%;
7
+ text-size-adjust: 100%;
8
+ font-family: var(--ef-primitive-font-family-sans, system-ui, sans-serif);
9
+ background: var(--ef-color-surface-primary, #f2efe7);
10
+ color: var(--ef-color-text-primary, #171a18);
11
+ }
12
+
13
+ :where(body) {
14
+ margin: 0;
15
+ background: var(--ef-color-surface-primary, #f2efe7);
16
+ color: var(--ef-color-text-primary, #171a18);
17
+ font-family: var(--ef-primitive-font-family-sans, system-ui, sans-serif);
18
+ font-size: 1rem;
19
+ line-height: 1.6;
20
+ }
21
+
22
+ :where(h1, h2) {
23
+ color: var(--ef-color-text-heading, #202421);
24
+ font-family: var(--ef-primitive-font-family-display, Georgia, serif);
25
+ font-weight: 500;
26
+ letter-spacing: -0.03em;
27
+ line-height: 1.02;
28
+ }
29
+
30
+ :where(h3, h4, h5, h6) {
31
+ color: var(--ef-color-text-heading, #202421);
32
+ line-height: 1.25;
33
+ }
34
+
35
+ :where(p) {
36
+ color: var(--ef-color-text-secondary, #686d68);
37
+ max-inline-size: 72ch;
38
+ }
39
+
40
+ :where(a) {
41
+ color: var(--ef-color-accent-primary, #905831);
42
+ text-decoration-thickness: 0.08em;
43
+ text-underline-offset: 0.18em;
44
+ }
45
+
46
+ :where(button, input, select, textarea) {
47
+ max-inline-size: 100%;
48
+ font: inherit;
49
+ }
50
+
51
+ :where(img, picture, video, canvas, svg) {
52
+ max-inline-size: 100%;
53
+ }
54
+
55
+ :where(img, video, canvas) {
56
+ block-size: auto;
57
+ }
58
+
59
+ :where(button, .ef-button) {
60
+ min-block-size: 2.75rem;
61
+ padding: 0.65rem 1rem;
62
+ border: 1px solid var(--ef-color-border-functional, #3a403c);
63
+ border-radius: var(--ef-primitive-radius-none, 0);
64
+ background: var(--ef-color-surface-primary, #f2efe7);
65
+ color: var(--ef-color-text-primary, #171a18);
66
+ font-weight: 700;
67
+ }
68
+
69
+ :where(button, .ef-button):where(:not(:disabled)):hover {
70
+ background: var(--ef-color-surface-secondary, #e3e0d7);
71
+ }
72
+
73
+ :where(input:not([type="checkbox"], [type="radio"], [type="range"]), textarea, select) {
74
+ min-block-size: 2.75rem;
75
+ inline-size: 100%;
76
+ padding: 0.7rem 0.8rem;
77
+ border: 1px solid var(--ef-color-border-functional, #3a403c);
78
+ border-radius: var(--ef-primitive-radius-none, 0);
79
+ background: var(--ef-color-surface-primary, #f2efe7);
80
+ color: var(--ef-color-text-primary, #171a18);
81
+ }
82
+
83
+ :where(:focus-visible) {
84
+ outline: 3px solid var(--ef-color-focus-gap, #f2efe7);
85
+ outline-offset: 2px;
86
+ box-shadow: 0 0 0 5px var(--ef-color-focus-ring, #171a18);
87
+ }
88
+
89
+ .ef-stack { display: flex; flex-direction: column; gap: var(--ef-stack-gap, var(--ef-primitive-spacing-4, 1rem)); }
90
+ .ef-cluster { display: flex; flex-wrap: wrap; gap: var(--ef-cluster-gap, var(--ef-primitive-spacing-3, 0.75rem)); align-items: center; }
91
+ .ef-grid { display: grid; gap: var(--ef-grid-gap, var(--ef-primitive-spacing-4, 1rem)); grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ef-grid-min, 16rem)), 1fr)); }
92
+ .ef-section { padding-block: var(--ef-section-space, var(--ef-primitive-spacing-7, 3rem)); }
93
+ .ef-surface { min-inline-size: 0; padding: var(--ef-surface-space, var(--ef-primitive-spacing-5, 1.5rem)); background: var(--ef-color-surface-secondary, #e3e0d7); color: var(--ef-color-text-on-secondary-surface, #3a403c); border: 1px solid var(--ef-color-border-subtle, #e3e0d7); }
94
+
95
+ :where(h1, h2, h3, h4, h5, h6, p, a, label, legend, td, th) {
96
+ overflow-wrap: anywhere;
97
+ }
98
+
99
+ @media (prefers-reduced-motion: reduce) {
100
+ *, *::before, *::after {
101
+ scroll-behavior: auto !important;
102
+ animation-duration: 0.01ms !important;
103
+ animation-iteration-count: 1 !important;
104
+ transition-duration: 0.01ms !important;
105
+ }
106
+ }
107
+
108
+ @media (forced-colors: active) {
109
+ :where(button, .ef-button, input, textarea, select, .ef-surface) {
110
+ border-color: CanvasText;
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,8 @@
1
+ <aside class="ef-alert" role="status" data-tone="attention" data-ef-motion-weight="standard" data-ef-motion-entry>
2
+ <div class="ef-alert__icon" aria-hidden="true">!</div>
3
+ <div>
4
+ <h3 class="ef-alert__title">Review required</h3>
5
+ <p>Two values changed since this view was loaded. No update has been applied.</p>
6
+ </div>
7
+ <button type="button">Review changes</button>
8
+ </aside>
@@ -0,0 +1,24 @@
1
+ <fieldset class="ef-allocation">
2
+ <legend class="ef-allocation__legend">Distribute 10 points across these priorities.</legend>
3
+
4
+ <div class="ef-allocation__items">
5
+ <label class="ef-allocation__item">
6
+ <span>Reliability</span>
7
+ <input type="number" name="reliability" min="0" max="10" step="1" value="4" inputmode="numeric">
8
+ </label>
9
+ <label class="ef-allocation__item">
10
+ <span>Delivery speed</span>
11
+ <input type="number" name="delivery-speed" min="0" max="10" step="1" value="3" inputmode="numeric">
12
+ </label>
13
+ <label class="ef-allocation__item">
14
+ <span>Cost efficiency</span>
15
+ <input type="number" name="cost-efficiency" min="0" max="10" step="1" value="3" inputmode="numeric">
16
+ </label>
17
+ </div>
18
+
19
+ <div class="ef-allocation__total" data-ef-state="valid" aria-live="polite" aria-atomic="true">
20
+ <span>Total</span>
21
+ <output>10 / 10</output>
22
+ </div>
23
+ <p class="ef-field__description">Limen validates the aggregate total and renders the authoritative state.</p>
24
+ </fieldset>
@@ -0,0 +1,21 @@
1
+ <fieldset class="ef-best-worst">
2
+ <legend class="ef-best-worst__legend">Choose the most important and least important item.</legend>
3
+ <p class="ef-field__description">One item must be Best and a different item must be Worst. Limen enforces the cross-column constraint.</p>
4
+
5
+ <div class="ef-best-worst__header" aria-hidden="true">
6
+ <span>Option</span><span>Best</span><span>Worst</span>
7
+ </div>
8
+
9
+ <div class="ef-best-worst__row">
10
+ <span id="bw-reliability">Reliability</span>
11
+ <label><input type="radio" name="best" value="reliability" aria-labelledby="bw-reliability bw-best-label"><span class="ef-sr-only" id="bw-best-label">Best</span></label>
12
+ <label><input type="radio" name="worst" value="reliability" aria-labelledby="bw-reliability bw-worst-label"><span class="ef-sr-only" id="bw-worst-label">Worst</span></label>
13
+ </div>
14
+ <div class="ef-best-worst__row">
15
+ <span id="bw-speed">Delivery speed</span>
16
+ <label><input type="radio" name="best" value="speed" aria-label="Delivery speed, Best"></label>
17
+ <label><input type="radio" name="worst" value="speed" aria-label="Delivery speed, Worst"></label>
18
+ </div>
19
+
20
+ <p class="ef-best-worst__status" data-ef-state="incomplete" aria-live="polite">Choose one Best and one Worst.</p>
21
+ </fieldset>
@@ -0,0 +1,15 @@
1
+ <fieldset class="ef-binary-choice">
2
+ <legend class="ef-binary-choice__legend">Is automated deployment currently in use?</legend>
3
+ <p class="ef-field__description" id="binary-choice-help">Choose one response. An unanswered question remains distinct from No.</p>
4
+
5
+ <div class="ef-binary-choice__options" aria-describedby="binary-choice-help">
6
+ <label class="ef-binary-option">
7
+ <input type="radio" name="automated-deployment" value="yes" required>
8
+ <span>Yes</span>
9
+ </label>
10
+ <label class="ef-binary-option">
11
+ <input type="radio" name="automated-deployment" value="no">
12
+ <span>No</span>
13
+ </label>
14
+ </div>
15
+ </fieldset>
@@ -0,0 +1,13 @@
1
+ <label class="ef-checkbox" data-ef-motion-weight="standard">
2
+ <input
3
+ class="ef-checkbox__input"
4
+ type="checkbox"
5
+ name="audit-log"
6
+ value="enabled"
7
+ aria-describedby="audit-log-description">
8
+ <span class="ef-checkbox__box" aria-hidden="true"></span>
9
+ <span class="ef-checkbox__text">
10
+ <span class="ef-checkbox__label">Record audit events</span>
11
+ <span class="ef-checkbox__description" id="audit-log-description">Include this action in the audit trail.</span>
12
+ </span>
13
+ </label>
@@ -0,0 +1,27 @@
1
+ <fieldset class="ef-choice-group">
2
+ <legend class="ef-choice-group__legend">Which environment is most representative?</legend>
3
+
4
+ <label class="ef-choice">
5
+ <input type="radio" name="environment" value="cloud" required>
6
+ <span class="ef-choice__content">
7
+ <strong>Cloud</strong>
8
+ <span>Primarily hosted cloud infrastructure.</span>
9
+ </span>
10
+ </label>
11
+
12
+ <label class="ef-choice">
13
+ <input type="radio" name="environment" value="hybrid">
14
+ <span class="ef-choice__content">
15
+ <strong>Hybrid</strong>
16
+ <span>Cloud and on-premises infrastructure.</span>
17
+ </span>
18
+ </label>
19
+
20
+ <label class="ef-choice">
21
+ <input type="radio" name="environment" value="on-premises">
22
+ <span class="ef-choice__content">
23
+ <strong>On-premises</strong>
24
+ <span>Primarily locally hosted infrastructure.</span>
25
+ </span>
26
+ </label>
27
+ </fieldset>
@@ -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,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,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,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>