@microsoft/fast-element 2.10.4 → 3.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/ARCHITECTURE_HTML_TAGGED_TEMPLATE_LITERAL.md +1 -1
  2. package/ARCHITECTURE_OVERVIEW.md +2 -2
  3. package/CHANGELOG.json +1 -1
  4. package/CHANGELOG.md +2 -2
  5. package/DECLARATIVE_DESIGN.md +806 -0
  6. package/DECLARATIVE_HTML.md +470 -0
  7. package/DECLARATIVE_MIGRATION.md +215 -0
  8. package/DECLARATIVE_RENDERING.md +530 -0
  9. package/DECLARATIVE_RENDERING_LIFECYCLE.md +288 -0
  10. package/DECLARATIVE_SCHEMA_OBSERVER_MAP.md +489 -0
  11. package/DESIGN.md +138 -33
  12. package/MIGRATION.md +387 -0
  13. package/README.md +208 -1
  14. package/SIZES.md +25 -0
  15. package/api-extractor.arrays.json +15 -0
  16. package/api-extractor.context.json +1 -0
  17. package/api-extractor.declarative.json +15 -0
  18. package/api-extractor.di.json +1 -0
  19. package/api-extractor.hydration.json +15 -0
  20. package/api-extractor.styles.json +15 -0
  21. package/dist/arrays/arrays.api.json +2621 -0
  22. package/dist/declarative/declarative.api.json +7844 -0
  23. package/dist/di/di.api.json +1 -1
  24. package/dist/dts/array-observer.d.ts +2 -0
  25. package/dist/dts/arrays.d.ts +2 -0
  26. package/dist/dts/attr.d.ts +1 -0
  27. package/dist/dts/binding/signal.d.ts +6 -6
  28. package/dist/dts/binding/two-way.d.ts +1 -0
  29. package/dist/dts/binding.d.ts +7 -0
  30. package/dist/dts/components/attributes.d.ts +2 -5
  31. package/dist/dts/components/definition-schema-transforms.d.ts +9 -0
  32. package/dist/dts/components/element-controller.d.ts +80 -114
  33. package/dist/dts/components/element-hydration.d.ts +1 -1
  34. package/dist/dts/components/enable-hydration.d.ts +34 -0
  35. package/dist/dts/components/fast-definitions.d.ts +91 -42
  36. package/dist/dts/components/fast-element.d.ts +5 -8
  37. package/dist/dts/components/hydration-tracker.d.ts +40 -0
  38. package/dist/dts/components/hydration.d.ts +18 -53
  39. package/dist/dts/components/schema.d.ts +205 -0
  40. package/dist/dts/context.d.ts +6 -6
  41. package/dist/dts/css.d.ts +3 -0
  42. package/dist/dts/debug.d.ts +5 -1
  43. package/dist/dts/declarative/attribute-map.d.ts +58 -0
  44. package/dist/dts/declarative/debug.d.ts +5 -0
  45. package/dist/dts/declarative/index.d.ts +13 -0
  46. package/dist/dts/declarative/interfaces.d.ts +9 -0
  47. package/dist/dts/declarative/observer-map-utilities.d.ts +58 -0
  48. package/dist/dts/declarative/observer-map.d.ts +89 -0
  49. package/dist/dts/declarative/runtime.d.ts +5 -0
  50. package/dist/dts/declarative/syntax.d.ts +21 -0
  51. package/dist/dts/declarative/template-bridge.d.ts +33 -0
  52. package/dist/dts/declarative/template-parser.d.ts +98 -0
  53. package/dist/dts/declarative/template.d.ts +9 -0
  54. package/dist/dts/declarative/utilities.d.ts +312 -0
  55. package/dist/dts/di/di.d.ts +1 -1
  56. package/dist/dts/directives/children.d.ts +2 -0
  57. package/dist/dts/directives/node-observation.d.ts +2 -0
  58. package/dist/dts/directives/ref.d.ts +2 -0
  59. package/dist/dts/directives/repeat.d.ts +4 -0
  60. package/dist/dts/directives/slotted.d.ts +2 -0
  61. package/dist/dts/directives/when.d.ts +3 -0
  62. package/dist/dts/dom-policy.d.ts +1 -1
  63. package/dist/dts/html.d.ts +5 -0
  64. package/dist/dts/hydration/runtime.d.ts +7 -0
  65. package/dist/dts/hydration/target-builder.d.ts +15 -12
  66. package/dist/dts/hydration.d.ts +14 -0
  67. package/dist/dts/index.d.ts +38 -42
  68. package/dist/dts/index.debug.d.ts +0 -1
  69. package/dist/dts/index.rollup.debug.d.ts +0 -1
  70. package/dist/dts/interfaces.d.ts +1 -49
  71. package/dist/dts/observable.d.ts +3 -6
  72. package/dist/dts/observation/arrays.d.ts +1 -1
  73. package/dist/dts/observation/update-queue.d.ts +1 -1
  74. package/dist/dts/platform.d.ts +25 -4
  75. package/dist/dts/render.d.ts +7 -0
  76. package/dist/dts/schema.d.ts +1 -0
  77. package/dist/dts/state/exports.d.ts +1 -1
  78. package/dist/dts/state/state.d.ts +2 -2
  79. package/dist/dts/styles/css-directive.d.ts +5 -12
  80. package/dist/dts/styles/css.d.ts +5 -7
  81. package/dist/dts/styles/element-styles.d.ts +0 -10
  82. package/dist/dts/styles.d.ts +6 -0
  83. package/dist/dts/templating/children.d.ts +1 -1
  84. package/dist/dts/templating/html-binding-directive.d.ts +4 -0
  85. package/dist/dts/templating/html-directive.d.ts +17 -0
  86. package/dist/dts/templating/hydration-view.d.ts +109 -0
  87. package/dist/dts/templating/ref.d.ts +1 -1
  88. package/dist/dts/templating/render.d.ts +1 -1
  89. package/dist/dts/templating/repeat.d.ts +2 -2
  90. package/dist/dts/templating/slotted.d.ts +1 -1
  91. package/dist/dts/templating/template.d.ts +17 -9
  92. package/dist/dts/templating/view.d.ts +25 -102
  93. package/dist/dts/templating/when.d.ts +1 -1
  94. package/dist/dts/templating.d.ts +10 -0
  95. package/dist/dts/testing/exports.d.ts +2 -2
  96. package/dist/dts/updates.d.ts +1 -0
  97. package/dist/dts/volatile.d.ts +2 -0
  98. package/dist/esm/array-observer.js +1 -0
  99. package/dist/esm/arrays.js +1 -0
  100. package/dist/esm/attr.js +1 -0
  101. package/dist/esm/binding/normalize.js +1 -1
  102. package/dist/esm/binding/signal.js +4 -4
  103. package/dist/esm/binding/two-way.js +2 -1
  104. package/dist/esm/binding.js +4 -0
  105. package/dist/esm/components/attributes.js +8 -5
  106. package/dist/esm/components/definition-schema-transforms.js +23 -0
  107. package/dist/esm/components/element-controller.js +200 -269
  108. package/dist/esm/components/element-hydration.js +1 -1
  109. package/dist/esm/components/enable-hydration.js +100 -0
  110. package/dist/esm/components/fast-definitions.js +211 -49
  111. package/dist/esm/components/fast-element.js +18 -27
  112. package/dist/esm/components/hydration-tracker.js +93 -0
  113. package/dist/esm/components/hydration.js +62 -144
  114. package/dist/esm/components/schema.js +253 -0
  115. package/dist/esm/context.js +6 -6
  116. package/dist/esm/css.js +3 -0
  117. package/dist/esm/debug.js +26 -26
  118. package/dist/esm/declarative/attribute-map.js +121 -0
  119. package/dist/esm/declarative/debug.js +5 -0
  120. package/dist/esm/declarative/index.js +3 -0
  121. package/dist/esm/declarative/interfaces.js +10 -0
  122. package/dist/esm/declarative/observer-map-utilities.js +562 -0
  123. package/dist/esm/declarative/observer-map.js +216 -0
  124. package/dist/esm/declarative/runtime.js +14 -0
  125. package/dist/esm/declarative/syntax.js +36 -0
  126. package/dist/esm/declarative/template-bridge.js +170 -0
  127. package/dist/esm/declarative/template-parser.js +306 -0
  128. package/dist/esm/declarative/template.js +142 -0
  129. package/dist/esm/declarative/utilities.js +834 -0
  130. package/dist/esm/di/di.js +6 -8
  131. package/dist/esm/directives/children.js +1 -0
  132. package/dist/esm/directives/node-observation.js +1 -0
  133. package/dist/esm/directives/ref.js +1 -0
  134. package/dist/esm/directives/repeat.js +1 -0
  135. package/dist/esm/directives/slotted.js +1 -0
  136. package/dist/esm/directives/when.js +1 -0
  137. package/dist/esm/dom-policy.js +2 -2
  138. package/dist/esm/dom.js +1 -1
  139. package/dist/esm/html.js +2 -0
  140. package/dist/esm/hydration/runtime.js +33 -0
  141. package/dist/esm/hydration/target-builder.js +97 -90
  142. package/dist/esm/hydration.js +4 -0
  143. package/dist/esm/index.debug.js +2 -1
  144. package/dist/esm/index.js +34 -29
  145. package/dist/esm/index.rollup.debug.js +3 -2
  146. package/dist/esm/index.rollup.js +1 -1
  147. package/dist/esm/interfaces.js +1 -45
  148. package/dist/esm/observable.js +1 -4
  149. package/dist/esm/observation/arrays.js +1 -1
  150. package/dist/esm/observation/observable.js +5 -5
  151. package/dist/esm/observation/update-queue.js +47 -58
  152. package/dist/esm/platform.js +31 -30
  153. package/dist/esm/render.js +1 -0
  154. package/dist/esm/schema.js +1 -0
  155. package/dist/esm/state/exports.js +1 -1
  156. package/dist/esm/styles/css-directive.js +1 -2
  157. package/dist/esm/styles/css.js +15 -56
  158. package/dist/esm/styles/element-styles.js +69 -15
  159. package/dist/esm/styles.js +2 -0
  160. package/dist/esm/templating/html-binding-directive.js +10 -8
  161. package/dist/esm/templating/hydration-view.js +235 -0
  162. package/dist/esm/templating/render.js +1 -1
  163. package/dist/esm/templating/repeat.js +36 -34
  164. package/dist/esm/templating/template.js +7 -7
  165. package/dist/esm/templating/view.js +24 -233
  166. package/dist/esm/templating.js +7 -0
  167. package/dist/esm/testing/exports.js +2 -2
  168. package/dist/esm/updates.js +1 -0
  169. package/dist/esm/volatile.js +1 -0
  170. package/dist/fast-element.api.json +9016 -6995
  171. package/dist/fast-element.d.ts +3557 -796
  172. package/dist/fast-element.debug.js +5088 -4437
  173. package/dist/fast-element.debug.min.js +2 -2
  174. package/dist/fast-element.js +5369 -4649
  175. package/dist/fast-element.min.js +2 -2
  176. package/dist/fast-element.untrimmed.d.ts +863 -475
  177. package/dist/hydration/hydration.api.json +5237 -0
  178. package/dist/styles/styles.api.json +2672 -0
  179. package/docs/api-report.api.md +343 -166
  180. package/docs/arrays/api-report.api.md +114 -0
  181. package/docs/declarative/api-report.api.md +397 -0
  182. package/docs/hydration/api-report.api.md +285 -0
  183. package/docs/styles/api-report.api.md +135 -0
  184. package/package.json +149 -41
  185. package/playwright.declarative.config.ts +26 -0
  186. package/playwright.declarative.webui.config.ts +20 -0
  187. package/scripts/declarative/build-fixtures-with-webui.js +135 -0
  188. package/scripts/declarative/build-fixtures.js +49 -0
  189. package/scripts/declarative/build-fixtures.utilities.js +101 -0
  190. package/scripts/measure-sizes.js +219 -0
  191. package/scripts/run-api-extractor.js +39 -20
  192. package/test/declarative/fixtures/README.md +72 -0
  193. package/test/declarative/fixtures/WRITING_FIXTURES.md +330 -0
  194. package/test/declarative/fixtures/bindings/README.md +12 -0
  195. package/test/declarative/fixtures/bindings/attribute/entry.html +13 -0
  196. package/test/declarative/fixtures/bindings/attribute/fast-build.config.json +6 -0
  197. package/test/declarative/fixtures/bindings/attribute/index.html +25 -0
  198. package/test/declarative/fixtures/bindings/attribute/main.ts +41 -0
  199. package/test/declarative/fixtures/bindings/attribute/state.json +8 -0
  200. package/test/declarative/fixtures/bindings/attribute/templates.html +11 -0
  201. package/test/declarative/fixtures/bindings/content/entry.html +12 -0
  202. package/test/declarative/fixtures/bindings/content/fast-build.config.json +6 -0
  203. package/test/declarative/fixtures/bindings/content/index.html +19 -0
  204. package/test/declarative/fixtures/bindings/content/main.ts +27 -0
  205. package/test/declarative/fixtures/bindings/content/state.json +4 -0
  206. package/test/declarative/fixtures/bindings/content/templates.html +6 -0
  207. package/test/declarative/fixtures/bindings/dot-syntax/entry.html +11 -0
  208. package/test/declarative/fixtures/bindings/dot-syntax/fast-build.config.json +6 -0
  209. package/test/declarative/fixtures/bindings/dot-syntax/index.html +47 -0
  210. package/test/declarative/fixtures/bindings/dot-syntax/main.ts +59 -0
  211. package/test/declarative/fixtures/bindings/dot-syntax/state.json +16 -0
  212. package/test/declarative/fixtures/bindings/dot-syntax/templates.html +17 -0
  213. package/test/declarative/fixtures/bindings/event/entry.html +11 -0
  214. package/test/declarative/fixtures/bindings/event/fast-build.config.json +6 -0
  215. package/test/declarative/fixtures/bindings/event/index.html +43 -0
  216. package/test/declarative/fixtures/bindings/event/main.ts +43 -0
  217. package/test/declarative/fixtures/bindings/event/state.json +3 -0
  218. package/test/declarative/fixtures/bindings/event/templates.html +18 -0
  219. package/test/declarative/fixtures/bindings/host/entry.html +40 -0
  220. package/test/declarative/fixtures/bindings/host/fast-build.config.json +6 -0
  221. package/test/declarative/fixtures/bindings/host/index.html +96 -0
  222. package/test/declarative/fixtures/bindings/host/main.ts +222 -0
  223. package/test/declarative/fixtures/bindings/host/state.json +9 -0
  224. package/test/declarative/fixtures/bindings/host/templates.html +55 -0
  225. package/test/declarative/fixtures/directives/README.md +12 -0
  226. package/test/declarative/fixtures/directives/children/entry.html +11 -0
  227. package/test/declarative/fixtures/directives/children/fast-build.config.json +6 -0
  228. package/test/declarative/fixtures/directives/children/index.html +15 -0
  229. package/test/declarative/fixtures/directives/children/main.ts +22 -0
  230. package/test/declarative/fixtures/directives/children/state.json +3 -0
  231. package/test/declarative/fixtures/directives/children/templates.html +3 -0
  232. package/test/declarative/fixtures/directives/ref/entry.html +11 -0
  233. package/test/declarative/fixtures/directives/ref/fast-build.config.json +6 -0
  234. package/test/declarative/fixtures/directives/ref/index.html +15 -0
  235. package/test/declarative/fixtures/directives/ref/main.ts +17 -0
  236. package/test/declarative/fixtures/directives/ref/state.json +1 -0
  237. package/test/declarative/fixtures/directives/ref/templates.html +3 -0
  238. package/test/declarative/fixtures/directives/repeat/entry.html +21 -0
  239. package/test/declarative/fixtures/directives/repeat/fast-build.config.json +6 -0
  240. package/test/declarative/fixtures/directives/repeat/index.html +133 -0
  241. package/test/declarative/fixtures/directives/repeat/main.ts +110 -0
  242. package/test/declarative/fixtures/directives/repeat/sprites.svg +8 -0
  243. package/test/declarative/fixtures/directives/repeat/state.json +10 -0
  244. package/test/declarative/fixtures/directives/repeat/templates.html +75 -0
  245. package/test/declarative/fixtures/directives/slotted/entry.html +17 -0
  246. package/test/declarative/fixtures/directives/slotted/fast-build.config.json +6 -0
  247. package/test/declarative/fixtures/directives/slotted/index.html +27 -0
  248. package/test/declarative/fixtures/directives/slotted/main.ts +29 -0
  249. package/test/declarative/fixtures/directives/slotted/state.json +1 -0
  250. package/test/declarative/fixtures/directives/slotted/templates.html +7 -0
  251. package/test/declarative/fixtures/directives/when/entry.html +51 -0
  252. package/test/declarative/fixtures/directives/when/fast-build.config.json +6 -0
  253. package/test/declarative/fixtures/directives/when/index.html +136 -0
  254. package/test/declarative/fixtures/directives/when/main.ts +172 -0
  255. package/test/declarative/fixtures/directives/when/state.json +12 -0
  256. package/test/declarative/fixtures/directives/when/templates.html +75 -0
  257. package/test/declarative/fixtures/ecosystem/README.md +11 -0
  258. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/entry.html +12 -0
  259. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/fast-build.config.json +6 -0
  260. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/index.html +20 -0
  261. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/main.ts +68 -0
  262. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/state.json +4 -0
  263. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/templates.html +7 -0
  264. package/test/declarative/fixtures/ecosystem/errors/entry.html +12 -0
  265. package/test/declarative/fixtures/ecosystem/errors/fast-build.config.json +6 -0
  266. package/test/declarative/fixtures/ecosystem/errors/index.html +20 -0
  267. package/test/declarative/fixtures/ecosystem/errors/main.ts +17 -0
  268. package/test/declarative/fixtures/ecosystem/errors/state.json +1 -0
  269. package/test/declarative/fixtures/ecosystem/errors/templates.html +7 -0
  270. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/entry.html +17 -0
  271. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/fast-build.config.json +6 -0
  272. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/index.html +56 -0
  273. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/main.ts +134 -0
  274. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/state.json +12 -0
  275. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/templates.html +34 -0
  276. package/test/declarative/fixtures/ecosystem/performance-metrics/entry.html +25 -0
  277. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-build.config.json +6 -0
  278. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-card.css +10 -0
  279. package/test/declarative/fixtures/ecosystem/performance-metrics/index.html +181 -0
  280. package/test/declarative/fixtures/ecosystem/performance-metrics/main.ts +58 -0
  281. package/test/declarative/fixtures/ecosystem/performance-metrics/state.json +6 -0
  282. package/test/declarative/fixtures/ecosystem/performance-metrics/templates.html +15 -0
  283. package/test/declarative/fixtures/extensions/README.md +15 -0
  284. package/test/declarative/fixtures/extensions/attribute-map/entry.html +14 -0
  285. package/test/declarative/fixtures/extensions/attribute-map/fast-build.config.json +6 -0
  286. package/test/declarative/fixtures/extensions/attribute-map/index.html +31 -0
  287. package/test/declarative/fixtures/extensions/attribute-map/main.ts +40 -0
  288. package/test/declarative/fixtures/extensions/attribute-map/state.json +4 -0
  289. package/test/declarative/fixtures/extensions/attribute-map/templates.html +14 -0
  290. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/entry.html +12 -0
  291. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/fast-build.config.json +7 -0
  292. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/index.html +25 -0
  293. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/main.ts +31 -0
  294. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/state.json +5 -0
  295. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/templates.html +11 -0
  296. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/entry.html +13 -0
  297. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/fast-build.config.json +7 -0
  298. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/index.html +23 -0
  299. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/main.ts +37 -0
  300. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/state.json +1 -0
  301. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/templates.html +9 -0
  302. package/test/declarative/fixtures/extensions/observer-map/entry.html +15 -0
  303. package/test/declarative/fixtures/extensions/observer-map/fast-build.config.json +6 -0
  304. package/test/declarative/fixtures/extensions/observer-map/index.html +442 -0
  305. package/test/declarative/fixtures/extensions/observer-map/main.ts +482 -0
  306. package/test/declarative/fixtures/extensions/observer-map/state.json +158 -0
  307. package/test/declarative/fixtures/extensions/observer-map/templates.html +172 -0
  308. package/test/declarative/fixtures/extensions/observer-map-config-object/entry.html +16 -0
  309. package/test/declarative/fixtures/extensions/observer-map-config-object/fast-build.config.json +6 -0
  310. package/test/declarative/fixtures/extensions/observer-map-config-object/index.html +27 -0
  311. package/test/declarative/fixtures/extensions/observer-map-config-object/main.ts +53 -0
  312. package/test/declarative/fixtures/extensions/observer-map-config-object/state.json +9 -0
  313. package/test/declarative/fixtures/extensions/observer-map-config-object/templates.html +12 -0
  314. package/test/declarative/fixtures/extensions/observer-map-deep-merge/README.md +98 -0
  315. package/test/declarative/fixtures/extensions/observer-map-deep-merge/entry.html +156 -0
  316. package/test/declarative/fixtures/extensions/observer-map-deep-merge/fast-build.config.json +6 -0
  317. package/test/declarative/fixtures/extensions/observer-map-deep-merge/index.html +376 -0
  318. package/test/declarative/fixtures/extensions/observer-map-deep-merge/main.ts +366 -0
  319. package/test/declarative/fixtures/extensions/observer-map-deep-merge/state.json +69 -0
  320. package/test/declarative/fixtures/extensions/observer-map-deep-merge/templates.html +91 -0
  321. package/test/declarative/fixtures/extensions/observer-map-properties/entry.html +14 -0
  322. package/test/declarative/fixtures/extensions/observer-map-properties/fast-build.config.json +6 -0
  323. package/test/declarative/fixtures/extensions/observer-map-properties/index.html +110 -0
  324. package/test/declarative/fixtures/extensions/observer-map-properties/main.ts +175 -0
  325. package/test/declarative/fixtures/extensions/observer-map-properties/state.json +29 -0
  326. package/test/declarative/fixtures/extensions/observer-map-properties/templates.html +55 -0
  327. package/test/declarative/fixtures/scenarios/README.md +7 -0
  328. package/test/declarative/fixtures/scenarios/nested-elements/entry.html +16 -0
  329. package/test/declarative/fixtures/scenarios/nested-elements/fast-build.config.json +6 -0
  330. package/test/declarative/fixtures/scenarios/nested-elements/index.html +126 -0
  331. package/test/declarative/fixtures/scenarios/nested-elements/main.ts +214 -0
  332. package/test/declarative/fixtures/scenarios/nested-elements/state.json +10 -0
  333. package/test/declarative/fixtures/scenarios/nested-elements/templates.html +54 -0
  334. package/test/declarative/index.html +12 -0
  335. package/test/declarative/vite.config.ts +55 -0
  336. package/test/declarative-main.ts +6 -0
  337. package/test/extension-subpaths-main.ts +9 -0
  338. package/test/main.ts +38 -33
  339. package/test/pure-declarative-main.ts +1 -0
  340. package/dist/dts/components/install-hydration.d.ts +0 -1
  341. package/dist/dts/pending-task.d.ts +0 -32
  342. package/dist/dts/polyfills.d.ts +0 -0
  343. package/dist/dts/styles/css-binding-directive.d.ts +0 -60
  344. package/dist/dts/templating/install-hydratable-view-templates.d.ts +0 -1
  345. package/dist/esm/components/install-hydration.js +0 -3
  346. package/dist/esm/pending-task.js +0 -28
  347. package/dist/esm/polyfills.js +0 -60
  348. package/dist/esm/styles/css-binding-directive.js +0 -76
  349. package/dist/esm/templating/install-hydratable-view-templates.js +0 -23
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Lifecycle Callbacks Test</title>
6
+ </head>
7
+ <body>
8
+ <simple-element needs-hydration><template shadowrootmode="open" shadowroot="open"><!--fe:b-->Hello<!--fe:/b--> World</template></simple-element>
9
+ <complex-element needs-hydration count="0"><template shadowrootmode="open" shadowroot="open"><div>
10
+ <h2><!--fe:b-->Complex<!--fe:/b--></h2>
11
+ <p>Count: <!--fe:b-->0<!--fe:/b--></p>
12
+ <nested-element label="Complex" data-fe="1"><template shadowrootmode="open" shadowroot="open"><span><!--fe:b-->Complex<!--fe:/b--></span></template></nested-element>
13
+ </div></template></complex-element>
14
+ <deferred-element needs-hydration defer-hydration><template shadowrootmode="open" shadowroot="open"><p>Status: <!--fe:b-->pending<!--fe:/b--></p></template></deferred-element>
15
+ <deferred-parent-element needs-hydration defer-hydration><template shadowrootmode="open" shadowroot="open"><section>
16
+ <p><!--fe:b-->Parent<!--fe:/b--></p>
17
+ <deferred-child-element label="Parent" data-fe="1"><template shadowrootmode="open" shadowroot="open"><span><!--fe:b-->Parent<!--fe:/b--></span></template></deferred-child-element>
18
+ </section></template></deferred-parent-element>
19
+ <f-template name="simple-element">
20
+ <template>{{message}} World</template>
21
+ </f-template>
22
+
23
+ <f-template name="complex-element">
24
+ <template>
25
+ <div>
26
+ <h2>{{title}}</h2>
27
+ <p>Count: {{count}}</p>
28
+ <nested-element label="{{title}}"></nested-element>
29
+ </div>
30
+ </template>
31
+ </f-template>
32
+
33
+ <f-template name="nested-element">
34
+ <template><span>{{label}}</span></template>
35
+ </f-template>
36
+
37
+ <f-template name="deferred-element">
38
+ <template><p>Status: {{status}}</p></template>
39
+ </f-template>
40
+
41
+ <f-template name="deferred-parent-element">
42
+ <template>
43
+ <section>
44
+ <p>{{label}}</p>
45
+ <deferred-child-element label="{{label}}"></deferred-child-element>
46
+ </section>
47
+ </template>
48
+ </f-template>
49
+
50
+ <f-template name="deferred-child-element">
51
+ <template><span>{{label}}</span></template>
52
+ </f-template>
53
+
54
+ <script type="module" src="./main.ts"></script>
55
+ </body>
56
+ </html>
@@ -0,0 +1,134 @@
1
+ import { attr } from "@microsoft/fast-element/attr.js";
2
+ import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
3
+ import { FASTElement } from "@microsoft/fast-element/fast-element.js";
4
+ import { enableHydration } from "@microsoft/fast-element/hydration.js";
5
+ import { observable } from "@microsoft/fast-element/observable.js";
6
+ import { observerMap } from "@microsoft/fast-element/observer-map.js";
7
+
8
+ // Track lifecycle callbacks for testing
9
+ export const lifecycleEvents: Array<{ callback: string; name?: string }> = [];
10
+
11
+ // Enable hydration with global callback
12
+ enableHydration({
13
+ hydrationComplete(): void {
14
+ lifecycleEvents.push({ callback: "hydrationComplete" });
15
+ (window as any).hydrationCompleted = true;
16
+ },
17
+ });
18
+
19
+ // Per-element lifecycle callbacks
20
+ const lifecycleCallbacks = {
21
+ elementDidRegister(name: string): void {
22
+ lifecycleEvents.push({ callback: "elementDidRegister", name });
23
+ },
24
+ templateWillUpdate(name: string): void {
25
+ lifecycleEvents.push({ callback: "templateWillUpdate", name });
26
+ },
27
+ templateDidUpdate(name: string): void {
28
+ lifecycleEvents.push({ callback: "templateDidUpdate", name });
29
+ },
30
+ elementDidDefine(name: string): void {
31
+ lifecycleEvents.push({ callback: "elementDidDefine", name });
32
+ },
33
+ };
34
+
35
+ // Simple element with basic property
36
+ class SimpleElement extends FASTElement {
37
+ @attr
38
+ message: string = "Hello";
39
+ }
40
+
41
+ SimpleElement.define({
42
+ name: "simple-element",
43
+ template: declarativeTemplate(lifecycleCallbacks),
44
+ });
45
+
46
+ // Complex element with multiple properties and methods
47
+ class ComplexElement extends FASTElement {
48
+ @attr
49
+ title: string = "Complex";
50
+
51
+ @observable
52
+ count: number = 0;
53
+
54
+ @observable
55
+ items: string[] = [];
56
+
57
+ increment() {
58
+ this.count++;
59
+ }
60
+
61
+ addItem(item: string) {
62
+ this.items = [...this.items, item];
63
+ }
64
+ }
65
+
66
+ ComplexElement.define(
67
+ {
68
+ name: "complex-element",
69
+ template: declarativeTemplate(lifecycleCallbacks),
70
+ },
71
+ [observerMap()],
72
+ );
73
+
74
+ // Nested element
75
+ class NestedElement extends FASTElement {
76
+ @attr
77
+ label: string = "Nested";
78
+ }
79
+
80
+ NestedElement.define({
81
+ name: "nested-element",
82
+ template: declarativeTemplate(lifecycleCallbacks),
83
+ });
84
+
85
+ // Element with deferred hydration
86
+ class DeferredElement extends FASTElement {
87
+ @attr
88
+ status: string = "pending";
89
+
90
+ connectedCallback() {
91
+ super.connectedCallback();
92
+ // Simulate async work
93
+ setTimeout(() => {
94
+ this.status = "ready";
95
+ }, 100);
96
+ }
97
+ }
98
+
99
+ DeferredElement.define({
100
+ name: "deferred-element",
101
+ template: declarativeTemplate(lifecycleCallbacks),
102
+ });
103
+
104
+ // Nested deferred elements to verify parent-first hydration
105
+ class DeferredParentElement extends FASTElement {
106
+ @attr
107
+ label: string = "Parent";
108
+
109
+ connectedCallback() {
110
+ super.connectedCallback();
111
+ }
112
+ }
113
+
114
+ DeferredParentElement.define({
115
+ name: "deferred-parent-element",
116
+ template: declarativeTemplate(lifecycleCallbacks),
117
+ });
118
+
119
+ class DeferredChildElement extends FASTElement {
120
+ @attr
121
+ label: string = "Child";
122
+
123
+ connectedCallback() {
124
+ super.connectedCallback();
125
+ }
126
+ }
127
+
128
+ DeferredChildElement.define({
129
+ name: "deferred-child-element",
130
+ template: declarativeTemplate(lifecycleCallbacks),
131
+ });
132
+
133
+ // Make lifecycleEvents available globally for testing
134
+ (window as any).lifecycleEvents = lifecycleEvents;
@@ -0,0 +1,12 @@
1
+ {
2
+ "message": "Hello",
3
+ "title": "Complex",
4
+ "status": "pending",
5
+ "label": "Parent",
6
+ "simpleMessage": "Hello",
7
+ "complexTitle": "Complex",
8
+ "count": 0,
9
+ "deferredStatus": "pending",
10
+ "parentLabel": "Parent",
11
+ "childLabel": "Child"
12
+ }
@@ -0,0 +1,34 @@
1
+ <f-template name="simple-element">
2
+ <template>{{message}} World</template>
3
+ </f-template>
4
+
5
+ <f-template name="complex-element">
6
+ <template>
7
+ <div>
8
+ <h2>{{title}}</h2>
9
+ <p>Count: {{count}}</p>
10
+ <nested-element label="{{title}}"></nested-element>
11
+ </div>
12
+ </template>
13
+ </f-template>
14
+
15
+ <f-template name="nested-element">
16
+ <template><span>{{label}}</span></template>
17
+ </f-template>
18
+
19
+ <f-template name="deferred-element">
20
+ <template><p>Status: {{status}}</p></template>
21
+ </f-template>
22
+
23
+ <f-template name="deferred-parent-element">
24
+ <template>
25
+ <section>
26
+ <p>{{label}}</p>
27
+ <deferred-child-element label="{{label}}"></deferred-child-element>
28
+ </section>
29
+ </template>
30
+ </f-template>
31
+
32
+ <f-template name="deferred-child-element">
33
+ <template><span>{{label}}</span></template>
34
+ </f-template>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Performance Metrics Test</title>
6
+ <link rel="preload" as="style" href="./fast-card.css" />
7
+ </head>
8
+ <body>
9
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"></fast-card>
10
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"></fast-card>
11
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"></fast-card>
12
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"></fast-card>
13
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"></fast-card>
14
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"></fast-card>
15
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"></fast-card>
16
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"></fast-card>
17
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"></fast-card>
18
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"></fast-card>
19
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"></fast-card>
20
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"></fast-card>
21
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"></fast-card>
22
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"></fast-card>
23
+ <script type="module" src="./main.ts"></script>
24
+ </body>
25
+ </html>
@@ -0,0 +1,6 @@
1
+ {
2
+ "entry": "entry.html",
3
+ "state": "state.json",
4
+ "output": "index.html",
5
+ "templates": "templates.html"
6
+ }
@@ -0,0 +1,10 @@
1
+ :host {
2
+ display: inline-block;
3
+ width: 200px;
4
+ height: 200px;
5
+ border: 1px solid #ccc;
6
+
7
+ dd {
8
+ display: inline-block;
9
+ }
10
+ }
@@ -0,0 +1,181 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Performance Metrics Test</title>
6
+ <link rel="preload" as="style" href="./fast-card.css" />
7
+ </head>
8
+ <body>
9
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
10
+ <dl>
11
+ <dt>Configured Delay</dt>
12
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
13
+ <dt>Element Will Hydrate</dt>
14
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
15
+ <dt>Element Did Hydrate</dt>
16
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
17
+ <dt>Element Hydration Duration</dt>
18
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
19
+ </dl></template></fast-card>
20
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
21
+ <dl>
22
+ <dt>Configured Delay</dt>
23
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
24
+ <dt>Element Will Hydrate</dt>
25
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
26
+ <dt>Element Did Hydrate</dt>
27
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
28
+ <dt>Element Hydration Duration</dt>
29
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
30
+ </dl></template></fast-card>
31
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
32
+ <dl>
33
+ <dt>Configured Delay</dt>
34
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
35
+ <dt>Element Will Hydrate</dt>
36
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
37
+ <dt>Element Did Hydrate</dt>
38
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
39
+ <dt>Element Hydration Duration</dt>
40
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
41
+ </dl></template></fast-card>
42
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
43
+ <dl>
44
+ <dt>Configured Delay</dt>
45
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
46
+ <dt>Element Will Hydrate</dt>
47
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
48
+ <dt>Element Did Hydrate</dt>
49
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
50
+ <dt>Element Hydration Duration</dt>
51
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
52
+ </dl></template></fast-card>
53
+ <fast-card needs-hydration defer-hydration defer-delay="0" displayDelay="0ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
54
+ <dl>
55
+ <dt>Configured Delay</dt>
56
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
57
+ <dt>Element Will Hydrate</dt>
58
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
59
+ <dt>Element Did Hydrate</dt>
60
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
61
+ <dt>Element Hydration Duration</dt>
62
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
63
+ </dl></template></fast-card>
64
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
65
+ <dl>
66
+ <dt>Configured Delay</dt>
67
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
68
+ <dt>Element Will Hydrate</dt>
69
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
70
+ <dt>Element Did Hydrate</dt>
71
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
72
+ <dt>Element Hydration Duration</dt>
73
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
74
+ </dl></template></fast-card>
75
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
76
+ <dl>
77
+ <dt>Configured Delay</dt>
78
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
79
+ <dt>Element Will Hydrate</dt>
80
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
81
+ <dt>Element Did Hydrate</dt>
82
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
83
+ <dt>Element Hydration Duration</dt>
84
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
85
+ </dl></template></fast-card>
86
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
87
+ <dl>
88
+ <dt>Configured Delay</dt>
89
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
90
+ <dt>Element Will Hydrate</dt>
91
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
92
+ <dt>Element Did Hydrate</dt>
93
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
94
+ <dt>Element Hydration Duration</dt>
95
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
96
+ </dl></template></fast-card>
97
+ <fast-card needs-hydration defer-hydration defer-delay="150" displayDelay="150ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
98
+ <dl>
99
+ <dt>Configured Delay</dt>
100
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
101
+ <dt>Element Will Hydrate</dt>
102
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
103
+ <dt>Element Did Hydrate</dt>
104
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
105
+ <dt>Element Hydration Duration</dt>
106
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
107
+ </dl></template></fast-card>
108
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
109
+ <dl>
110
+ <dt>Configured Delay</dt>
111
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
112
+ <dt>Element Will Hydrate</dt>
113
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
114
+ <dt>Element Did Hydrate</dt>
115
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
116
+ <dt>Element Hydration Duration</dt>
117
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
118
+ </dl></template></fast-card>
119
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
120
+ <dl>
121
+ <dt>Configured Delay</dt>
122
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
123
+ <dt>Element Will Hydrate</dt>
124
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
125
+ <dt>Element Did Hydrate</dt>
126
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
127
+ <dt>Element Hydration Duration</dt>
128
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
129
+ </dl></template></fast-card>
130
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
131
+ <dl>
132
+ <dt>Configured Delay</dt>
133
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
134
+ <dt>Element Will Hydrate</dt>
135
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
136
+ <dt>Element Did Hydrate</dt>
137
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
138
+ <dt>Element Hydration Duration</dt>
139
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
140
+ </dl></template></fast-card>
141
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
142
+ <dl>
143
+ <dt>Configured Delay</dt>
144
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
145
+ <dt>Element Will Hydrate</dt>
146
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
147
+ <dt>Element Did Hydrate</dt>
148
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
149
+ <dt>Element Hydration Duration</dt>
150
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
151
+ </dl></template></fast-card>
152
+ <fast-card needs-hydration defer-hydration defer-delay="300" displayDelay="300ms"><template shadowrootmode="open" shadowroot="open"><link rel="stylesheet" href="./fast-card.css" />
153
+ <dl>
154
+ <dt>Configured Delay</dt>
155
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
156
+ <dt>Element Will Hydrate</dt>
157
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
158
+ <dt>Element Did Hydrate</dt>
159
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
160
+ <dt>Element Hydration Duration</dt>
161
+ <dd><!--fe:b-->0ms<!--fe:/b--></dd>
162
+ </dl></template></fast-card>
163
+ <f-template name="fast-card">
164
+ <template>
165
+ <link rel="stylesheet" href="./fast-card.css" />
166
+ <dl>
167
+ <dt>Configured Delay</dt>
168
+ <dd>{{displayDelay}}</dd>
169
+ <dt>Element Will Hydrate</dt>
170
+ <dd>{{willHydrate}}</dd>
171
+ <dt>Element Did Hydrate</dt>
172
+ <dd>{{didHydrate}}</dd>
173
+ <dt>Element Hydration Duration</dt>
174
+ <dd>{{hydrationDuration}}</dd>
175
+ </dl>
176
+ </template>
177
+ </f-template>
178
+
179
+ <script type="module" src="./main.ts"></script>
180
+ </body>
181
+ </html>
@@ -0,0 +1,58 @@
1
+ import { attr } from "@microsoft/fast-element/attr.js";
2
+ import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
3
+ import { FASTElement } from "@microsoft/fast-element/fast-element.js";
4
+ import { enableHydration } from "@microsoft/fast-element/hydration.js";
5
+ import { volatile } from "@microsoft/fast-element/volatile.js";
6
+
7
+ let markSequence = 0;
8
+
9
+ // Enable hydration with global start/complete callbacks
10
+ enableHydration({
11
+ hydrationStarted(): void {
12
+ performance.mark("hydration:started", { detail: { sequence: markSequence++ } });
13
+ },
14
+ hydrationComplete(): void {
15
+ performance.measure("hydration:complete", "hydration:started");
16
+ (window as any).hydrationCompleted = true;
17
+ },
18
+ });
19
+
20
+ class FastCard extends FASTElement {
21
+ @attr({ attribute: "defer-delay" })
22
+ deferDelay!: number;
23
+
24
+ @volatile
25
+ get displayDelay(): string {
26
+ return `${(this.deferDelay ?? 0).toString()}ms`;
27
+ }
28
+ }
29
+
30
+ FastCard.define({
31
+ name: "fast-card",
32
+ template: declarativeTemplate({
33
+ templateWillUpdate(name: string) {
34
+ performance.mark(`template-update:${name}:start`, {
35
+ detail: { sequence: markSequence++ },
36
+ });
37
+ },
38
+
39
+ templateDidUpdate(name) {
40
+ performance.measure(
41
+ `template-update:${name}`,
42
+ `template-update:${name}:start`,
43
+ );
44
+ },
45
+
46
+ elementDidDefine(name) {
47
+ performance.mark(`element-define:${name}`, {
48
+ detail: { sequence: markSequence++ },
49
+ });
50
+ },
51
+
52
+ elementDidRegister(name) {
53
+ performance.mark(`element-register:${name}`, {
54
+ detail: { sequence: markSequence++ },
55
+ });
56
+ },
57
+ }),
58
+ });
@@ -0,0 +1,6 @@
1
+ {
2
+ "displayDelay": "0ms",
3
+ "willHydrate": "0ms",
4
+ "didHydrate": "0ms",
5
+ "hydrationDuration": "0ms"
6
+ }
@@ -0,0 +1,15 @@
1
+ <f-template name="fast-card">
2
+ <template>
3
+ <link rel="stylesheet" href="./fast-card.css" />
4
+ <dl>
5
+ <dt>Configured Delay</dt>
6
+ <dd>{{displayDelay}}</dd>
7
+ <dt>Element Will Hydrate</dt>
8
+ <dd>{{willHydrate}}</dd>
9
+ <dt>Element Did Hydrate</dt>
10
+ <dd>{{didHydrate}}</dd>
11
+ <dt>Element Hydration Duration</dt>
12
+ <dd>{{hydrationDuration}}</dd>
13
+ </dl>
14
+ </template>
15
+ </f-template>
@@ -0,0 +1,15 @@
1
+ # Extensions
2
+
3
+ Fixtures for additional functionality that augments the core declarative FAST
4
+ Element behavior beyond developer direct configuration, such as automatic
5
+ attribute mapping and deep property observation.
6
+
7
+ | Fixture | Description |
8
+ |---|---|
9
+ | `attribute-map` | Automatic attribute mapping enabled with the `attributeMap()` definition extension. |
10
+ | `attribute-map-naming-strategy` | The `attributeMap({ "attribute-name-strategy": "camelCase" })` definition extension for mapping HTML attribute names to property names. |
11
+ | `attribute-map-naming-strategy-camel-case` | Explicit `@attr` decorator behavior with `camelCase` attribute name strategy in the build configuration. |
12
+ | `observer-map` | Automatic deep reactive observation enabled with the `observerMap()` definition extension. |
13
+ | `observer-map-config-object` | Explicit non-default configuration objects applied via `observerMap(...)` and `attributeMap(...)` definition extensions. |
14
+ | `observer-map-deep-merge` | Nested object merging behavior for complex state structures. |
15
+ | `observer-map-properties` | Selective property observation using `observerMap({ properties: {...} })` for fine-grained control. |
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title></title>
6
+ </head>
7
+ <body>
8
+ <attribute-map-test-element id="test-element"></attribute-map-test-element>
9
+ <attribute-map-existing-attr-test-element
10
+ id="existing-attr-test-element"
11
+ ></attribute-map-existing-attr-test-element>
12
+ <script type="module" src="./main.ts"></script>
13
+ </body>
14
+ </html>
@@ -0,0 +1,6 @@
1
+ {
2
+ "entry": "entry.html",
3
+ "state": "state.json",
4
+ "output": "index.html",
5
+ "templates": "templates.html"
6
+ }
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title></title>
6
+ </head>
7
+ <body>
8
+ <attribute-map-test-element id="test-element"><template shadowrootmode="open" shadowroot="open"><div class="foo-value"><!--fe:b--><!--fe:/b--></div>
9
+ <div class="foo-bar-value"><!--fe:b--><!--fe:/b--></div>
10
+ <button type="button" data-fe="1">Set Foo</button>
11
+ <button type="button" data-fe="1">Set FooBar</button>
12
+ <button type="button" data-fe="1">Set Multiple</button></template></attribute-map-test-element>
13
+ <attribute-map-existing-attr-test-element id="existing-attr-test-element"><template shadowrootmode="open" shadowroot="open"><div class="existing-foo-value"><!--fe:b--><!--fe:/b--></div></template></attribute-map-existing-attr-test-element>
14
+ <f-template name="attribute-map-test-element">
15
+ <template>
16
+ <div class="foo-value">{{foo}}</div>
17
+ <div class="foo-bar-value">{{foo-bar}}</div>
18
+ <button type="button" @click="{setFoo()}">Set Foo</button>
19
+ <button type="button" @click="{setFooBar()}">Set FooBar</button>
20
+ <button type="button" @click="{setMultiple()}">Set Multiple</button>
21
+ </template>
22
+ </f-template>
23
+ <f-template name="attribute-map-existing-attr-test-element">
24
+ <template>
25
+ <div class="existing-foo-value">{{foo}}</div>
26
+ </template>
27
+ </f-template>
28
+
29
+ <script type="module" src="./main.ts"></script>
30
+ </body>
31
+ </html>