@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
@@ -1,363 +1,570 @@
1
- <!DOCTYPE html>
2
- <html lang="en" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
6
- <title>Components - custom-element - Material Design</title>
7
- <link href="../../custom-element/demo/wc-square.svg" rel="icon"/>
8
- <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"/>
9
- <link crossorigin="anonymous" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css"
10
- integrity="sha384-DyZ88mC6Up2uqS4h/KRgHuoeGwBcD4Ng9SiP4dIRy0EXTlnuz47vAwmeGwVChigm" rel="stylesheet"/>
11
-
12
- <script type="importmap">
13
- {
14
- "imports": {
15
- "@epa-wg/": "../../"
16
- }
17
- }
18
- </script>
19
- <script src="../../custom-element/module-url.js" type="module"></script>
20
- <script src="../../custom-element/custom-element.js" type="module"></script>
21
- <style>
22
- @import "../angular.css";
23
- @import "../material.css";
24
- @import "../theme/semantic.css";
25
- @import "../demo.css";
26
- main{
27
- display: flex; flex-wrap: wrap;
28
- gap: 3rem;
29
- padding: 5rem;
30
- &>p{ min-width: 90%; }
31
- html-demo-element{flex:1; width: 100%; }
32
- }
33
- </style>
34
- </head>
35
-
36
- <body>
37
- <custom-element hidden src="./icon-link.html#cem-icon-link" tag="cem-icon-link"></custom-element>
38
-
39
-
40
- <header class="cem-theme-teal">
41
- <custom-element src="../index.html#nav-head" ></custom-element>
42
- </header>
43
- <pre>
44
- TODO
45
- * bypass all INPUT attributes
46
- * error handling
47
- * link to form error handling
48
- * docs
49
- </pre>
50
- <main>
51
- <p><code>cem-input</code> is autocomplete component from &lt;custom-element&gt; Material suite based on the
52
- <a href="https://material.io/components" >Material Design specification</a>.
53
- </p>
54
- <custom-element tag="cem-input" hidden>
55
- <template>
56
- <attribute name="name" ></attribute>
57
- <attribute name="label" ></attribute>
58
- <attribute name="type" ></attribute>
59
- <attribute name="autocapitalize" ></attribute>
60
- <attribute name="disabled" ></attribute>
61
- <attribute name="multiple" ></attribute>
62
- <attribute name="readonly" ></attribute>
63
- <attribute name="required" ></attribute>
64
- <attribute name="incremental" ></attribute>
65
- <attribute name="max" ></attribute>
66
- <attribute name="maxlength" ></attribute>
67
- <attribute name="min" ></attribute>
68
- <attribute name="minlength" ></attribute>
69
- <attribute name="size" ></attribute>
70
- <attribute name="step" ></attribute>
71
- <attribute name="tabindex" ></attribute>
72
- <attribute name="autocomplete" ></attribute>
73
- <attribute name="form" ></attribute>
74
- <attribute name="id" ></attribute>
75
- <attribute name="list" ></attribute>
76
- <attribute name="pattern" ></attribute>
77
- <attribute name="placeholder" ></attribute>
78
- <attribute name="title" ></attribute>
79
- <attribute name="value" ></attribute>
80
-
81
- <style>
82
- dce-root
83
- {
84
- display: flex; flex-direction: column; justify-content: center;
85
- --input-padding: 0;
86
-
87
- --cem-input-outline: inset 0 -1px 0 black;
88
- --cem-input-outline-focus: inset 0 -3px 0 var(--cem-outline-color-focus);
89
- --cem-input-container-shape: 0.25rem;
90
- --cem-input-background-color: var(--cem-list-background-color);
91
- --cem-input-container-elevation-shadow: 0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);
92
-
93
- background-color: var(--cem-filled-text-field-container-color, var(--cem-app-surface-variant));
94
-
95
- &>label
96
- { display: flex; flex-direction: column; justify-content: center;
97
- flex: 1; padding: 0.5rem 1rem;
98
- box-shadow: var(--cem-input-outline);
99
- transition: var(--drop-transition);
100
- box-sizing: border-box;
101
- min-height: 3.5rem;
102
- color: var(--cem-filled-text-field-label-text-color);
103
-
104
- input
105
- { background: none; padding: var(--input-padding);
106
- &,&:focus,&:focus-visible{ border: none; outline: none; }
107
- &:placeholder-shown{ border: none; outline:none; }
108
- &[value=""]{ height: 0; }
109
- &:focus,&:focus-visible,&[placeholder*=""]{ height: auto; }
110
-
111
- color: var(--cem-filled-text-field-input-text-color, var(--cem-app-on-surface));
112
- caret-color: var(--cem-filled-text-field-caret-color, var(--cem-app-primary));
113
- font-size: 1rem;
114
- transition: var(--drop-transition);
115
- }
116
- }
117
- &:focus-within
118
- {
119
- &> label
120
- { box-shadow: var(--cem-input-outline-focus);
121
- font-size: small; justify-content: space-between;
122
- }
123
- }
124
- label:has( input:not([value=""]) ){ font-size: small; justify-content: space-between;}
125
- slice{display: none;}
126
- }
127
- </style>
128
- <slot name="head"></slot>
129
- <slot name="input"><label>{$label}<xhtml:input
130
- type="{$type}"
131
- value="{//selected ?? $value}"
132
- slice="selected" slice-event="input"
133
- >
134
- <if test="$required" ><attribute name="required" >{$required }</attribute></if>
135
- <if test="$autocapitalize" ><attribute name="autocapitalize" >{$autocapitalize }</attribute></if>
136
- <if test="$disabled" ><attribute name="disabled" >{$disabled }</attribute></if>
137
- <if test="$multiple" ><attribute name="multiple" >{$multiple }</attribute></if>
138
- <if test="$readonly" ><attribute name="readonly" >{$readonly }</attribute></if>
139
- <if test="$incremental" ><attribute name="incremental" >{$incremental }</attribute></if>
140
- <if test="$max" ><attribute name="max" >{$max }</attribute></if>
141
- <if test="$maxlength" ><attribute name="maxlength" >{$maxlength }</attribute></if>
142
- <if test="$min" ><attribute name="min" >{$min }</attribute></if>
143
- <if test="$minlength" ><attribute name="minlength" >{$minlength }</attribute></if>
144
- <if test="$size" ><attribute name="size" >{$size }</attribute></if>
145
- <if test="$step" ><attribute name="step" >{$step }</attribute></if>
146
- <if test="$tabindex" ><attribute name="tabindex" >{$tabindex }</attribute></if>
147
- <if test="$autocomplete" ><attribute name="autocomplete" >{$autocomplete }</attribute></if>
148
- <if test="$form" ><attribute name="form" >{$form }</attribute></if>
149
- <if test="$id" ><attribute name="id" >{$id }</attribute></if>
150
- <if test="$list" ><attribute name="list" >{$list }</attribute></if>
151
- <if test="$name" ><attribute name="name" >{$name }</attribute></if>
152
- <if test="$pattern" ><attribute name="pattern" >{$pattern }</attribute></if>
153
- <if test="$placeholder" ><attribute name="placeholder" >{$placeholder }</attribute></if>
154
- <if test="$title" ><attribute name="title" >{$title }</attribute></if>
155
-
156
- <slice name="focused" slice-event="blur" slice-value="0"></slice>
157
- <slice name="focused" slice-event="focus" slice-value="1"></slice>
158
- <slice name="filter" slice-event="blur input" slice-value="//selected"></slice>
159
- </xhtml:input></label></slot>
160
- <if test="$required" >$required:{$required }</if>
161
-
162
- <slot name="warn"></slot>
163
- <slot name="foot"></slot>
164
- </template>
165
- </custom-element>
166
-
167
- <custom-element tag="cem-demo-input-types" hidden>
168
- <template>
169
- <attribute name="value" select="//type"></attribute>
170
- <label>Type:
171
- <select slice="type">
172
- <option value="text" > text </option>
173
- <option value="date" > date </option>
174
- <option value="datetime-local"> datetime-local </option>
175
- <option value="email" > email </option>
176
- <option value="month" > month </option>
177
- <option value="number" > number </option>
178
- <option value="password" > password </option>
179
- <option value="tel" > tel </option>
180
- <option value="text" > text </option>
181
- <option value="time" > time </option>
182
- <option value="url" > url </option>
183
- <option value="week" > week </option>
184
- <optgroup label="other types do not make a sense for cem-input">
185
- <option value="button" > button </option>
186
- <option value="checkbox" > checkbox </option>
187
- <option value="color" > color </option>
188
- <option value="file" > file </option>
189
- <option value="hidden" > hidden </option>
190
- <option value="image" > image </option>
191
- <option value="radio" > radio </option>
192
- <option value="range" > range </option>
193
- <option value="reset" > reset </option>
194
- <option value="search" > search </option>
195
- <option value="submit" > submit </option>
196
- </optgroup>
197
- </select>
198
- </label>
199
- </template>
200
- </custom-element>
201
-
202
- <custom-element tag="cem-demo-cb">
203
- <template>
204
- <attribute name="slice" ></attribute>
205
- <attribute name="value" select="//val"></attribute>
206
- <label><input type="checkbox" value="{$slice}" slice="val" /> {$slice} </label>
207
- </template>
208
- </custom-element>
209
-
210
- <custom-element tag="cem-demo-tx">
211
- <template>
212
- <attribute name="slice" ></attribute>
213
- <attribute name="value" select="//val"></attribute>
214
- <style>input,label{ width: 100%; } </style>
215
- <label>{$slice}<input slice="val" /></label>
216
- </template>
217
- </custom-element>
218
-
219
- <custom-element tag="cem-demo-in">
220
- <template>
221
- <attribute name="slice" ></attribute>
222
- <attribute name="value" select="//val"></attribute>
223
- <style>input,label{ width: 100%; } </style>
224
- <label>{$slice}<input slice="val" type="number"/></label>
225
- </template>
226
- </custom-element>
227
-
228
- <html-demo-element legend="No value" description="Focus to see the cursor in input with label shifted upward ">
229
- <template>
230
- <cem-input label="String field" ></cem-input>
231
- </template>
232
- </html-demo-element>
233
-
234
- <html-demo-element legend="No value with placeholder" description="focus to see the placeholder text">
235
- <template>
236
- <cem-input label="Number" type="number" placeholder="Enter the numeric value">
237
- </cem-input>
238
- </template>
239
- </html-demo-element>
240
-
241
- <html-demo-element legend="Value defined" description="The value should be visible" >
242
- <template>
243
- <cem-input label="Text" type="text" value="abc"></cem-input>
244
- </template>
245
- </html-demo-element>
246
-
247
- <html-demo-element legend="head and foot slots" >
248
- <div slot="description"><code>head</code> slot inserted above input,
249
- <code>foot</code> slot injected bellow</div>
250
- <p>Those slots can be used for error or hint UI; persistent or triggered by hover/focus.<br/>
251
- <a href="./autocomplete.html">cem-autocomplete</a> uses <code>foot</code> slot for
252
- <a href="./menu.html">menu</a> with suggestions.
253
- </p>
254
- <template>
255
- <cem-input label="slots sample" type="text" placeholder="Enter the fruit name">
256
- <div slot="head"> 🍎 <code>head</code> slot </div>
257
- <div slot="foot"> 🍓 <code>foot</code> slot </div>
258
- </cem-input>
259
- </template>
260
- </html-demo-element>
261
-
262
- <html-demo-element legend="Native error support" >
263
- <div slot="descrition">Native <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation">
264
- Form validation</a> is supported. See also <a href="../../custom-element/demo/form.html"><code>custom-element</code> form handling</a> </div>
265
- <div><code>required</code> attribute would trigger the system message if the field is empty.</div>
266
- <div>
267
- Press Next button to see the browser error popup.</div>
268
- <template>
269
- <form>
270
- <cem-input required></cem-input>
271
- <button>Next</button>
272
- </form>
273
- </template>
274
- </html-demo-element>
275
-
276
- <html-demo-element legend="Error message">
277
- <div slot="description"><code>warn</code> slot is used for warning message</div>
278
- <template>
279
- <form>
280
- <cem-input required></cem-input>
281
- <button>Next</button>
282
- </form>
283
- </template>
284
- </html-demo-element>
285
-
286
-
287
- <html-demo-element legend="INPUT field attributes playground" id="play">
288
- <div slot="descrition">
289
- <p> Underlying implementation uses
290
- <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">HTML input</a>.
291
- All its attributes are supported.
292
- </p>
293
- <custom-element >
294
- <template>
295
- <style>
296
- &>dce-root
297
- { display: flex; flex-wrap: wrap; gap: 2rem; align-items: center;
298
- &>*{ flex: 1 1 10rem; }
299
- }
300
- label{ display: block; }
301
- </style>
302
- <cem-demo-cb slice="autocapitalize" ></cem-demo-cb>
303
- <cem-demo-cb slice="disabled" ></cem-demo-cb>
304
- <cem-demo-cb slice="multiple" ></cem-demo-cb>
305
- <cem-demo-cb slice="readonly" ></cem-demo-cb>
306
- <cem-demo-cb slice="required" ></cem-demo-cb>
307
- <cem-demo-cb slice="incremental" ></cem-demo-cb>
308
- <cem-demo-in slice="max" ></cem-demo-in>
309
- <cem-demo-in slice="maxlength" ></cem-demo-in>
310
- <cem-demo-in slice="min" ></cem-demo-in>
311
- <cem-demo-in slice="minlength" ></cem-demo-in>
312
- <cem-demo-in slice="size" ></cem-demo-in>
313
- <cem-demo-in slice="step" ></cem-demo-in>
314
- <cem-demo-in slice="tabindex" ></cem-demo-in>
315
- <cem-demo-tx slice="autocomplete" ></cem-demo-tx>
316
- <cem-demo-tx slice="form" ></cem-demo-tx>
317
- <cem-demo-tx slice="id" ></cem-demo-tx>
318
- <cem-demo-tx slice="list" ></cem-demo-tx>
319
- <cem-demo-tx slice="name" ></cem-demo-tx>
320
- <cem-demo-tx slice="pattern" ></cem-demo-tx>
321
- <cem-demo-tx slice="placeholder" ></cem-demo-tx>
322
- <cem-demo-tx slice="title" ></cem-demo-tx>
323
- <cem-demo-tx slice="value" ></cem-demo-tx>
324
- <cem-demo-input-types slice="type"></cem-demo-input-types>
325
-
326
- <form action="#play">
327
- <cem-input type="{//type}" value="123">
328
- <if test="//autocapitalize = 'autocapitalize'" ><attribute name="autocapitalize" ></attribute></if>
329
- <if test="//disabled = 'disabled'" ><attribute name="disabled" ></attribute></if>
330
- <if test="//multiple = 'multiple'" ><attribute name="multiple" ></attribute></if>
331
- <if test="//readonly = 'readonly'" ><attribute name="readonly" ></attribute></if>
332
- <if test="//required = 'required'" ><attribute name="required" ></attribute></if>
333
- <if test="//incremental = 'incremental'" ><attribute name="incremental" ></attribute></if>
334
- <if test="not(//max = '')" ><attribute name="max" >{//max}</attribute></if>
335
- <if test="not(//maxlength = '')" ><attribute name="maxlength" >{//maxlength}</attribute></if>
336
- <if test="not(//min = '')" ><attribute name="min" >{//min}</attribute></if>
337
- <if test="not(//minlength = '')" ><attribute name="minlength" >{//minlength}</attribute></if>
338
- <if test="not(//step = '')" ><attribute name="step" >{//step}</attribute></if>
339
- <if test="not(//tabindex = '')" ><attribute name="tabindex" >{//tabindex}</attribute></if>
340
- </cem-input>
341
- <button>Next</button>
342
- <if test="//required = 'required'" >//req:{//required }</if>
343
-
344
- </form>
345
- </template>
346
- </custom-element>
347
-
348
- </div>
349
- <template>
350
- </template>
351
- </html-demo-element>
352
-
353
- </main>
354
- <footer>
355
- <hr/>
356
- Powered by Syngrafact Corp. ©2024.<br/>
357
- <a href="../../LICENSE"> Code and documentation licensed under an Apache License 2.0 </a>
358
- </footer>
359
- <!--<script type="module" src="./html-demo-element.js"></script>-->
360
- <script type="module" src="https://unpkg.com/html-demo-element@1/html-demo-element.js"></script>
361
-
362
- </body>
1
+ <!DOCTYPE html>
2
+ <html lang="en" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
6
+ <title>Components - custom-element - Material Design</title>
7
+ <link href="../../custom-element/demo/wc-square.svg" rel="icon"/>
8
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"/>
9
+ <link crossorigin="anonymous" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css"
10
+ integrity="sha384-DyZ88mC6Up2uqS4h/KRgHuoeGwBcD4Ng9SiP4dIRy0EXTlnuz47vAwmeGwVChigm" rel="stylesheet"/>
11
+
12
+ <script type="importmap">
13
+ {
14
+ "imports": {
15
+ "@epa-wg/": "../../"
16
+ }
17
+ }
18
+ </script>
19
+ <script src="../../custom-element/module-url.js" type="module"></script>
20
+ <script src="../../custom-element/custom-element.js" type="module"></script>
21
+ <style>
22
+ @import "../angular.css";
23
+ @import "../material.css";
24
+ @import "../theme/semantic.css";
25
+ @import "../demo.css";
26
+ main{
27
+ display: flex; flex-wrap: wrap;
28
+ gap: 3rem;
29
+ padding: 5rem;
30
+ &>p{ min-width: 90%; }
31
+ html-demo-element{flex:1; width: 100%; }
32
+ }
33
+ html-demo-element.flat-attr{
34
+ .token.attr-name:before{content:'\A '; }
35
+ }
36
+ </style>
37
+ </head>
38
+
39
+ <body>
40
+ <custom-element hidden src="./icon-link.html#cem-icon-link" tag="cem-icon-link"></custom-element>
41
+ <custom-element hidden src="./icon.html#cem-icon" tag="cem-icon"></custom-element>
42
+
43
+
44
+ <header class="cem-theme-teal">
45
+ <custom-element src="../index.html#nav-head" ></custom-element>
46
+ </header>
47
+ <pre>
48
+ TODO
49
+ * error handling & styling
50
+ * link to form error handling
51
+ * password show text 👁️ & clear button
52
+ * slice propagation to owner DCE
53
+ * tokens as in https://material-web.dev/components/text-field/#filled-text-field-tokens
54
+ or by css in https://material.angular.io/components/input/overview
55
+ * outlined variation
56
+ * docs w/ how to use
57
+ </pre>
58
+ <main>
59
+ <section>
60
+ <p><code>cem-input</code> is text input component from &lt;custom-element&gt; Material suite based on the
61
+ <a href="https://material.io/components" >Material Design specification</a>,
62
+ <a href="https://m3.material.io/components/text-fields/specs" >text fields</a> in particular.
63
+ </p>
64
+ <p>Other implementations: <a href="https://material-web.dev/components/text-field/">Material Web</a>(Lit),
65
+ <a href="https://material.angular.io/components/input/overview">Angular Material</a>
66
+ </p>
67
+ <h1>Attributes</h1>
68
+ <div> <code>leading, label, trailing, supporting </code> attributes define the text when slot
69
+ with same name is omitted.
70
+ </div>
71
+ <div> <code>leading</code>, <code>trailing</code> attributes defines the
72
+ <a href="./icon.html">cem-icon</a> source.
73
+ </div>
74
+ <div> <code>label</code> attribute defines the label text.
75
+ </div>
76
+ <h1>Slots</h1>
77
+ <div> <code>leading</code> placeholder for leading icon</div>
78
+ <div> <code>label</code> placeholder for label text</div>
79
+ <div> <code>trailing</code> placeholder for trailing icon</div>
80
+ <div> <code>supporting</code> placeholder for supporting text</div>
81
+ <div> <code>warn</code> warning text, </div>
82
+ <p>
83
+ <code>warn</code> slot content would overlap the <code>supporting</code> slot when not empty.
84
+ Default slot implementation is sensitive to <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement/validationMessage"
85
+ >validationMessage property</a>.
86
+ </p>
87
+ <details>
88
+ <summary>Error handling and styling</summary>
89
+ Something small enough to escape casual notice.
90
+ </details>
91
+
92
+ </section>
93
+ <custom-element tag="cem-input" hidden>
94
+ <template id="cem-input">
95
+ <attribute name="value" select="//selected[//selected/event] ?? //attributes/@value" ></attribute>
96
+ <attribute name="name" ></attribute>
97
+ <attribute name="type" ></attribute>
98
+ <attribute name="autocapitalize" ></attribute>
99
+ <attribute name="disabled" ></attribute>
100
+ <attribute name="multiple" ></attribute>
101
+ <attribute name="readonly" ></attribute>
102
+ <attribute name="required" ></attribute>
103
+ <attribute name="incremental" ></attribute>
104
+ <attribute name="max" ></attribute>
105
+ <attribute name="maxlength" ></attribute>
106
+ <attribute name="min" ></attribute>
107
+ <attribute name="minlength" ></attribute>
108
+ <attribute name="size" ></attribute>
109
+ <attribute name="step" ></attribute>
110
+ <attribute name="tabindex" ></attribute>
111
+ <attribute name="autocomplete" ></attribute>
112
+ <attribute name="form" ></attribute>
113
+ <attribute name="id" ></attribute>
114
+ <attribute name="list" ></attribute>
115
+ <attribute name="pattern" ></attribute>
116
+ <attribute name="placeholder" ></attribute>
117
+ <attribute name="title" ></attribute>
118
+ <attribute name="leading" aria-description="leading icon" ></attribute>
119
+ <attribute name="trailing" aria-description="trailing icon" ></attribute>
120
+ <attribute name="label" aria-description="label text" ></attribute>
121
+ <attribute name="supporting" aria-description="Supporting text" ></attribute>
122
+
123
+ <style>
124
+
125
+ &>dce-root
126
+ {
127
+ display: flex; flex-direction: column; justify-content: center;
128
+ --input-padding: 0;
129
+
130
+ --cem-input-container-shape: 0.25rem;
131
+ --cem-input-background-color: var(--cem-list-background-color);
132
+ --cem-input-container-elevation-shadow: 0px 3px 1px -2px rgba(0, 0, 0, .2), 0px 2px 2px 0px rgba(0, 0, 0, .14), 0px 1px 5px 0px rgba(0, 0, 0, .12);
133
+ --cem-input-focus-transition: all 280ms cubic-bezier(0.4, 0, 0.2, 1);
134
+
135
+ &:has(input:invalid,input:user-invalid,input:out-of-range, .warn>*:not(:empty) )
136
+ { --cem-filled-text-field-label-text-color: var(--alert-color,red);
137
+ --cem-input-outline-color:var(--cem-filled-text-field-label-text-color);
138
+ --cem-input-outline: inset 0 -1px 0 var(--cem-input-outline-color);
139
+ --cem-outline-color-focus: var(--cem-input-outline-color);
140
+ color: var(--cem-filled-text-field-label-text-color);
141
+ .supporting{ display: none; }
142
+ }
143
+ &>label
144
+ { display: flex; flex: 1; gap: 0.5rem;
145
+ padding: 0.5rem 1rem;
146
+ background-color: var(--cem-filled-text-field-container-color, var(--cem-app-surface-variant));
147
+ &:hover
148
+ { --cem-filled-text-field-container-color: var(--cem-filled-text-field-container-color-hover,silver);
149
+ --cem-input-outline-color:var(--text-color,black);
150
+ box-shadow: inset 0 -1px 0 var(--cem-input-outline-color,black);
151
+ color:var(--text-color,black)
152
+ }
153
+ box-shadow: var(--cem-input-outline);
154
+ transition: var(--drop-transition);
155
+ box-sizing: border-box;
156
+ min-height: 3.5rem;
157
+ color: var(--cem-filled-text-field-label-text-color);
158
+ position: relative;
159
+ &>.entry{ display: flex;flex-direction: column; justify-content: center;flex:1; }
160
+ label{display: flex;}
161
+ input
162
+ { background: none; padding: var(--input-padding);
163
+ &,&:focus,&:focus-visible{ border: none; outline: none; }
164
+ &:placeholder-shown{ border: none; outline:none; }
165
+ &[value=""]{ height: 0; }
166
+ &:focus,&:focus-visible,&[placeholder*=""]{ height: auto; }
167
+
168
+ color: var(--cem-filled-text-field-input-text-color, var(--cem-app-on-surface));
169
+ caret-color: var(--cem-filled-text-field-caret-color, var(--cem-app-primary));
170
+ font-size: 1rem;
171
+ transition: var(--drop-transition);
172
+ }
173
+ &:after{ display: block; width: 0; height: 0; content: ' ';
174
+ left:0;
175
+ transition: var(--cem-input-focus-transition);
176
+ position: absolute; align-self: center;
177
+ bottom: var(--cem-focus-outline-height);
178
+ }
179
+ }
180
+ &:focus-within
181
+ {
182
+ &> label
183
+ { font-size: small; justify-content: space-between;
184
+ color: var(--cem-outline-color-focus);
185
+ input{ caret-color: var(--cem-outline-color-focus); }
186
+ &:after{ width: 100%; height: var(--cem-focus-outline-height);
187
+ left:0;
188
+ background: none;
189
+ box-shadow: 0 var(--cem-focus-outline-height) 0 var(--cem-outline-color-focus);
190
+ align-self: center;
191
+ transition: var(--cem-input-focus-transition);
192
+ }
193
+ }
194
+ }
195
+ label:has( input:not([value=""]) ){ font-size: small; justify-content: space-between;}
196
+ slice{display: none;}
197
+ .warn,.supporting
198
+ {
199
+ padding: 0.25rem 1rem;
200
+ font-size: var(--cem-form-field-subscript-text-size, var(--cem-sys-body-small-size));
201
+ }
202
+ [slot="trailing"],[slot="leading"]{display: flex;}
203
+ }
204
+ </style>
205
+ <label>
206
+ <slot name="leading">
207
+ <if test="$leading">
208
+ <cem-icon image="{$leading}"></cem-icon>
209
+ </if>
210
+ </slot>
211
+ <div class="entry">
212
+ <slot name="label">
213
+ <if test="$label">
214
+ <span class="label">{$label}</span>
215
+ </if>
216
+ </slot>
217
+ <slot name="input">
218
+ <xhtml:input
219
+ type="{$type}"
220
+ value="{/datadom/attributes/value }"
221
+ slice="selected" slice-event="input"
222
+ size="2"
223
+ >
224
+ <if test="hasBoolAttribute($required)" ><attribute name="required" >{$required }</attribute></if>
225
+ <if test="hasBoolAttribute($disabled)" ><attribute name="disabled" >{$disabled }</attribute></if>
226
+ <if test="hasBoolAttribute($multiple)" ><attribute name="multiple" >{$multiple }</attribute></if>
227
+ <if test="hasBoolAttribute($readonly)" ><attribute name="readonly" >{$readonly }</attribute></if>
228
+ <if test="hasBoolAttribute($incremental)" ><attribute name="incremental" >{$incremental }</attribute></if>
229
+ <if test="$max" ><attribute name="max" >{$max }</attribute></if>
230
+ <if test="$maxlength" ><attribute name="maxlength" >{$maxlength }</attribute></if>
231
+ <if test="$min" ><attribute name="min" >{$min }</attribute></if>
232
+ <if test="$minlength" ><attribute name="minlength" >{$minlength }</attribute></if>
233
+ <if test="$size" ><attribute name="size" >{$size }</attribute></if>
234
+ <if test="$step" ><attribute name="step" >{$step }</attribute></if>
235
+ <if test="$tabindex" ><attribute name="tabindex" >{$tabindex }</attribute></if>
236
+ <if test="$autocapitalize" ><attribute name="autocapitalize" >{$autocapitalize }</attribute></if>
237
+ <if test="$autocomplete" ><attribute name="autocomplete" >{$autocomplete }</attribute></if>
238
+ <if test="$form" ><attribute name="form" >{$form }</attribute></if>
239
+ <if test="$id" ><attribute name="id" >{$id }</attribute></if>
240
+ <if test="$list" ><attribute name="list" >{$list }</attribute></if>
241
+ <if test="$name" ><attribute name="name" >{$name }</attribute></if>
242
+ <if test="$pattern" ><attribute name="pattern" >{$pattern }</attribute></if>
243
+ <if test="$placeholder" ><attribute name="placeholder" >{$placeholder }</attribute></if>
244
+ <if test="$title" ><attribute name="title" >{$title }</attribute></if>
245
+
246
+ <slice name="focused" slice-event="blur" slice-value="0"></slice>
247
+ <slice name="focused" slice-event="focus" slice-value="1"></slice>
248
+ </xhtml:input>
249
+ </slot>
250
+ </div>
251
+ <slot name="trailing">
252
+ <if test="$trailing">
253
+ <cem-icon image="{$trailing}"></cem-icon>
254
+ </if>
255
+ </slot>
256
+ </label>
257
+ <div class="supporting">
258
+ <slot name="supporting">
259
+ <if test="$supporting">
260
+ {$supporting}
261
+ </if>
262
+ </slot>
263
+ </div>
264
+ <div class="warn">
265
+ <slot name="warn">{//warn}</slot>
266
+ </div>
267
+ </template>
268
+ </custom-element>
269
+
270
+ <custom-element tag="cem-demo-input-types" hidden>
271
+ <template>
272
+ <attribute name="value" select="//type"></attribute>
273
+ <label>Type:
274
+ <select slice="type">
275
+ <option value="text" > text </option>
276
+ <option value="date" > date </option>
277
+ <option value="datetime-local"> datetime-local </option>
278
+ <option value="email" > email </option>
279
+ <option value="month" > month </option>
280
+ <option value="number" > number </option>
281
+ <option value="password" > password </option>
282
+ <option value="tel" > tel </option>
283
+ <option value="text" > text </option>
284
+ <option value="time" > time </option>
285
+ <option value="url" > url </option>
286
+ <option value="week" > week </option>
287
+ <optgroup label="other types do not make a sense for cem-input">
288
+ <option value="button" > button </option>
289
+ <option value="checkbox" > checkbox </option>
290
+ <option value="color" > color </option>
291
+ <option value="file" > file </option>
292
+ <option value="hidden" > hidden </option>
293
+ <option value="image" > image </option>
294
+ <option value="radio" > radio </option>
295
+ <option value="range" > range </option>
296
+ <option value="reset" > reset </option>
297
+ <option value="search" > search </option>
298
+ <option value="submit" > submit </option>
299
+ </optgroup>
300
+ </select>
301
+ </label>
302
+ </template>
303
+ </custom-element>
304
+
305
+ <custom-element tag="cem-demo-cb">
306
+ <template>
307
+ <attribute name="slice" ></attribute>
308
+ <attribute name="value" select="//val"></attribute>
309
+ <label><input type="checkbox" value="{$slice}" slice="val" /> {$slice} </label>
310
+ </template>
311
+ </custom-element>
312
+
313
+ <custom-element tag="cem-demo-tx">
314
+ <template>
315
+ <attribute name="slice" ></attribute>
316
+ <attribute name="value" select="//val"></attribute>
317
+ <style>input,label{ width: 100%; } </style>
318
+ <label>{$slice}<input slice="val" value="{$value}"/></label>
319
+ </template>
320
+ </custom-element>
321
+
322
+ <custom-element tag="cem-demo-in">
323
+ <template>
324
+ <attribute name="slice" ></attribute>
325
+ <attribute name="value" select="//val"></attribute>
326
+ <style>input,label{ width: 100%; } </style>
327
+ <label>{$slice}<input slice="val" type="number"/></label>
328
+ </template>
329
+ </custom-element>
330
+
331
+ <html-demo-element legend="Most features" description="Focus to see the cursor in input with label shifted upward "
332
+ class="flat-attr"
333
+ >
334
+ <template>
335
+ <cem-input label="String field with leading and trailing icon "
336
+ placeholder="type here"
337
+ supporting="required field. Clear to see placeholder."
338
+ leading="search"
339
+ trailing="close"
340
+ ></cem-input>
341
+ </template>
342
+ </html-demo-element>
343
+
344
+ <html-demo-element legend="No value" description="Focus to see the cursor in input with label shifted upward ">
345
+ <template>
346
+ <cem-input label="String field" ></cem-input>
347
+ </template>
348
+ </html-demo-element>
349
+
350
+ <html-demo-element legend="No value with placeholder" description="focus to see the placeholder text" class="flat-attr">
351
+ <template>
352
+ <cem-input label="Number" type="number" placeholder="Enter the numeric value">
353
+ </cem-input>
354
+ </template>
355
+ </html-demo-element>
356
+
357
+ <html-demo-element legend="Value defined" description="The value should be visible" >
358
+ <template>
359
+ <cem-input label="Text" type="text" value="abc"></cem-input>
360
+ </template>
361
+ </html-demo-element>
362
+
363
+ <html-demo-element legend="leading and trailing slots" >
364
+ <div slot="description"><code>leading</code> slot inserted before input,
365
+ <code>trailing</code> slot injected after</div>
366
+
367
+ <template>
368
+ <cem-input label="slots sample" type="text" >
369
+ <div slot="leading"><cem-icon image="edit"></cem-icon></div>
370
+ <div slot="trailing">
371
+ <cem-icon image="👁"></cem-icon>
372
+ ️<cem-icon image="close"></cem-icon>️
373
+ </div>
374
+ </cem-input>
375
+ </template>
376
+ </html-demo-element>
377
+
378
+
379
+ <html-demo-element legend="password with trailing slots interaction" >
380
+ <div slot="description"><code>trailing</code> and other slots can become functional </div>
381
+ <p>Those slots can be used for error or hint UI; persistent or triggered by hover/focus.<br/>
382
+ <a href="./autocomplete.html">cem-autocomplete</a> uses <code>trailing</code> slot for
383
+ <a href="./menu.html">menu</a> with suggestions.
384
+ </p>
385
+ <p>Click in input field to see the focus leading icon <cem-icon image="edit"></cem-icon>
386
+ changed to <cem-icon image="history_edu"></cem-icon></p>
387
+ <template>
388
+ <custom-element>
389
+ <template id="cem-password">
390
+ <attribute name="value" select="//password[//password/event]"></attribute>
391
+
392
+ <style>
393
+ .input-focused{ display: none; }
394
+ .input-unfocused{ display: inline-flex; }
395
+ &:focus-within{
396
+ .input-focused{ display: inline-flex; }
397
+ .input-unfocused{ display:none; }
398
+ }
399
+ .eye-contailer
400
+ { display: flex;
401
+ align-items: center;
402
+ }
403
+
404
+ [type="checkbox"],.visible-ico{ display: none; }
405
+
406
+ &:has([type="checkbox"]:checked)
407
+ {
408
+ .visible-ico{ display: inline-flex; }
409
+ .invisible-ico{ display: none; }
410
+ }
411
+ .invisible-ico
412
+ { color:var(--cem-action-primary-color);
413
+ background-color: var(--cem-action-primary-background);
414
+ transition: var(--cem-action-transition);
415
+ &:hover{
416
+ background-color: var(--cem-action-primary-background-hover);
417
+ box-shadow: var(--cem-action-box-shadow-hover); }
418
+ &:focus{ background-color: var(--cem-action-primary-background-focus); }
419
+ &:active{ background-color: var(--cem-action-primary-background-active); }
420
+ }
421
+ </style>
422
+ <input type="checkbox" slice="visible" id="visible-cb" />
423
+ <cem-input label="password sample" slice="password" value="{//password[//password/event]}">
424
+ <attribute name="type"><if test="not(//visible='on')">password</if></attribute>
425
+ <div slot="leading">
426
+ <cem-icon image="history_edu" class="input-focused"></cem-icon>
427
+ <cem-icon image="edit" class="input-unfocused"></cem-icon>
428
+ </div>
429
+ <div slot="trailing">
430
+ <label class="eye-contailer" for="visible-cb">
431
+ <cem-icon image="visibility" class="visible-ico" tabindex="0"></cem-icon>
432
+ <cem-icon image="visibility_off" class="invisible-ico" tabindex="0"></cem-icon>
433
+ </label>
434
+ </div>
435
+ </cem-input>
436
+ </template>
437
+ </custom-element>
438
+ </template>
439
+ </html-demo-element>
440
+
441
+
442
+ <html-demo-element legend="Native error support" >
443
+ <div slot="descrition">Native <a href="https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation">
444
+ Form validation</a> is supported. See also <a href="../../custom-element/demo/form.html"><code>custom-element</code> form handling</a> </div>
445
+ <div><code>required</code> attribute would trigger the system message if the field is empty.</div>
446
+ <div>
447
+ Press Next button to see the browser error popup.</div>
448
+ <template>
449
+ <form>
450
+ <cem-input required></cem-input>
451
+ <button>Next</button>
452
+ </form>
453
+ </template>
454
+ </html-demo-element>
455
+
456
+ <html-demo-element legend="Error message">
457
+ <div slot="description"><code>warn</code> attribute and slot is used for warning message</div>
458
+ <div slot="description"><code>supporting</code> attribute and slot is used for supplementary message,
459
+ hidden when <code>warn</code> is not empty </div>
460
+ <template>
461
+
462
+ <cem-input warn="warning message" label="text" value="abc"></cem-input>
463
+ <hr/>
464
+ <cem-input supporting="complimentary message" label="text" value="abc"></cem-input>
465
+ <hr/>
466
+ <cem-input warn="warning message" supporting="complimentary message is overridden by warning" label="text" value="abc"></cem-input>
467
+ <hr/>
468
+ <cem-input warn="warning message" label="text" value="abc">
469
+ <div slot="warn"><cem-icon image="report" size="small"></cem-icon><b>abc</b> is not valid value</div>
470
+ </cem-input>
471
+ </template>
472
+ </html-demo-element>
473
+
474
+
475
+ <html-demo-element legend="INPUT field attributes playground" id="play" style="flex: 2 2 80vw;">
476
+ <div slot="descrition">
477
+ <p> Underlying implementation uses
478
+ <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input">HTML input</a>.
479
+ All its attributes are supported.
480
+ </p>
481
+ <custom-element >
482
+ <template>
483
+ <style>
484
+ &>dce-root
485
+ { display: flex; flex-wrap: wrap; gap: 2rem; align-items: center;
486
+ &>*{ flex: 1 1 10rem; }
487
+ }
488
+ label{ display: block; }
489
+ </style>
490
+ <cem-demo-cb slice="disabled" ></cem-demo-cb>
491
+ <cem-demo-cb slice="multiple" ></cem-demo-cb>
492
+ <cem-demo-cb slice="readonly" ></cem-demo-cb>
493
+ <cem-demo-cb slice="required" ></cem-demo-cb>
494
+ <cem-demo-cb slice="incremental" ></cem-demo-cb>
495
+ <cem-demo-in slice="max" ></cem-demo-in>
496
+ <cem-demo-in slice="maxlength" ></cem-demo-in>
497
+ <cem-demo-in slice="min" ></cem-demo-in>
498
+ <cem-demo-in slice="minlength" ></cem-demo-in>
499
+ <cem-demo-in slice="size" ></cem-demo-in>
500
+ <cem-demo-in slice="step" ></cem-demo-in>
501
+ <cem-demo-in slice="tabindex" ></cem-demo-in>
502
+ <cem-demo-tx slice="autocapitalize" title="on sentences off none words characters "></cem-demo-tx>
503
+ <cem-demo-tx slice="autocomplete" ></cem-demo-tx>
504
+ <cem-demo-tx slice="form" ></cem-demo-tx>
505
+ <cem-demo-tx slice="id" ></cem-demo-tx>
506
+ <cem-demo-tx slice="list" ></cem-demo-tx>
507
+ <cem-demo-tx slice="name" ></cem-demo-tx>
508
+ <cem-demo-tx slice="pattern" ></cem-demo-tx>
509
+ <cem-demo-tx slice="placeholder" ></cem-demo-tx>
510
+ <cem-demo-tx slice="title" ></cem-demo-tx>
511
+ <cem-demo-tx slice="value" value="abc" ></cem-demo-tx>
512
+ &bull;
513
+ <cem-demo-tx slice="label" title="label text" ></cem-demo-tx>
514
+ <cem-demo-tx slice="leading" title="leading icon" ></cem-demo-tx>
515
+ <cem-demo-tx slice="trailing" title="trailing icon" ></cem-demo-tx>
516
+ <cem-demo-tx slice="supporting" title="supporting text" ></cem-demo-tx>
517
+
518
+ <cem-demo-input-types slice="type"></cem-demo-input-types>
519
+
520
+ <form action="#play">
521
+ <cem-input type="{//type}" >
522
+ <if test="//disabled = 'disabled'" ><attribute name="disabled" ></attribute></if>
523
+ <if test="//multiple = 'multiple'" ><attribute name="multiple" ></attribute></if>
524
+ <if test="//readonly = 'readonly'" ><attribute name="readonly" ></attribute></if>
525
+ <if test="//required = 'required'" ><attribute name="required" ></attribute></if>
526
+ <if test="//incremental = 'incremental'" ><attribute name="incremental" ></attribute></if>
527
+ <if test="not(//max = '')" ><attribute name="max" >{//max }</attribute></if>
528
+ <if test="not(//maxlength = '')" ><attribute name="maxlength" >{//maxlength }</attribute></if>
529
+ <if test="not(//min = '')" ><attribute name="min" >{//min }</attribute></if>
530
+ <if test="not(//minlength = '')" ><attribute name="minlength" >{//minlength }</attribute></if>
531
+ <if test="not(//size = '')" ><attribute name="size" >{//size }</attribute></if>
532
+ <if test="not(//step = '')" ><attribute name="step" >{//step }</attribute></if>
533
+ <if test="not(//tabindex = '')" ><attribute name="tabindex" >{//tabindex }</attribute></if>
534
+ <if test="not(//autocapitalize='')" ><attribute name="autocapitalize" >{//autocapitalize }</attribute></if>
535
+ <if test="not(//autocomplete = '')" ><attribute name="autocomplete" >{//autocomplete }</attribute></if>
536
+ <if test="not(//form = '')" ><attribute name="form" >{//form }</attribute></if>
537
+ <if test="not(//id = '')" ><attribute name="id" >{//id }</attribute></if>
538
+ <if test="not(//list = '')" ><attribute name="list" >{//list }</attribute></if>
539
+ <if test="not(//name = '')" ><attribute name="name" >{//name }</attribute></if>
540
+ <if test="not(//pattern = '')" ><attribute name="pattern" >{//pattern }</attribute></if>
541
+ <if test="not(//placeholder = '')" ><attribute name="placeholder" >{//placeholder }</attribute></if>
542
+ <if test="not(//title = '')" ><attribute name="title" >{//title }</attribute></if>
543
+ <if test="not(//value = '')" ><attribute name="value" >{//value }</attribute></if>
544
+ <if test="not(//label = '')" ><attribute name="label" >{//label }</attribute></if>
545
+ <if test="not(//leading = '')" ><attribute name="leading" >{//leading }</attribute></if>
546
+ <if test="not(//trailing = '')" ><attribute name="trailing" >{//trailing }</attribute></if>
547
+ <if test="not(//supporting = '')" ><attribute name="supporting" >{//supporting }</attribute></if>
548
+ </cem-input>
549
+ <button>Next</button>
550
+ <if test="//disabled = 'disabled'" >//disabled = 'disabled' </if>
551
+
552
+ </form>
553
+ </template>
554
+ </custom-element>
555
+
556
+ </div>
557
+ <template>
558
+ </template>
559
+ </html-demo-element>
560
+
561
+ </main>
562
+ <footer>
563
+ <hr/>
564
+ <a href="../../LICENSE"> Code and documentation licensed under an Apache License 2.0 </a>
565
+ </footer>
566
+ <!--<script type="module" src="./html-demo-element.js"></script>-->
567
+ <script type="module" src="https://unpkg.com/html-demo-element@1/html-demo-element.js"></script>
568
+
569
+ </body>
363
570
  </html>