@epa-wg/custom-element-dist 0.0.32 → 0.0.34

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 (300) hide show
  1. package/.claude/settings.local.json +18 -0
  2. package/.github/workflows/deploy.yml +59 -0
  3. package/.idea/copilot.data.migration.agent.xml +6 -0
  4. package/.idea/copilot.data.migration.ask.xml +6 -0
  5. package/.idea/copilot.data.migration.edit.xml +6 -0
  6. package/.idea/custom-element-dist.iml +2 -0
  7. package/.storybook/main.ts +20 -21
  8. package/.storybook/preview.ts +23 -25
  9. package/README.md +6 -4
  10. package/coverage/block-navigation.js +1 -1
  11. package/coverage/coverage-final.json +8 -18
  12. package/coverage/index.html +45 -30
  13. package/coverage/sorter.js +21 -7
  14. package/coverage/src/custom-element/coverage.svg +1 -1
  15. package/coverage/src/custom-element/custom-element.js/coverage.svg +1 -1
  16. package/coverage/src/custom-element/custom-element.js.html +687 -480
  17. package/coverage/src/custom-element/http-request.js/coverage.svg +1 -1
  18. package/coverage/src/custom-element/http-request.js.html +39 -18
  19. package/coverage/src/custom-element/index.html +35 -35
  20. package/coverage/src/custom-element/local-storage.js.html +1 -1
  21. package/coverage/src/custom-element/location-element.js.html +31 -31
  22. package/coverage/src/custom-element/module-url.js/coverage.svg +1 -1
  23. package/coverage/src/custom-element/module-url.js.html +20 -20
  24. package/coverage/src/index.html +1 -1
  25. package/coverage/src/{stories/local-storage.test.stories.ts → material/theme/colors.js}/coverage.svg +1 -1
  26. package/coverage/src/material/theme/colors.js.html +217 -0
  27. package/coverage/src/{stories/location-element.test.stories.ts → material/theme}/coverage.svg +1 -1
  28. package/coverage/src/material/theme/index.html +116 -0
  29. package/coverage/src/mocks/handlers.ts.html +1 -1
  30. package/coverage/src/mocks/index.html +1 -1
  31. package/coverage/src/stories/coverage.svg +1 -1
  32. package/coverage/src/stories/{external-template.test.stories.ts → frame.canvas.ts}/coverage.svg +1 -1
  33. package/coverage/src/stories/frame.canvas.ts.html +175 -0
  34. package/coverage/src/stories/http-request.stories.ts.html +1 -1
  35. package/coverage/src/stories/index.html +14 -179
  36. package/coverage/src/stories/testStoryBook.ts.html +12 -12
  37. package/coverage/src/sum.ts.html +1 -1
  38. package/dist/custom-element-BoYMoUtP.js +619 -0
  39. package/dist/custom-element-BqtjrCRF.cjs +97 -0
  40. package/dist/custom-element-bundle.cjs +1 -1
  41. package/dist/custom-element-bundle.js +3 -3
  42. package/dist/demo/a.html +10 -3
  43. package/dist/demo/a.svg +26 -26
  44. package/dist/demo/attributes.html +153 -0
  45. package/dist/demo/external-templates-sb-6.html +42 -0
  46. package/dist/demo/external-templates-sb-7.html +42 -0
  47. package/dist/demo/html-template.html +5 -4
  48. package/dist/demo/module-url-sb-2.html +46 -0
  49. package/dist/demo/module-url-sb-4.html +48 -0
  50. package/dist/demo/module-url-sb-5.html +53 -0
  51. package/dist/demo/s.xml +3859 -7
  52. package/dist/demo/s.xslt +13 -48
  53. package/dist/demo/s1.xml +3706 -0
  54. package/dist/demo/ss.html +13 -4
  55. package/dist/http-request-DSaowcG1.cjs +1 -0
  56. package/dist/{http-request-BOvP4KTl.js → http-request-DTCzZ1gc.js} +15 -9
  57. package/dist/mockServiceWorker.js +31 -8
  58. package/package.json +25 -26
  59. package/public/demo/a.html +10 -3
  60. package/public/demo/a.svg +26 -26
  61. package/public/demo/attributes.html +153 -0
  62. package/public/demo/external-templates-sb-6.html +42 -0
  63. package/public/demo/external-templates-sb-7.html +42 -0
  64. package/public/demo/html-template.html +5 -4
  65. package/public/demo/module-url-sb-2.html +46 -0
  66. package/public/demo/module-url-sb-4.html +48 -0
  67. package/public/demo/module-url-sb-5.html +53 -0
  68. package/public/demo/s.xml +3859 -7
  69. package/public/demo/s.xslt +13 -48
  70. package/public/demo/s1.xml +3706 -0
  71. package/public/demo/ss.html +13 -4
  72. package/public/mockServiceWorker.js +31 -8
  73. package/src/custom-element/custom-element.d.ts +4 -0
  74. package/src/custom-element/custom-element.js +119 -50
  75. package/src/custom-element/demo/a.html +10 -3
  76. package/src/custom-element/demo/a.svg +26 -26
  77. package/src/custom-element/demo/attributes.html +153 -0
  78. package/src/custom-element/demo/html-template.html +5 -4
  79. package/src/custom-element/demo/s.xml +3859 -7
  80. package/src/custom-element/demo/s.xslt +13 -48
  81. package/src/custom-element/demo/s1.xml +3706 -0
  82. package/src/custom-element/demo/ss.html +13 -4
  83. package/src/custom-element/http-request.js +7 -0
  84. package/src/custom-element/ide/web-types-dce.json +1 -1
  85. package/src/custom-element/ide/web-types-xsl.json +1 -1
  86. package/src/custom-element/index.html +1 -1
  87. package/src/material/angular.css +987 -987
  88. package/src/material/components/action.html +262 -0
  89. package/src/material/components/autocomplete.html +167 -239
  90. package/src/material/components/badge.html +239 -0
  91. package/src/material/components/dropdown.html +7 -13
  92. package/src/material/components/icon-link.html +160 -160
  93. package/src/material/components/icon.html +252 -0
  94. package/src/material/components/input.html +569 -362
  95. package/src/material/components/menu.html +235 -234
  96. package/src/material/components.html +157 -121
  97. package/src/material/demo.css +36 -36
  98. package/src/material/index.html +109 -110
  99. package/src/material/material.css +356 -356
  100. package/src/material/theme/Base-Principles.md +339 -0
  101. package/src/material/theme/README.md +298 -18
  102. package/src/material/theme/UI Domain Model in web applications.svg +1 -0
  103. package/src/material/theme/User Semantic Theme tokens.svg +1 -0
  104. package/src/material/theme/action-pending-poc.html +62 -0
  105. package/src/material/theme/actions-color.html +141 -0
  106. package/src/material/theme/colors-light.html +631 -0
  107. package/src/material/theme/colors-native.html +51 -0
  108. package/src/material/theme/colors-poc.html +66 -0
  109. package/src/material/theme/colors.html +297 -0
  110. package/src/material/theme/colors.js +44 -0
  111. package/src/material/theme/consumer-theme.css +745 -0
  112. package/src/material/theme/semantic.css +132 -113
  113. package/src/material/theme/style-bug.html +123 -0
  114. package/src/material/theme/theme-data.css +43 -0
  115. package/src/material/theme/theme-data.xhtml +2926 -0
  116. package/src/material/theme/todo.md +274 -0
  117. package/src/material/theme/tokens/action-colors.png +0 -0
  118. package/src/material/theme/tokens/cem-article-illustration-4x1-letterbox-2000x500.png +0 -0
  119. package/src/material/theme/tokens/cem-breakpoints.md +519 -0
  120. package/src/material/theme/tokens/cem-colors.md +715 -0
  121. package/src/material/theme/tokens/cem-consumerflow-typography-matrix.svg +198 -0
  122. package/src/material/theme/tokens/cem-coupling.md +372 -0
  123. package/src/material/theme/tokens/cem-data-vs-reading-numerals.svg +164 -0
  124. package/src/material/theme/tokens/cem-dimension.md +625 -0
  125. package/src/material/theme/tokens/cem-layering.md +562 -0
  126. package/src/material/theme/tokens/cem-m3-parity.md +343 -0
  127. package/src/material/theme/tokens/cem-responsive.md +238 -0
  128. package/src/material/theme/tokens/cem-shape.md +691 -0
  129. package/src/material/theme/tokens/cem-stroke-density-illustration-4to1-v3.svg +102 -0
  130. package/src/material/theme/tokens/cem-stroke.md +480 -0
  131. package/src/material/theme/tokens/cem-timing.md +198 -0
  132. package/src/material/theme/tokens/cem-typography-model-stack.svg +64 -0
  133. package/src/material/theme/tokens/cem-voice-fonts-typography.md +718 -0
  134. package/src/material/theme/tokens/cem-voice-ladder.svg +91 -0
  135. package/src/material/theme/tokens/chips.png +0 -0
  136. package/src/material/theme/tokens/columns-page.png +0 -0
  137. package/src/material/theme/tokens/initials.png +0 -0
  138. package/src/material/theme/tokens/nav-buttons.png +0 -0
  139. package/src/material/theme/tokens/script.png +0 -0
  140. package/src/material/theme/tokens/sufler.png +0 -0
  141. package/src/material/theme/tokens/typography-icons.png +0 -0
  142. package/src/mocks/versions.mock.ts +1 -1
  143. package/src/stories/__screenshots__/attributes.test.stories.ts +1 -0
  144. package/src/stories/__screenshots__/dom-merge.test.stories.ts/dom-merge-dom-merge-OrderPreservingOn2ndTransform-1.png +0 -0
  145. package/src/stories/__screenshots__/external-template.test.stories.ts +1 -0
  146. package/src/stories/__screenshots__/module-url.test.stories.ts +1 -0
  147. package/src/stories/__screenshots__/stories.test.ts/attributes-Attributes-definition-1.png +0 -0
  148. package/src/stories/__screenshots__/stories.test.ts/attributes-Attributes-runtime-change-1.png +0 -0
  149. package/src/stories/__screenshots__/stories.test.ts/attributes-Instance-Attributes-1.png +0 -0
  150. package/src/stories/__screenshots__/stories.test.ts/attributes-Instance-Attributes-2.png +0 -0
  151. package/src/stories/__screenshots__/stories.test.ts/attributes-cloneAs-el-newTag--1.png +0 -0
  152. package/src/stories/__screenshots__/stories.test.ts/attributes-mergeAttr--from--to---1.png +0 -0
  153. package/src/stories/__screenshots__/stories.test.ts/attributes-mergeAttr--from--to---2.png +0 -0
  154. package/src/stories/__screenshots__/stories.test.ts/attributes-mergeAttr--from--to---3.png +0 -0
  155. package/src/stories/__screenshots__/stories.test.ts/attributes-mix-to-from--1.png +0 -0
  156. package/src/stories/__screenshots__/stories.test.ts/http-request-Attributes-definition-1.png +0 -0
  157. package/src/stories/__screenshots__/stories.test.ts/http-request-Attributes-runtime-change-1.png +0 -0
  158. package/src/stories/__screenshots__/stories.test.ts/http-request-Instance-Attributes-1.png +0 -0
  159. package/src/stories/__screenshots__/stories.test.ts/http-request-Instance-Attributes-2.png +0 -0
  160. package/src/stories/__screenshots__/stories.test.ts/http-request-cloneAs-el-newTag--1.png +0 -0
  161. package/src/stories/__screenshots__/stories.test.ts/http-request-http-request-headers-and-response-status-and-headers-1.png +0 -0
  162. package/src/stories/__screenshots__/stories.test.ts/http-request-http-request-with-delayed--5-seconds-response-1.png +0 -0
  163. package/src/stories/__screenshots__/stories.test.ts/http-request-http-request-with-error-1.png +0 -0
  164. package/src/stories/__screenshots__/stories.test.ts/http-request-mergeAttr--from--to---1.png +0 -0
  165. package/src/stories/__screenshots__/stories.test.ts/http-request-mergeAttr--from--to---2.png +0 -0
  166. package/src/stories/__screenshots__/stories.test.ts/http-request-mergeAttr--from--to---3.png +0 -0
  167. package/src/stories/__screenshots__/stories.test.ts/http-request-mix-to-from--1.png +0 -0
  168. package/src/stories/__screenshots__/stories.test.ts/http-request-url-and-slice-1.png +0 -0
  169. package/src/stories/__screenshots__/stories.test.ts/http-request-url-change-1.png +0 -0
  170. package/src/stories/__screenshots__/xslt-conditionals.test.stories.ts/xslt-conditionals-xslt-conditionals-MultipleIfOrderingWorkaround-1.png +0 -0
  171. package/src/stories/attributes.test.stories.ts +83 -17
  172. package/src/stories/dom-merge.test.stories.ts +25 -1
  173. package/src/stories/external-template.test.stories.ts +16 -14
  174. package/src/stories/frame.canvas.ts +31 -0
  175. package/src/stories/module-url.test.stories.ts +29 -61
  176. package/src/stories/xslt-conditionals.test.stories.ts +492 -0
  177. package/src/stories/xslt-if.test.stories.ts +89 -0
  178. package/storybook-static/assets/Color-F6OSRLHC-CzTOSlqB.js +1 -0
  179. package/storybook-static/assets/Configure-7GqRsAoJ.js +165 -0
  180. package/storybook-static/assets/DocsRenderer-CFRXHY34-Duc5rSIm.js +2 -0
  181. package/storybook-static/assets/{attributes.test.stories-D1X6EBrd.js → attributes.test.stories-DYuxF8h1.js} +109 -38
  182. package/storybook-static/assets/{css.test.stories-Cp_g2hE1.js → css.test.stories-LOmvINyb.js} +1 -1
  183. package/storybook-static/assets/custom-element-Bwx7otrT.js +97 -0
  184. package/storybook-static/assets/{dom-merge.test.stories-hbpdCka0.js → dom-merge.test.stories-CEKhWjaS.js} +47 -6
  185. package/storybook-static/assets/entry-preview-BNCt9WBs.js +26 -0
  186. package/storybook-static/assets/entry-preview-docs-CbF8-81D.js +2 -0
  187. package/storybook-static/assets/{external-template.test.stories-BK89h6sk.js → external-template.test.stories-jHu0wsJ-.js} +38 -40
  188. package/storybook-static/assets/{form.test.stories-BfoLe_rw.js → form.test.stories-CUyUnmwP.js} +1 -1
  189. package/storybook-static/assets/frame.canvas-E5n9h6j1.js +1 -0
  190. package/storybook-static/assets/{handlers-yVPwH_Nz.js → handlers-F7GUfMqr.js} +17 -14
  191. package/storybook-static/assets/http-request-BWeEEBkP.js +1 -0
  192. package/storybook-static/assets/{http-request.stories-CBFJS2Ws.js → http-request.stories-wyX5-QOv.js} +1 -1
  193. package/storybook-static/assets/iframe-BS_DPWl0.js +199 -0
  194. package/storybook-static/assets/index-CGuyH0k-.js +240 -0
  195. package/storybook-static/assets/index-DB7LLObI.js +1 -0
  196. package/storybook-static/assets/index-DO1nmyvI.js +11 -0
  197. package/storybook-static/assets/index-V1EGs-wm.js +621 -0
  198. package/storybook-static/assets/{local-storage.test.stories-C0Yzy6Am.js → local-storage.test.stories-BxOhsf1k.js} +1 -1
  199. package/storybook-static/assets/{location-element.test.stories-DNFrEu5A.js → location-element.test.stories-DqhvvUoa.js} +1 -1
  200. package/storybook-static/assets/module-url.test.stories-C1gG9G7Y.js +142 -0
  201. package/storybook-static/assets/preview-1xJJ3sKE.js +1 -0
  202. package/storybook-static/assets/preview-Bn8igYMp.js +1 -0
  203. package/storybook-static/assets/preview-CTOeX_lO.js +1 -0
  204. package/storybook-static/assets/preview-Cwy1XFu2.js +2 -0
  205. package/storybook-static/assets/preview-D6sehqkw.js +50 -0
  206. package/storybook-static/assets/preview-DfTudP20.js +1 -0
  207. package/storybook-static/assets/{set-url.test.stories-BBfLxv2u.js → set-url.test.stories-BKQNdknJ.js} +1 -1
  208. package/storybook-static/assets/{slice-events.test.stories-HcXF8XQI.js → slice-events.test.stories-ChqULCeA.js} +1 -1
  209. package/storybook-static/assets/{slots.test.stories-i6mnIFM2.js → slots.test.stories-BlyLoCRe.js} +1 -1
  210. package/storybook-static/assets/{version-select.test.stories-BsUFH6Va.js → version-select.test.stories-CPGSh1tR.js} +1 -1
  211. package/storybook-static/assets/xslt-conditionals.test.stories-YC6QPqWZ.js +633 -0
  212. package/storybook-static/assets/xslt-if.test.stories-BRSWy2-x.js +71 -0
  213. package/storybook-static/demo/a.html +10 -3
  214. package/storybook-static/demo/a.svg +26 -26
  215. package/storybook-static/demo/attributes.html +153 -0
  216. package/storybook-static/demo/external-templates-sb-6.html +42 -0
  217. package/storybook-static/demo/external-templates-sb-7.html +42 -0
  218. package/storybook-static/demo/html-template.html +5 -4
  219. package/storybook-static/demo/module-url-sb-2.html +46 -0
  220. package/storybook-static/demo/module-url-sb-4.html +48 -0
  221. package/storybook-static/demo/module-url-sb-5.html +53 -0
  222. package/storybook-static/demo/s.xml +3859 -7
  223. package/storybook-static/demo/s.xslt +13 -48
  224. package/storybook-static/demo/s1.xml +3706 -0
  225. package/storybook-static/demo/ss.html +13 -4
  226. package/storybook-static/iframe.html +2 -2
  227. package/storybook-static/index.html +6 -10
  228. package/storybook-static/index.json +1 -1
  229. package/storybook-static/mockServiceWorker.js +31 -8
  230. package/storybook-static/project.json +1 -1
  231. package/storybook-static/sb-addons/essentials-actions-2/manager-bundle.js +3 -0
  232. package/storybook-static/sb-addons/essentials-backgrounds-4/manager-bundle.js +8 -8
  233. package/storybook-static/sb-addons/essentials-controls-1/manager-bundle.js +394 -0
  234. package/storybook-static/sb-addons/essentials-docs-3/manager-bundle.js +233 -0
  235. package/storybook-static/sb-addons/essentials-measure-7/manager-bundle.js +1 -1
  236. package/storybook-static/sb-addons/essentials-outline-8/manager-bundle.js +1 -1
  237. package/storybook-static/sb-addons/essentials-toolbars-6/manager-bundle.js +1 -1
  238. package/storybook-static/sb-addons/essentials-viewport-5/manager-bundle.js +1 -1
  239. package/storybook-static/sb-addons/interactions-9/manager-bundle.js +58 -58
  240. package/storybook-static/sb-manager/globals-module-info.js +9 -0
  241. package/storybook-static/sb-manager/globals-runtime.js +10719 -10473
  242. package/storybook-static/sb-manager/runtime.js +4944 -6321
  243. package/coverage/src/stories/attributes.test.stories.ts/coverage.svg +0 -10
  244. package/coverage/src/stories/attributes.test.stories.ts.html +0 -814
  245. package/coverage/src/stories/css.test.stories.ts/coverage.svg +0 -10
  246. package/coverage/src/stories/css.test.stories.ts.html +0 -460
  247. package/coverage/src/stories/dom-merge.test.stories.ts/coverage.svg +0 -10
  248. package/coverage/src/stories/dom-merge.test.stories.ts.html +0 -706
  249. package/coverage/src/stories/external-template.test.stories.ts.html +0 -865
  250. package/coverage/src/stories/form.test.stories.ts/coverage.svg +0 -10
  251. package/coverage/src/stories/form.test.stories.ts.html +0 -661
  252. package/coverage/src/stories/local-storage.test.stories.ts.html +0 -1315
  253. package/coverage/src/stories/location-element.test.stories.ts.html +0 -523
  254. package/coverage/src/stories/module-url.test.stories.ts/coverage.svg +0 -10
  255. package/coverage/src/stories/module-url.test.stories.ts.html +0 -640
  256. package/coverage/src/stories/set-url.test.stories.ts/coverage.svg +0 -10
  257. package/coverage/src/stories/set-url.test.stories.ts.html +0 -433
  258. package/coverage/src/stories/slice-events.test.stories.ts/coverage.svg +0 -10
  259. package/coverage/src/stories/slice-events.test.stories.ts.html +0 -952
  260. package/coverage/src/stories/slots.test.stories.ts/coverage.svg +0 -10
  261. package/coverage/src/stories/slots.test.stories.ts.html +0 -742
  262. package/coverage/src/stories/version-select.test.stories.ts/coverage.svg +0 -10
  263. package/coverage/src/stories/version-select.test.stories.ts.html +0 -397
  264. package/dist/custom-element-D2wf_rqP.js +0 -576
  265. package/dist/custom-element-Dtzhbjkc.cjs +0 -97
  266. package/dist/http-request-DPrY7mGh.cjs +0 -1
  267. package/storybook-static/assets/Color-F6OSRLHC-BU3iy8jH.js +0 -1
  268. package/storybook-static/assets/Configure-DN6ifayP.js +0 -165
  269. package/storybook-static/assets/DocsRenderer-CFRXHY34-BaVEufDj.js +0 -2
  270. package/storybook-static/assets/custom-element-uuAtIYWS.js +0 -97
  271. package/storybook-static/assets/entry-preview-DHVXbf3x.js +0 -26
  272. package/storybook-static/assets/entry-preview-docs-BbcIMweR.js +0 -2
  273. package/storybook-static/assets/http-request-DNq59pnj.js +0 -1
  274. package/storybook-static/assets/iframe-CJEL_4Nu.js +0 -2
  275. package/storybook-static/assets/index-BcZLpTeD.js +0 -8
  276. package/storybook-static/assets/index-CxRwF5Or.js +0 -234
  277. package/storybook-static/assets/index-D-8MO0q_.js +0 -1
  278. package/storybook-static/assets/index-D5fBh-7N.js +0 -1
  279. package/storybook-static/assets/index-DM-KBPdl.js +0 -1
  280. package/storybook-static/assets/index-RSFf30w1.js +0 -1
  281. package/storybook-static/assets/index-SnjB5uV8.js +0 -769
  282. package/storybook-static/assets/module-url.test.stories-CXibF5Ta.js +0 -208
  283. package/storybook-static/assets/preview-BhhEZcNS.js +0 -1
  284. package/storybook-static/assets/preview-Bnd0XhaF.js +0 -52
  285. package/storybook-static/assets/preview-CNKoaWES.js +0 -1
  286. package/storybook-static/assets/preview-DAeyCMnM.js +0 -1
  287. package/storybook-static/assets/preview-DHPc-V4N.js +0 -1
  288. package/storybook-static/assets/preview-DJMlNTk8.js +0 -2
  289. package/storybook-static/assets/preview-DYzi3Z2p.js +0 -1
  290. package/storybook-static/sb-addons/chromatic-com-storybook-10/manager-bundle.js +0 -333
  291. package/storybook-static/sb-addons/chromatic-com-storybook-10/manager-bundle.js.LEGAL.txt +0 -40
  292. package/storybook-static/sb-addons/essentials-actions-3/manager-bundle.js +0 -3
  293. package/storybook-static/sb-addons/essentials-controls-2/manager-bundle.js +0 -391
  294. package/storybook-static/sb-addons/links-1/manager-bundle.js +0 -3
  295. package/storybook-static/sb-preview/globals.js +0 -33
  296. package/storybook-static/sb-preview/runtime.js +0 -7174
  297. package/test-runner-jest.config.js +0 -15
  298. /package/storybook-static/sb-addons/{essentials-actions-3 → essentials-actions-2}/manager-bundle.js.LEGAL.txt +0 -0
  299. /package/storybook-static/sb-addons/{essentials-controls-2 → essentials-controls-1}/manager-bundle.js.LEGAL.txt +0 -0
  300. /package/storybook-static/sb-addons/{links-1 → essentials-docs-3}/manager-bundle.js.LEGAL.txt +0 -0
@@ -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-&lt;role&gt;-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-&lt;role&gt;-font-size</text>
40
+ <text x="125" y="455" class="mono">--cem-typography-&lt;role&gt;-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-&lt;level&gt;-…</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>