@microsoft/fast-element 2.10.3 → 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 (351) hide show
  1. package/ARCHITECTURE_HTML_TAGGED_TEMPLATE_LITERAL.md +1 -1
  2. package/ARCHITECTURE_OVERVIEW.md +2 -2
  3. package/CHANGELOG.json +31 -1
  4. package/CHANGELOG.md +10 -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 +143 -34
  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/context/context.api.json +1 -1
  23. package/dist/declarative/declarative.api.json +7844 -0
  24. package/dist/di/di.api.json +2 -2
  25. package/dist/dts/array-observer.d.ts +2 -0
  26. package/dist/dts/arrays.d.ts +2 -0
  27. package/dist/dts/attr.d.ts +1 -0
  28. package/dist/dts/binding/signal.d.ts +6 -6
  29. package/dist/dts/binding/two-way.d.ts +1 -0
  30. package/dist/dts/binding.d.ts +7 -0
  31. package/dist/dts/components/attributes.d.ts +2 -5
  32. package/dist/dts/components/definition-schema-transforms.d.ts +9 -0
  33. package/dist/dts/components/element-controller.d.ts +80 -114
  34. package/dist/dts/components/element-hydration.d.ts +1 -1
  35. package/dist/dts/components/enable-hydration.d.ts +34 -0
  36. package/dist/dts/components/fast-definitions.d.ts +91 -42
  37. package/dist/dts/components/fast-element.d.ts +5 -8
  38. package/dist/dts/components/hydration-tracker.d.ts +40 -0
  39. package/dist/dts/components/hydration.d.ts +18 -53
  40. package/dist/dts/components/schema.d.ts +205 -0
  41. package/dist/dts/context.d.ts +6 -6
  42. package/dist/dts/css.d.ts +3 -0
  43. package/dist/dts/debug.d.ts +5 -1
  44. package/dist/dts/declarative/attribute-map.d.ts +58 -0
  45. package/dist/dts/declarative/debug.d.ts +5 -0
  46. package/dist/dts/declarative/index.d.ts +13 -0
  47. package/dist/dts/declarative/interfaces.d.ts +9 -0
  48. package/dist/dts/declarative/observer-map-utilities.d.ts +58 -0
  49. package/dist/dts/declarative/observer-map.d.ts +89 -0
  50. package/dist/dts/declarative/runtime.d.ts +5 -0
  51. package/dist/dts/declarative/syntax.d.ts +21 -0
  52. package/dist/dts/declarative/template-bridge.d.ts +33 -0
  53. package/dist/dts/declarative/template-parser.d.ts +98 -0
  54. package/dist/dts/declarative/template.d.ts +9 -0
  55. package/dist/dts/declarative/utilities.d.ts +312 -0
  56. package/dist/dts/di/di.d.ts +1 -1
  57. package/dist/dts/directives/children.d.ts +2 -0
  58. package/dist/dts/directives/node-observation.d.ts +2 -0
  59. package/dist/dts/directives/ref.d.ts +2 -0
  60. package/dist/dts/directives/repeat.d.ts +4 -0
  61. package/dist/dts/directives/slotted.d.ts +2 -0
  62. package/dist/dts/directives/when.d.ts +3 -0
  63. package/dist/dts/dom-policy.d.ts +1 -1
  64. package/dist/dts/html.d.ts +5 -0
  65. package/dist/dts/hydration/runtime.d.ts +7 -0
  66. package/dist/dts/hydration/target-builder.d.ts +15 -12
  67. package/dist/dts/hydration.d.ts +14 -0
  68. package/dist/dts/index.d.ts +38 -42
  69. package/dist/dts/index.debug.d.ts +0 -1
  70. package/dist/dts/index.rollup.debug.d.ts +0 -1
  71. package/dist/dts/interfaces.d.ts +1 -49
  72. package/dist/dts/observable.d.ts +3 -6
  73. package/dist/dts/observation/arrays.d.ts +1 -1
  74. package/dist/dts/observation/update-queue.d.ts +1 -1
  75. package/dist/dts/platform.d.ts +25 -4
  76. package/dist/dts/render.d.ts +7 -0
  77. package/dist/dts/schema.d.ts +1 -0
  78. package/dist/dts/state/exports.d.ts +1 -1
  79. package/dist/dts/state/state.d.ts +2 -2
  80. package/dist/dts/styles/css-directive.d.ts +5 -12
  81. package/dist/dts/styles/css.d.ts +5 -7
  82. package/dist/dts/styles/element-styles.d.ts +0 -10
  83. package/dist/dts/styles.d.ts +6 -0
  84. package/dist/dts/templating/children.d.ts +1 -1
  85. package/dist/dts/templating/html-binding-directive.d.ts +10 -0
  86. package/dist/dts/templating/html-directive.d.ts +17 -0
  87. package/dist/dts/templating/hydration-view.d.ts +109 -0
  88. package/dist/dts/templating/ref.d.ts +1 -1
  89. package/dist/dts/templating/render.d.ts +8 -2
  90. package/dist/dts/templating/repeat.d.ts +2 -2
  91. package/dist/dts/templating/slotted.d.ts +1 -1
  92. package/dist/dts/templating/template.d.ts +17 -9
  93. package/dist/dts/templating/view.d.ts +25 -102
  94. package/dist/dts/templating/when.d.ts +1 -1
  95. package/dist/dts/templating.d.ts +10 -0
  96. package/dist/dts/testing/exports.d.ts +2 -2
  97. package/dist/dts/tsdoc-metadata.json +1 -1
  98. package/dist/dts/updates.d.ts +1 -0
  99. package/dist/dts/volatile.d.ts +2 -0
  100. package/dist/esm/array-observer.js +1 -0
  101. package/dist/esm/arrays.js +1 -0
  102. package/dist/esm/attr.js +1 -0
  103. package/dist/esm/binding/normalize.js +1 -1
  104. package/dist/esm/binding/signal.js +4 -4
  105. package/dist/esm/binding/two-way.js +2 -1
  106. package/dist/esm/binding.js +4 -0
  107. package/dist/esm/components/attributes.js +8 -5
  108. package/dist/esm/components/definition-schema-transforms.js +23 -0
  109. package/dist/esm/components/element-controller.js +200 -269
  110. package/dist/esm/components/element-hydration.js +1 -1
  111. package/dist/esm/components/enable-hydration.js +100 -0
  112. package/dist/esm/components/fast-definitions.js +211 -49
  113. package/dist/esm/components/fast-element.js +18 -27
  114. package/dist/esm/components/hydration-tracker.js +93 -0
  115. package/dist/esm/components/hydration.js +62 -144
  116. package/dist/esm/components/schema.js +253 -0
  117. package/dist/esm/context.js +6 -6
  118. package/dist/esm/css.js +3 -0
  119. package/dist/esm/debug.js +26 -26
  120. package/dist/esm/declarative/attribute-map.js +121 -0
  121. package/dist/esm/declarative/debug.js +5 -0
  122. package/dist/esm/declarative/index.js +3 -0
  123. package/dist/esm/declarative/interfaces.js +10 -0
  124. package/dist/esm/declarative/observer-map-utilities.js +562 -0
  125. package/dist/esm/declarative/observer-map.js +216 -0
  126. package/dist/esm/declarative/runtime.js +14 -0
  127. package/dist/esm/declarative/syntax.js +36 -0
  128. package/dist/esm/declarative/template-bridge.js +170 -0
  129. package/dist/esm/declarative/template-parser.js +306 -0
  130. package/dist/esm/declarative/template.js +142 -0
  131. package/dist/esm/declarative/utilities.js +834 -0
  132. package/dist/esm/di/di.js +6 -8
  133. package/dist/esm/directives/children.js +1 -0
  134. package/dist/esm/directives/node-observation.js +1 -0
  135. package/dist/esm/directives/ref.js +1 -0
  136. package/dist/esm/directives/repeat.js +1 -0
  137. package/dist/esm/directives/slotted.js +1 -0
  138. package/dist/esm/directives/when.js +1 -0
  139. package/dist/esm/dom-policy.js +2 -2
  140. package/dist/esm/dom.js +1 -1
  141. package/dist/esm/html.js +2 -0
  142. package/dist/esm/hydration/runtime.js +33 -0
  143. package/dist/esm/hydration/target-builder.js +97 -90
  144. package/dist/esm/hydration.js +4 -0
  145. package/dist/esm/index.debug.js +2 -1
  146. package/dist/esm/index.js +34 -29
  147. package/dist/esm/index.rollup.debug.js +3 -2
  148. package/dist/esm/index.rollup.js +1 -1
  149. package/dist/esm/interfaces.js +1 -45
  150. package/dist/esm/observable.js +1 -4
  151. package/dist/esm/observation/arrays.js +1 -1
  152. package/dist/esm/observation/observable.js +5 -5
  153. package/dist/esm/observation/update-queue.js +47 -58
  154. package/dist/esm/platform.js +31 -30
  155. package/dist/esm/render.js +1 -0
  156. package/dist/esm/schema.js +1 -0
  157. package/dist/esm/state/exports.js +1 -1
  158. package/dist/esm/styles/css-directive.js +1 -2
  159. package/dist/esm/styles/css.js +15 -56
  160. package/dist/esm/styles/element-styles.js +69 -15
  161. package/dist/esm/styles.js +2 -0
  162. package/dist/esm/templating/html-binding-directive.js +24 -10
  163. package/dist/esm/templating/hydration-view.js +235 -0
  164. package/dist/esm/templating/render.js +13 -2
  165. package/dist/esm/templating/repeat.js +36 -34
  166. package/dist/esm/templating/template.js +7 -7
  167. package/dist/esm/templating/view.js +24 -233
  168. package/dist/esm/templating.js +7 -0
  169. package/dist/esm/testing/exports.js +2 -2
  170. package/dist/esm/updates.js +1 -0
  171. package/dist/esm/volatile.js +1 -0
  172. package/dist/fast-element.api.json +9017 -6996
  173. package/dist/fast-element.d.ts +3557 -796
  174. package/dist/fast-element.debug.js +5093 -4419
  175. package/dist/fast-element.debug.min.js +2 -2
  176. package/dist/fast-element.js +5398 -4655
  177. package/dist/fast-element.min.js +2 -2
  178. package/dist/fast-element.untrimmed.d.ts +881 -481
  179. package/dist/hydration/hydration.api.json +5237 -0
  180. package/dist/styles/styles.api.json +2672 -0
  181. package/docs/api-report.api.md +344 -167
  182. package/docs/arrays/api-report.api.md +114 -0
  183. package/docs/declarative/api-report.api.md +397 -0
  184. package/docs/hydration/api-report.api.md +285 -0
  185. package/docs/styles/api-report.api.md +135 -0
  186. package/package.json +149 -40
  187. package/playwright.declarative.config.ts +26 -0
  188. package/playwright.declarative.webui.config.ts +20 -0
  189. package/scripts/declarative/build-fixtures-with-webui.js +135 -0
  190. package/scripts/declarative/build-fixtures.js +49 -0
  191. package/scripts/declarative/build-fixtures.utilities.js +101 -0
  192. package/scripts/measure-sizes.js +219 -0
  193. package/scripts/run-api-extractor.js +39 -20
  194. package/test/declarative/fixtures/README.md +72 -0
  195. package/test/declarative/fixtures/WRITING_FIXTURES.md +330 -0
  196. package/test/declarative/fixtures/bindings/README.md +12 -0
  197. package/test/declarative/fixtures/bindings/attribute/entry.html +13 -0
  198. package/test/declarative/fixtures/bindings/attribute/fast-build.config.json +6 -0
  199. package/test/declarative/fixtures/bindings/attribute/index.html +25 -0
  200. package/test/declarative/fixtures/bindings/attribute/main.ts +41 -0
  201. package/test/declarative/fixtures/bindings/attribute/state.json +8 -0
  202. package/test/declarative/fixtures/bindings/attribute/templates.html +11 -0
  203. package/test/declarative/fixtures/bindings/content/entry.html +12 -0
  204. package/test/declarative/fixtures/bindings/content/fast-build.config.json +6 -0
  205. package/test/declarative/fixtures/bindings/content/index.html +19 -0
  206. package/test/declarative/fixtures/bindings/content/main.ts +27 -0
  207. package/test/declarative/fixtures/bindings/content/state.json +4 -0
  208. package/test/declarative/fixtures/bindings/content/templates.html +6 -0
  209. package/test/declarative/fixtures/bindings/dot-syntax/entry.html +11 -0
  210. package/test/declarative/fixtures/bindings/dot-syntax/fast-build.config.json +6 -0
  211. package/test/declarative/fixtures/bindings/dot-syntax/index.html +47 -0
  212. package/test/declarative/fixtures/bindings/dot-syntax/main.ts +59 -0
  213. package/test/declarative/fixtures/bindings/dot-syntax/state.json +16 -0
  214. package/test/declarative/fixtures/bindings/dot-syntax/templates.html +17 -0
  215. package/test/declarative/fixtures/bindings/event/entry.html +11 -0
  216. package/test/declarative/fixtures/bindings/event/fast-build.config.json +6 -0
  217. package/test/declarative/fixtures/bindings/event/index.html +43 -0
  218. package/test/declarative/fixtures/bindings/event/main.ts +43 -0
  219. package/test/declarative/fixtures/bindings/event/state.json +3 -0
  220. package/test/declarative/fixtures/bindings/event/templates.html +18 -0
  221. package/test/declarative/fixtures/bindings/host/entry.html +40 -0
  222. package/test/declarative/fixtures/bindings/host/fast-build.config.json +6 -0
  223. package/test/declarative/fixtures/bindings/host/index.html +96 -0
  224. package/test/declarative/fixtures/bindings/host/main.ts +222 -0
  225. package/test/declarative/fixtures/bindings/host/state.json +9 -0
  226. package/test/declarative/fixtures/bindings/host/templates.html +55 -0
  227. package/test/declarative/fixtures/directives/README.md +12 -0
  228. package/test/declarative/fixtures/directives/children/entry.html +11 -0
  229. package/test/declarative/fixtures/directives/children/fast-build.config.json +6 -0
  230. package/test/declarative/fixtures/directives/children/index.html +15 -0
  231. package/test/declarative/fixtures/directives/children/main.ts +22 -0
  232. package/test/declarative/fixtures/directives/children/state.json +3 -0
  233. package/test/declarative/fixtures/directives/children/templates.html +3 -0
  234. package/test/declarative/fixtures/directives/ref/entry.html +11 -0
  235. package/test/declarative/fixtures/directives/ref/fast-build.config.json +6 -0
  236. package/test/declarative/fixtures/directives/ref/index.html +15 -0
  237. package/test/declarative/fixtures/directives/ref/main.ts +17 -0
  238. package/test/declarative/fixtures/directives/ref/state.json +1 -0
  239. package/test/declarative/fixtures/directives/ref/templates.html +3 -0
  240. package/test/declarative/fixtures/directives/repeat/entry.html +21 -0
  241. package/test/declarative/fixtures/directives/repeat/fast-build.config.json +6 -0
  242. package/test/declarative/fixtures/directives/repeat/index.html +133 -0
  243. package/test/declarative/fixtures/directives/repeat/main.ts +110 -0
  244. package/test/declarative/fixtures/directives/repeat/sprites.svg +8 -0
  245. package/test/declarative/fixtures/directives/repeat/state.json +10 -0
  246. package/test/declarative/fixtures/directives/repeat/templates.html +75 -0
  247. package/test/declarative/fixtures/directives/slotted/entry.html +17 -0
  248. package/test/declarative/fixtures/directives/slotted/fast-build.config.json +6 -0
  249. package/test/declarative/fixtures/directives/slotted/index.html +27 -0
  250. package/test/declarative/fixtures/directives/slotted/main.ts +29 -0
  251. package/test/declarative/fixtures/directives/slotted/state.json +1 -0
  252. package/test/declarative/fixtures/directives/slotted/templates.html +7 -0
  253. package/test/declarative/fixtures/directives/when/entry.html +51 -0
  254. package/test/declarative/fixtures/directives/when/fast-build.config.json +6 -0
  255. package/test/declarative/fixtures/directives/when/index.html +136 -0
  256. package/test/declarative/fixtures/directives/when/main.ts +172 -0
  257. package/test/declarative/fixtures/directives/when/state.json +12 -0
  258. package/test/declarative/fixtures/directives/when/templates.html +75 -0
  259. package/test/declarative/fixtures/ecosystem/README.md +11 -0
  260. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/entry.html +12 -0
  261. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/fast-build.config.json +6 -0
  262. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/index.html +20 -0
  263. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/main.ts +68 -0
  264. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/state.json +4 -0
  265. package/test/declarative/fixtures/ecosystem/declarative-no-hydration/templates.html +7 -0
  266. package/test/declarative/fixtures/ecosystem/errors/entry.html +12 -0
  267. package/test/declarative/fixtures/ecosystem/errors/fast-build.config.json +6 -0
  268. package/test/declarative/fixtures/ecosystem/errors/index.html +20 -0
  269. package/test/declarative/fixtures/ecosystem/errors/main.ts +17 -0
  270. package/test/declarative/fixtures/ecosystem/errors/state.json +1 -0
  271. package/test/declarative/fixtures/ecosystem/errors/templates.html +7 -0
  272. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/entry.html +17 -0
  273. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/fast-build.config.json +6 -0
  274. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/index.html +56 -0
  275. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/main.ts +134 -0
  276. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/state.json +12 -0
  277. package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/templates.html +34 -0
  278. package/test/declarative/fixtures/ecosystem/performance-metrics/entry.html +25 -0
  279. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-build.config.json +6 -0
  280. package/test/declarative/fixtures/ecosystem/performance-metrics/fast-card.css +10 -0
  281. package/test/declarative/fixtures/ecosystem/performance-metrics/index.html +181 -0
  282. package/test/declarative/fixtures/ecosystem/performance-metrics/main.ts +58 -0
  283. package/test/declarative/fixtures/ecosystem/performance-metrics/state.json +6 -0
  284. package/test/declarative/fixtures/ecosystem/performance-metrics/templates.html +15 -0
  285. package/test/declarative/fixtures/extensions/README.md +15 -0
  286. package/test/declarative/fixtures/extensions/attribute-map/entry.html +14 -0
  287. package/test/declarative/fixtures/extensions/attribute-map/fast-build.config.json +6 -0
  288. package/test/declarative/fixtures/extensions/attribute-map/index.html +31 -0
  289. package/test/declarative/fixtures/extensions/attribute-map/main.ts +40 -0
  290. package/test/declarative/fixtures/extensions/attribute-map/state.json +4 -0
  291. package/test/declarative/fixtures/extensions/attribute-map/templates.html +14 -0
  292. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/entry.html +12 -0
  293. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/fast-build.config.json +7 -0
  294. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/index.html +25 -0
  295. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/main.ts +31 -0
  296. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/state.json +5 -0
  297. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/templates.html +11 -0
  298. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/entry.html +13 -0
  299. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/fast-build.config.json +7 -0
  300. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/index.html +23 -0
  301. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/main.ts +37 -0
  302. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/state.json +1 -0
  303. package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/templates.html +9 -0
  304. package/test/declarative/fixtures/extensions/observer-map/entry.html +15 -0
  305. package/test/declarative/fixtures/extensions/observer-map/fast-build.config.json +6 -0
  306. package/test/declarative/fixtures/extensions/observer-map/index.html +442 -0
  307. package/test/declarative/fixtures/extensions/observer-map/main.ts +482 -0
  308. package/test/declarative/fixtures/extensions/observer-map/state.json +158 -0
  309. package/test/declarative/fixtures/extensions/observer-map/templates.html +172 -0
  310. package/test/declarative/fixtures/extensions/observer-map-config-object/entry.html +16 -0
  311. package/test/declarative/fixtures/extensions/observer-map-config-object/fast-build.config.json +6 -0
  312. package/test/declarative/fixtures/extensions/observer-map-config-object/index.html +27 -0
  313. package/test/declarative/fixtures/extensions/observer-map-config-object/main.ts +53 -0
  314. package/test/declarative/fixtures/extensions/observer-map-config-object/state.json +9 -0
  315. package/test/declarative/fixtures/extensions/observer-map-config-object/templates.html +12 -0
  316. package/test/declarative/fixtures/extensions/observer-map-deep-merge/README.md +98 -0
  317. package/test/declarative/fixtures/extensions/observer-map-deep-merge/entry.html +156 -0
  318. package/test/declarative/fixtures/extensions/observer-map-deep-merge/fast-build.config.json +6 -0
  319. package/test/declarative/fixtures/extensions/observer-map-deep-merge/index.html +376 -0
  320. package/test/declarative/fixtures/extensions/observer-map-deep-merge/main.ts +366 -0
  321. package/test/declarative/fixtures/extensions/observer-map-deep-merge/state.json +69 -0
  322. package/test/declarative/fixtures/extensions/observer-map-deep-merge/templates.html +91 -0
  323. package/test/declarative/fixtures/extensions/observer-map-properties/entry.html +14 -0
  324. package/test/declarative/fixtures/extensions/observer-map-properties/fast-build.config.json +6 -0
  325. package/test/declarative/fixtures/extensions/observer-map-properties/index.html +110 -0
  326. package/test/declarative/fixtures/extensions/observer-map-properties/main.ts +175 -0
  327. package/test/declarative/fixtures/extensions/observer-map-properties/state.json +29 -0
  328. package/test/declarative/fixtures/extensions/observer-map-properties/templates.html +55 -0
  329. package/test/declarative/fixtures/scenarios/README.md +7 -0
  330. package/test/declarative/fixtures/scenarios/nested-elements/entry.html +16 -0
  331. package/test/declarative/fixtures/scenarios/nested-elements/fast-build.config.json +6 -0
  332. package/test/declarative/fixtures/scenarios/nested-elements/index.html +126 -0
  333. package/test/declarative/fixtures/scenarios/nested-elements/main.ts +214 -0
  334. package/test/declarative/fixtures/scenarios/nested-elements/state.json +10 -0
  335. package/test/declarative/fixtures/scenarios/nested-elements/templates.html +54 -0
  336. package/test/declarative/index.html +12 -0
  337. package/test/declarative/vite.config.ts +55 -0
  338. package/test/declarative-main.ts +6 -0
  339. package/test/extension-subpaths-main.ts +9 -0
  340. package/test/main.ts +38 -33
  341. package/test/pure-declarative-main.ts +1 -0
  342. package/dist/dts/components/install-hydration.d.ts +0 -1
  343. package/dist/dts/pending-task.d.ts +0 -32
  344. package/dist/dts/polyfills.d.ts +0 -0
  345. package/dist/dts/styles/css-binding-directive.d.ts +0 -60
  346. package/dist/dts/templating/install-hydratable-view-templates.d.ts +0 -1
  347. package/dist/esm/components/install-hydration.js +0 -3
  348. package/dist/esm/pending-task.js +0 -28
  349. package/dist/esm/polyfills.js +0 -60
  350. package/dist/esm/styles/css-binding-directive.js +0 -76
  351. 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>