@epa-wg/custom-element-dist 0.0.33 → 0.0.35
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/.claude/settings.local.json +18 -0
- package/.gitattributes +4 -0
- package/.github/workflows/deploy.yml +59 -0
- package/.idea/copilot.data.migration.agent.xml +6 -0
- package/.idea/copilot.data.migration.ask.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/copilot.data.migration.edit.xml +6 -0
- package/.idea/custom-element-dist.iml +2 -0
- package/.storybook/main.ts +20 -17
- package/.storybook/preview.ts +23 -23
- package/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/README.md +6 -4
- package/coverage/block-navigation.js +1 -1
- package/coverage/coverage-final.json +4 -3
- package/coverage/index.html +34 -19
- package/coverage/sorter.js +21 -7
- package/coverage/src/custom-element/coverage.svg +1 -1
- package/coverage/src/custom-element/custom-element.js/coverage.svg +1 -1
- package/coverage/src/custom-element/custom-element.js.html +448 -391
- package/coverage/src/custom-element/http-request.js/coverage.svg +1 -1
- package/coverage/src/custom-element/http-request.js.html +38 -17
- package/coverage/src/custom-element/index.html +26 -26
- package/coverage/src/custom-element/local-storage.js.html +1 -1
- package/coverage/src/custom-element/location-element.js.html +1 -1
- package/coverage/src/custom-element/module-url.js.html +1 -1
- package/coverage/src/index.html +1 -1
- package/coverage/src/material/theme/colors.js/coverage.svg +10 -0
- package/coverage/src/material/theme/colors.js.html +217 -0
- package/coverage/src/material/theme/coverage.svg +10 -0
- package/coverage/src/material/theme/index.html +116 -0
- package/coverage/src/mocks/handlers.ts.html +1 -1
- package/coverage/src/mocks/index.html +1 -1
- package/coverage/src/stories/frame.canvas.ts.html +1 -1
- package/coverage/src/stories/http-request.stories.ts.html +1 -1
- package/coverage/src/stories/index.html +1 -1
- package/coverage/src/stories/testStoryBook.ts.html +12 -12
- package/coverage/src/sum.ts.html +1 -1
- package/dist/custom-element-Bssk9jRy.cjs +97 -0
- package/dist/{custom-element-WnOqmEOe.js → custom-element-BzDjIYMe.js} +193 -183
- package/dist/custom-element-bundle.cjs +1 -1
- package/dist/custom-element-bundle.js +3 -3
- package/dist/demo/a.html +10 -3
- package/dist/demo/a.svg +26 -26
- package/dist/demo/html-template.html +4 -3
- package/dist/demo/s.xml +1 -75
- package/dist/demo/s.xslt +351 -72
- package/dist/demo/s1.xml +3706 -0
- package/dist/http-request-DSaowcG1.cjs +1 -0
- package/dist/{http-request-BOvP4KTl.js → http-request-DTCzZ1gc.js} +15 -9
- package/dist/mockServiceWorker.js +105 -63
- package/package.json +5 -4
- package/public/demo/a.html +10 -3
- package/public/demo/a.svg +26 -26
- package/public/demo/html-template.html +4 -3
- package/public/demo/s.xml +1 -75
- package/public/demo/s.xslt +351 -72
- package/public/demo/s1.xml +3706 -0
- package/public/mockServiceWorker.js +105 -63
- package/src/custom-element/custom-element.js +28 -9
- package/src/custom-element/demo/a.html +10 -3
- package/src/custom-element/demo/a.svg +26 -26
- package/src/custom-element/demo/html-template.html +4 -3
- package/src/custom-element/demo/s.xml +1 -75
- package/src/custom-element/demo/s.xslt +351 -72
- package/src/custom-element/demo/s1.xml +3706 -0
- package/src/custom-element/http-request.js +7 -0
- package/src/custom-element/ide/customData-dce.json +123 -0
- package/src/custom-element/ide/web-types-dce.json +128 -1
- package/src/custom-element/ide/web-types-xsl.json +1 -1
- package/src/material/angular.css +987 -987
- package/src/material/components/action.html +262 -0
- package/src/material/components/autocomplete.html +167 -239
- package/src/material/components/badge.html +238 -239
- package/src/material/components/dropdown.html +0 -1
- package/src/material/components/icon-link.html +160 -161
- package/src/material/components/icon.html +251 -252
- package/src/material/components/input.html +569 -570
- package/src/material/components/menu.html +235 -236
- package/src/material/components.html +157 -158
- package/src/material/demo.css +36 -36
- package/src/material/index.html +109 -110
- package/src/material/material.css +356 -356
- package/src/material/theme/Base-Principles.md +339 -0
- package/src/material/theme/README.md +298 -18
- package/src/material/theme/UI Domain Model in web applications.svg +1 -0
- package/src/material/theme/User Semantic Theme tokens.svg +1 -0
- package/src/material/theme/action-pending-poc.html +62 -0
- package/src/material/theme/actions-color.html +141 -0
- package/src/material/theme/colors-light.html +631 -0
- package/src/material/theme/colors-native.html +51 -0
- package/src/material/theme/colors-poc.html +66 -0
- package/src/material/theme/colors.html +297 -0
- package/src/material/theme/colors.js +44 -0
- package/src/material/theme/consumer-theme.css +745 -0
- package/src/material/theme/semantic.css +132 -132
- package/src/material/theme/style-bug.html +123 -0
- package/src/material/theme/theme-data.css +43 -0
- package/src/material/theme/theme-data.xhtml +2926 -0
- package/src/material/theme/todo.md +274 -0
- package/src/material/theme/tokens/action-colors.png +0 -0
- package/src/material/theme/tokens/cem-article-illustration-4x1-letterbox-2000x500.png +0 -0
- package/src/material/theme/tokens/cem-breakpoints.md +519 -0
- package/src/material/theme/tokens/cem-colors.md +715 -0
- package/src/material/theme/tokens/cem-consumerflow-typography-matrix.svg +198 -0
- package/src/material/theme/tokens/cem-coupling.md +372 -0
- package/src/material/theme/tokens/cem-data-vs-reading-numerals.svg +164 -0
- package/src/material/theme/tokens/cem-dimension.md +625 -0
- package/src/material/theme/tokens/cem-layering.md +562 -0
- package/src/material/theme/tokens/cem-m3-parity.md +343 -0
- package/src/material/theme/tokens/cem-responsive.md +238 -0
- package/src/material/theme/tokens/cem-shape.md +691 -0
- package/src/material/theme/tokens/cem-stroke-density-illustration-4to1-v3.svg +102 -0
- package/src/material/theme/tokens/cem-stroke.md +480 -0
- package/src/material/theme/tokens/cem-timing.md +198 -0
- package/src/material/theme/tokens/cem-typography-model-stack.svg +64 -0
- package/src/material/theme/tokens/cem-voice-fonts-typography.md +718 -0
- package/src/material/theme/tokens/cem-voice-ladder.svg +91 -0
- package/src/material/theme/tokens/chips.png +0 -0
- package/src/material/theme/tokens/columns-page.png +0 -0
- package/src/material/theme/tokens/initials.png +0 -0
- package/src/material/theme/tokens/nav-buttons.png +0 -0
- package/src/material/theme/tokens/script.png +0 -0
- package/src/material/theme/tokens/sufler.png +0 -0
- package/src/material/theme/tokens/typography-icons.png +0 -0
- package/src/mocks/versions.mock.ts +1 -1
- package/src/stories/__screenshots__/dom-merge.test.stories.ts/dom-merge-dom-merge-OrderPreservingOn2ndTransform-1.png +0 -0
- package/src/stories/__screenshots__/xslt-conditionals.test.stories.ts/xslt-conditionals-xslt-conditionals-MultipleIfOrderingWorkaround-1.png +0 -0
- package/src/stories/dom-merge.test.stories.ts +25 -1
- package/src/stories/xslt-conditionals.test.stories.ts +492 -0
- package/src/stories/xslt-for-each.test.stories.ts +336 -0
- package/src/stories/xslt-if.test.stories.ts +89 -0
- package/storybook-static/assets/{Color-F6OSRLHC-Cbp293x2.js → Color-F6OSRLHC-DeDlDLjU.js} +1 -1
- package/storybook-static/assets/{Configure-BrFr4SLE.js → Configure-CH_tIP5N.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-CFRXHY34-DhHzJiIO.js → DocsRenderer-CFRXHY34-Bc9EPsUI.js} +2 -2
- package/storybook-static/assets/{attributes.test.stories-Gg9LQTEK.js → attributes.test.stories-BtamFQkF.js} +1 -1
- package/storybook-static/assets/{css.test.stories-B_3ltOrx.js → css.test.stories-BfNxLgwr.js} +1 -1
- package/storybook-static/assets/{custom-element-CPnvJnn8.js → custom-element-CnmjNo0g.js} +6 -6
- package/storybook-static/assets/{dom-merge.test.stories-nQxcgLoM.js → dom-merge.test.stories-DxnitrLK.js} +47 -6
- package/storybook-static/assets/entry-preview-BNCt9WBs.js +26 -0
- package/storybook-static/assets/{entry-preview-docs-Dwczwtsc.js → entry-preview-docs-CbF8-81D.js} +2 -2
- package/storybook-static/assets/{external-template.test.stories-DZ-rjnfd.js → external-template.test.stories-BTsww7B0.js} +1 -1
- package/storybook-static/assets/{form.test.stories-DQhPYtMj.js → form.test.stories-DNJFtPJb.js} +1 -1
- package/storybook-static/assets/{frame.canvas-ClTqYyMN.js → frame.canvas-E5n9h6j1.js} +1 -1
- package/storybook-static/assets/{handlers-CLkps6Nz.js → handlers-Dvg8CAeR.js} +1 -1
- package/storybook-static/assets/http-request-BWeEEBkP.js +1 -0
- package/storybook-static/assets/{http-request.stories-jo0f73nw.js → http-request.stories-DgrBNle8.js} +1 -1
- package/storybook-static/assets/{iframe-CZwRpnn9.js → iframe-DiVWehoI.js} +11 -11
- package/storybook-static/assets/{index-Dr4PwNfd.js → index-CGuyH0k-.js} +87 -87
- package/storybook-static/assets/{index-CJQtnF9V.js → index-CdEbhcV9.js} +1 -1
- package/storybook-static/assets/index-DO1nmyvI.js +11 -0
- package/storybook-static/assets/{index-B68YUdzy.js → index-w6iX3YlR.js} +3 -3
- package/storybook-static/assets/{local-storage.test.stories-uA5EKRPf.js → local-storage.test.stories-Hwq80yUr.js} +1 -1
- package/storybook-static/assets/{location-element.test.stories-Cu-6Elcg.js → location-element.test.stories-mEhZzm7x.js} +1 -1
- package/storybook-static/assets/{module-url.test.stories-CD_wusXQ.js → module-url.test.stories-Bj46iT0V.js} +1 -1
- package/storybook-static/assets/{preview-CuCH40jj.js → preview-BjbXcJci.js} +2 -2
- package/storybook-static/assets/{preview-BFlNN3Wj.js → preview-Bn8igYMp.js} +1 -1
- package/storybook-static/assets/{preview-Cm4PPhHS.js → preview-CfuT8gak.js} +1 -1
- package/storybook-static/assets/{set-url.test.stories-CY7B9BVZ.js → set-url.test.stories-hzxLcqmm.js} +1 -1
- package/storybook-static/assets/{slice-events.test.stories-BVnPXm6e.js → slice-events.test.stories-DVyXFRU1.js} +1 -1
- package/storybook-static/assets/{slots.test.stories-Dxsa9KdA.js → slots.test.stories-CS544nS4.js} +1 -1
- package/storybook-static/assets/{version-select.test.stories-Buga1PAa.js → version-select.test.stories-D36nfYBq.js} +1 -1
- package/storybook-static/assets/xslt-conditionals.test.stories-BS1PTIHe.js +633 -0
- package/storybook-static/assets/xslt-for-each.test.stories-CtPS20RK.js +329 -0
- package/storybook-static/assets/xslt-if.test.stories-DcHrAMSY.js +71 -0
- package/storybook-static/demo/a.html +10 -3
- package/storybook-static/demo/a.svg +26 -26
- package/storybook-static/demo/html-template.html +4 -3
- package/storybook-static/demo/s.xml +1 -75
- package/storybook-static/demo/s.xslt +351 -72
- package/storybook-static/demo/s1.xml +3706 -0
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/mockServiceWorker.js +105 -63
- package/storybook-static/project.json +1 -1
- package/storybook-static/sb-addons/essentials-controls-1/manager-bundle.js +69 -66
- package/storybook-static/sb-addons/essentials-docs-3/manager-bundle.js +62 -59
- package/dist/custom-element-6slVaFEs.cjs +0 -97
- package/dist/http-request-DPrY7mGh.cjs +0 -1
- package/storybook-static/assets/attributes.test.stories-CzWkKw0e.js +0 -1
- package/storybook-static/assets/entry-preview-DHVXbf3x.js +0 -26
- package/storybook-static/assets/external-template.test.stories-BivZqBTp.js +0 -1
- package/storybook-static/assets/http-request-DNq59pnj.js +0 -1
- package/storybook-static/assets/index-BwkS7JH_.js +0 -8
- package/storybook-static/assets/module-url.test.stories-CTjUAk3J.js +0 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Semantic Timing and Motion Tokens (CEM) — Canonical Spec
|
|
2
|
+
|
|
3
|
+
**Status:** Canonical (v1.0)
|
|
4
|
+
|
|
5
|
+
**Last updated:** December 21, 2025
|
|
6
|
+
|
|
7
|
+
**Audience:** Design Systems, Product Design, Front-End Engineering
|
|
8
|
+
|
|
9
|
+
**Applies to:** UI animation timing (durations, easing curves, and optional spring presets)
|
|
10
|
+
|
|
11
|
+
**Companion specs:**
|
|
12
|
+
- **D0. Color (Emotional Palette)** ([`cem-colors.md`](./cem-colors.md)) — color transition timing
|
|
13
|
+
- **D1. Space & Rhythm** ([`cem-dimension.md`](./cem-dimension.md)) — spacing animation timing
|
|
14
|
+
- **D2. Coupling & Compactness** ([`cem-coupling.md`](./cem-coupling.md)) — density transition timing
|
|
15
|
+
- **D3. Shape — Bend** ([`cem-shape.md`](./cem-shape.md)) — bend/morph animation timing
|
|
16
|
+
- **D4. Layering** ([`cem-layering.md`](./cem-layering.md)) — lift/drop transitions, reduced-motion behavior
|
|
17
|
+
- **D5. Stroke & Separation** ([`cem-stroke.md`](./cem-stroke.md)) — focus/selection transition timing
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. Purpose and scope
|
|
22
|
+
|
|
23
|
+
This spec defines the **CEM contract surface** for motion timing:
|
|
24
|
+
|
|
25
|
+
- **Duration** tokens (how long a change takes)
|
|
26
|
+
- **Easing** tokens (how the motion accelerates/decelerates)
|
|
27
|
+
- **Spring** presets (optional; for platforms that support spring physics)
|
|
28
|
+
|
|
29
|
+
The goal is to make motion choices **intent-driven** (what the user experiences), while allowing implementations/adapters
|
|
30
|
+
(e.g., Material, custom, platform-native) to supply exact numeric curves/physics.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Taxonomy placement
|
|
35
|
+
|
|
36
|
+
- **D7. Timing & Motion** (this spec)
|
|
37
|
+
- time durations
|
|
38
|
+
- easing curves
|
|
39
|
+
- spring presets (optional)
|
|
40
|
+
|
|
41
|
+
Related dimensions:
|
|
42
|
+
|
|
43
|
+
- **D4. Layering & Elevation**: overlays/dialogs often use longer durations
|
|
44
|
+
- **D2. Coupling & Compactness**: compact density should not force overly fast or illegible motion
|
|
45
|
+
- **D5. Stroke & Separation**: focus/selection indicators may animate; duration must not impede operability
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 3. Consumer vocabulary
|
|
50
|
+
|
|
51
|
+
CEM duration names reflect how users perceive timing:
|
|
52
|
+
|
|
53
|
+
- **instant** — “blink; do not interrupt”
|
|
54
|
+
- **noticeable** — “registerable, but not slow”
|
|
55
|
+
- **lingering** — “large change; allow the user to track it”
|
|
56
|
+
|
|
57
|
+
Easing names reflect intent:
|
|
58
|
+
|
|
59
|
+
- **smooth** — everyday, unobtrusive
|
|
60
|
+
- **highlighted** — draws attention (more pronounced)
|
|
61
|
+
- **uniform** — neutral/mechanical (constant speed)
|
|
62
|
+
- **classic** — legacy compatibility
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 4. Canonical token surface
|
|
67
|
+
|
|
68
|
+
### 4.1 Duration tokens (required)
|
|
69
|
+
|
|
70
|
+
```css
|
|
71
|
+
:root {
|
|
72
|
+
/* Core buckets (contract-level) */
|
|
73
|
+
--cem-duration-instant: 50ms;
|
|
74
|
+
--cem-duration-noticeable: 250ms;
|
|
75
|
+
--cem-duration-lingering: 300ms;
|
|
76
|
+
|
|
77
|
+
/* Optional semantic aliases (adapter may override) */
|
|
78
|
+
--cem-duration-action: var(--cem-duration-noticeable);
|
|
79
|
+
--cem-duration-overlay: var(--cem-duration-lingering);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Normative rules:
|
|
84
|
+
|
|
85
|
+
- Ordering MUST remain: `instant < noticeable < lingering`.
|
|
86
|
+
- Reduced-motion modes may shorten durations (including to `0ms`), but MUST preserve relative ordering.
|
|
87
|
+
|
|
88
|
+
### 4.2 Easing tokens (required)
|
|
89
|
+
|
|
90
|
+
Easing tokens are expressed as CSS timing functions.
|
|
91
|
+
|
|
92
|
+
```css
|
|
93
|
+
:root {
|
|
94
|
+
/* Everyday motion */
|
|
95
|
+
--cem-easing-smooth: ease-in-out;
|
|
96
|
+
--cem-easing-start-smooth: ease-in;
|
|
97
|
+
--cem-easing-end-smooth: ease-out;
|
|
98
|
+
|
|
99
|
+
/* Attention-drawing motion (adapter SHOULD provide a more pronounced curve) */
|
|
100
|
+
--cem-easing-highlighted: var(--cem-easing-smooth);
|
|
101
|
+
--cem-easing-highlighted-start: var(--cem-easing-start-smooth);
|
|
102
|
+
--cem-easing-highlighted-end: var(--cem-easing-end-smooth);
|
|
103
|
+
|
|
104
|
+
/* Neutral/legacy */
|
|
105
|
+
--cem-easing-uniform: linear;
|
|
106
|
+
--cem-easing-classic: ease;
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Normative rules:
|
|
111
|
+
|
|
112
|
+
- `smooth` MUST be suitable as the default.
|
|
113
|
+
- `highlighted*` MUST be *visibly more pronounced* than the corresponding `smooth*` curves **in the same implementation**.
|
|
114
|
+
(The above defaults provide placeholders; adapters are expected to supply real emphasized curves.)
|
|
115
|
+
|
|
116
|
+
### 4.3 Spring tokens (optional extension)
|
|
117
|
+
|
|
118
|
+
Spring tokens are **optional** because spring rendering is implementation-specific (WAAPI polyfills, native toolkits,
|
|
119
|
+
framework animation engines, etc.).
|
|
120
|
+
|
|
121
|
+
If springs are supported, reserve the following semantic naming grid:
|
|
122
|
+
|
|
123
|
+
- **Focus**: `reposition | highlight`
|
|
124
|
+
- **Feel**: `functional | delight`
|
|
125
|
+
- **Speed**: `instant | noticeable | lingering`
|
|
126
|
+
|
|
127
|
+
Recommended token shape (implementation-defined value encoding):
|
|
128
|
+
|
|
129
|
+
```css
|
|
130
|
+
:root {
|
|
131
|
+
/* Example encoding as a string. Implementations may choose a different encoding. */
|
|
132
|
+
--cem-spring-reposition-functional-instant: "stiffness=… damping=…";
|
|
133
|
+
--cem-spring-reposition-functional-noticeable: "stiffness=… damping=…";
|
|
134
|
+
--cem-spring-reposition-functional-lingering: "stiffness=… damping=…";
|
|
135
|
+
|
|
136
|
+
--cem-spring-highlight-delight-lingering: "stiffness=… damping=…";
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Normative rules (if springs are implemented):
|
|
141
|
+
|
|
142
|
+
- `instant | noticeable | lingering` MUST preserve perceived ordering from fastest to slowest.
|
|
143
|
+
- `delight` MAY overshoot/bounce; `functional` SHOULD minimize overshoot.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 5. Usage guidance
|
|
148
|
+
|
|
149
|
+
- Use **instant** for micro-interactions that must not interrupt flow (e.g., tiny state toggles).
|
|
150
|
+
- Use **noticeable** for most component transitions (expand/collapse, standard page UI changes).
|
|
151
|
+
- Use **lingering** for overlays and large spatial changes where users must track context.
|
|
152
|
+
|
|
153
|
+
Easing selection:
|
|
154
|
+
|
|
155
|
+
- Use **smooth** for default transitions.
|
|
156
|
+
- Use **start-smooth** for entrances; **end-smooth** for dismissals.
|
|
157
|
+
- Use **highlighted** variants when motion’s purpose is to direct attention.
|
|
158
|
+
- Use **uniform** for mechanical/neutral motion (e.g., indeterminate progress).
|
|
159
|
+
- Use **classic** only for legacy compatibility.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 6. Governance and versioning
|
|
164
|
+
|
|
165
|
+
Treat D7 tokens as **contract-level** once canonical.
|
|
166
|
+
|
|
167
|
+
Breaking (MAJOR):
|
|
168
|
+
|
|
169
|
+
- Renaming/removing a required token
|
|
170
|
+
- Changing the semantic meaning of a token
|
|
171
|
+
- Violating the ordering rule (`instant < noticeable < lingering`)
|
|
172
|
+
|
|
173
|
+
Non-breaking (MINOR/PATCH):
|
|
174
|
+
|
|
175
|
+
- Adjusting numeric values while preserving semantics and ordering
|
|
176
|
+
- Adding optional aliases or additional optional spring presets
|
|
177
|
+
- Documentation clarifications
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 7. Canonical token summary (contract surface)
|
|
182
|
+
|
|
183
|
+
| Token | Category | Required |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| `--cem-duration-instant` | Duration | Yes |
|
|
186
|
+
| `--cem-duration-noticeable` | Duration | Yes |
|
|
187
|
+
| `--cem-duration-lingering` | Duration | Yes |
|
|
188
|
+
| `--cem-easing-smooth` | Easing | Yes |
|
|
189
|
+
| `--cem-easing-start-smooth` | Easing | Yes |
|
|
190
|
+
| `--cem-easing-end-smooth` | Easing | Yes |
|
|
191
|
+
| `--cem-easing-highlighted` | Easing | Yes |
|
|
192
|
+
| `--cem-easing-highlighted-start` | Easing | Yes |
|
|
193
|
+
| `--cem-easing-highlighted-end` | Easing | Yes |
|
|
194
|
+
| `--cem-easing-uniform` | Easing | Yes |
|
|
195
|
+
| `--cem-easing-classic` | Easing | Yes |
|
|
196
|
+
| `--cem-duration-action` | Duration alias | No |
|
|
197
|
+
| `--cem-duration-overlay` | Duration alias | No |
|
|
198
|
+
| `--cem-spring-*` | Spring presets | No |
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="700" viewBox="0 0 1200 700" role="img" aria-label="CEM typography model: Fontography, Typography, and Voice with Ink and Speech projections">
|
|
3
|
+
<defs>
|
|
4
|
+
<style>
|
|
5
|
+
:root {
|
|
6
|
+
--cem-ink: #111;
|
|
7
|
+
--cem-surface: #fff;
|
|
8
|
+
--cem-outline: #c7c7c7;
|
|
9
|
+
--cem-muted: #666;
|
|
10
|
+
--cem-accent: #005a9c;
|
|
11
|
+
}
|
|
12
|
+
.frame { fill: var(--cem-surface); stroke: var(--cem-outline); stroke-width: 2; rx: 18; }
|
|
13
|
+
.card { fill: var(--cem-surface); stroke: var(--cem-outline); stroke-width: 2; rx: 22; }
|
|
14
|
+
.card-accent { fill: var(--cem-surface); stroke: var(--cem-accent); stroke-width: 2.5; rx: 22; }
|
|
15
|
+
.title { font: 700 34px system-ui, -apple-system, "Segoe UI", Arial, sans-serif; fill: var(--cem-ink); }
|
|
16
|
+
.h2 { font: 650 26px system-ui, -apple-system, "Segoe UI", Arial, sans-serif; fill: var(--cem-ink); }
|
|
17
|
+
.text { font: 400 18px system-ui, -apple-system, "Segoe UI", Arial, sans-serif; fill: var(--cem-ink); }
|
|
18
|
+
.muted { font: 400 16px system-ui, -apple-system, "Segoe UI", Arial, sans-serif; fill: var(--cem-muted); }
|
|
19
|
+
.mono { font: 500 16px ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; fill: var(--cem-muted); }
|
|
20
|
+
.arrow-strong { stroke: var(--cem-accent); stroke-width: 3; fill: none; marker-end: url(#arrowheadAccent); }
|
|
21
|
+
</style>
|
|
22
|
+
<marker id="arrowheadAccent" markerWidth="10" markerHeight="8" refX="8" refY="4" orient="auto">
|
|
23
|
+
<path d="M0,0 L10,4 L0,8 Z" fill="var(--cem-accent)"/>
|
|
24
|
+
</marker>
|
|
25
|
+
</defs>
|
|
26
|
+
|
|
27
|
+
<rect x="30" y="30" width="1140" height="640" class="frame"/>
|
|
28
|
+
<text x="70" y="95" class="title">CEM Typography Model: Fontography, Typography, Voice</text>
|
|
29
|
+
<text x="70" y="128" class="muted">Voice is modality-independent prominence. It projects into Ink (visual) and Speech (read-aloud prosody).</text>
|
|
30
|
+
|
|
31
|
+
<rect x="90" y="170" width="520" height="135" class="card"/>
|
|
32
|
+
<text x="125" y="218" class="h2">Fontography</text>
|
|
33
|
+
<text x="125" y="248" class="text">Fonts as assets + feature policy</text>
|
|
34
|
+
<text x="125" y="276" class="mono">--cem-fontography-<role>-family</text>
|
|
35
|
+
|
|
36
|
+
<rect x="90" y="325" width="520" height="155" class="card"/>
|
|
37
|
+
<text x="125" y="372" class="h2">Typography</text>
|
|
38
|
+
<text x="125" y="402" class="text">Layout perception: size, rhythm, spacing</text>
|
|
39
|
+
<text x="125" y="430" class="mono">--cem-typography-<role>-font-size</text>
|
|
40
|
+
<text x="125" y="455" class="mono">--cem-typography-<role>-line-height</text>
|
|
41
|
+
|
|
42
|
+
<rect x="90" y="505" width="520" height="140" class="card-accent"/>
|
|
43
|
+
<text x="125" y="552" class="h2">Voice</text>
|
|
44
|
+
<text x="125" y="582" class="text">Prominence semantics (cross‑modal)</text>
|
|
45
|
+
<text x="125" y="610" class="mono">--cem-voice-<level>-…</text>
|
|
46
|
+
|
|
47
|
+
<path d="M610,575 C700,575 710,345 800,345" class="arrow-strong"/>
|
|
48
|
+
<path d="M610,595 C700,595 710,515 800,515" class="arrow-strong"/>
|
|
49
|
+
|
|
50
|
+
<rect x="800" y="255" width="330" height="170" class="card"/>
|
|
51
|
+
<text x="835" y="302" class="h2">Ink projection</text>
|
|
52
|
+
<text x="835" y="332" class="text">Visual strength for text + icons</text>
|
|
53
|
+
<text x="835" y="362" class="mono">--cem-voice-*-ink-thickness</text>
|
|
54
|
+
<text x="835" y="388" class="mono">--cem-voice-*-icon-stroke-multiplier</text>
|
|
55
|
+
|
|
56
|
+
<rect x="800" y="445" width="330" height="190" class="card"/>
|
|
57
|
+
<text x="835" y="492" class="h2">Speech projection</text>
|
|
58
|
+
<text x="835" y="522" class="text">Product read‑aloud prosody</text>
|
|
59
|
+
<text x="835" y="552" class="mono">--cem-voice-*-speech-rate</text>
|
|
60
|
+
<text x="835" y="578" class="mono">--cem-voice-*-speech-pitch</text>
|
|
61
|
+
<text x="835" y="604" class="mono">--cem-voice-*-speech-volume</text>
|
|
62
|
+
|
|
63
|
+
<text x="70" y="665" class="muted">Note: Screen readers primarily follow HTML/ARIA semantics; voice tokens are intended for product read‑aloud features.</text>
|
|
64
|
+
</svg>
|