@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,175 @@
1
+ import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
2
+ import { FASTElement } from "@microsoft/fast-element/fast-element.js";
3
+ import { observerMap } from "@microsoft/fast-element/observer-map.js";
4
+
5
+ class SelectiveObsElement extends FASTElement {
6
+ public user = {
7
+ name: "Alice",
8
+ age: 28,
9
+ history: {
10
+ joined: "2020-01-01",
11
+ visits: 100,
12
+ },
13
+ location: {
14
+ city: "New York",
15
+ country: "USA",
16
+ },
17
+ };
18
+
19
+ public settings = {
20
+ theme: "dark",
21
+ language: "en",
22
+ };
23
+
24
+ public analytics = {
25
+ charts: {
26
+ activeChart: "line",
27
+ cachedData: "heavy-data",
28
+ },
29
+ summary: "good",
30
+ };
31
+
32
+ public updateUserName = () => {
33
+ this.user.name = "Bob";
34
+ };
35
+
36
+ public updateUserAge = () => {
37
+ this.user.age = 29;
38
+ };
39
+
40
+ public updateHistory = () => {
41
+ this.user.history.visits = 200;
42
+ };
43
+
44
+ public updateLocation = () => {
45
+ this.user.location.city = "London";
46
+ };
47
+
48
+ public updateSettings = () => {
49
+ this.settings.theme = "light";
50
+ };
51
+
52
+ public updateActiveChart = () => {
53
+ this.analytics.charts.activeChart = "bar";
54
+ };
55
+
56
+ public updateCachedData = () => {
57
+ this.analytics.charts.cachedData = "updated-heavy-data";
58
+ };
59
+
60
+ public updateSummary = () => {
61
+ this.analytics.summary = "excellent";
62
+ };
63
+ }
64
+
65
+ SelectiveObsElement.define(
66
+ {
67
+ name: "selective-obs-element",
68
+ template: declarativeTemplate(),
69
+ },
70
+ [
71
+ observerMap({
72
+ properties: {
73
+ user: {
74
+ name: true,
75
+ age: true,
76
+ history: false,
77
+ location: true,
78
+ },
79
+ // settings is NOT listed → skipped
80
+ analytics: {
81
+ charts: {
82
+ $observe: false,
83
+ activeChart: true,
84
+ },
85
+ summary: true,
86
+ },
87
+ },
88
+ }),
89
+ ],
90
+ );
91
+
92
+ class AllObsElement extends FASTElement {
93
+ public user = {
94
+ name: "Alice",
95
+ };
96
+
97
+ public settings = {
98
+ theme: "dark",
99
+ };
100
+
101
+ public updateUserName = () => {
102
+ this.user.name = "Bob";
103
+ };
104
+
105
+ public updateSettings = () => {
106
+ this.settings.theme = "light";
107
+ };
108
+ }
109
+
110
+ AllObsElement.define(
111
+ {
112
+ name: "all-obs-element",
113
+ template: declarativeTemplate(),
114
+ },
115
+ [observerMap()],
116
+ );
117
+
118
+ class EmptyPropsElement extends FASTElement {
119
+ public user = {
120
+ name: "Alice",
121
+ };
122
+
123
+ public settings = {
124
+ theme: "dark",
125
+ };
126
+
127
+ public updateUserName = () => {
128
+ this.user.name = "Bob";
129
+ };
130
+
131
+ public updateSettings = () => {
132
+ this.settings.theme = "light";
133
+ };
134
+ }
135
+
136
+ EmptyPropsElement.define(
137
+ {
138
+ name: "empty-props-element",
139
+ template: declarativeTemplate(),
140
+ },
141
+ [
142
+ observerMap({
143
+ properties: {},
144
+ }),
145
+ ],
146
+ );
147
+
148
+ class ArraySelectiveElement extends FASTElement {
149
+ public items: any[] = [
150
+ { text: "item-1", meta: { count: 1 } },
151
+ { text: "item-2", meta: { count: 2 } },
152
+ ];
153
+
154
+ public updateItemText = () => {
155
+ this.items[0].text = "updated-item-1";
156
+ };
157
+
158
+ public addItem = () => {
159
+ this.items.push({ text: "item-3", meta: { count: 3 } });
160
+ };
161
+ }
162
+
163
+ ArraySelectiveElement.define(
164
+ {
165
+ name: "array-selective-element",
166
+ template: declarativeTemplate(),
167
+ },
168
+ [
169
+ observerMap({
170
+ properties: {
171
+ items: true,
172
+ },
173
+ }),
174
+ ],
175
+ );
@@ -0,0 +1,29 @@
1
+ {
2
+ "user": {
3
+ "name": "Alice",
4
+ "age": 28,
5
+ "history": {
6
+ "joined": "2020-01-01",
7
+ "visits": 100
8
+ },
9
+ "location": {
10
+ "city": "New York",
11
+ "country": "USA"
12
+ }
13
+ },
14
+ "settings": {
15
+ "theme": "dark",
16
+ "language": "en"
17
+ },
18
+ "analytics": {
19
+ "charts": {
20
+ "activeChart": "line",
21
+ "cachedData": "heavy-data"
22
+ },
23
+ "summary": "good"
24
+ },
25
+ "items": [
26
+ { "text": "item-1", "meta": { "count": 1 } },
27
+ { "text": "item-2", "meta": { "count": 2 } }
28
+ ]
29
+ }
@@ -0,0 +1,55 @@
1
+ <f-template name="selective-obs-element">
2
+ <template>
3
+ <div class="user-section">
4
+ <span class="user-name">{{user.name}}</span>
5
+ <span class="user-age">{{user.age}}</span>
6
+ <span class="user-history-joined">{{user.history.joined}}</span>
7
+ <span class="user-history-visits">{{user.history.visits}}</span>
8
+ <span class="user-location-city">{{user.location.city}}</span>
9
+ </div>
10
+ <div class="settings-section">
11
+ <span class="settings-theme">{{settings.theme}}</span>
12
+ </div>
13
+ <div class="analytics-section">
14
+ <span class="active-chart">{{analytics.charts.activeChart}}</span>
15
+ <span class="cached-data">{{analytics.charts.cachedData}}</span>
16
+ <span class="analytics-summary">{{analytics.summary}}</span>
17
+ </div>
18
+ <button @click="{updateUserName()}">Update Name</button>
19
+ <button @click="{updateUserAge()}">Update Age</button>
20
+ <button @click="{updateHistory()}">Update History</button>
21
+ <button @click="{updateLocation()}">Update Location</button>
22
+ <button @click="{updateSettings()}">Update Settings</button>
23
+ <button @click="{updateActiveChart()}">Update Active Chart</button>
24
+ <button @click="{updateCachedData()}">Update Cached Data</button>
25
+ <button @click="{updateSummary()}">Update Summary</button>
26
+ </template>
27
+ </f-template>
28
+ <f-template name="all-obs-element">
29
+ <template>
30
+ <span class="user-name">{{user.name}}</span>
31
+ <span class="settings-theme">{{settings.theme}}</span>
32
+ <button @click="{updateUserName()}">Update Name</button>
33
+ <button @click="{updateSettings()}">Update Settings</button>
34
+ </template>
35
+ </f-template>
36
+ <f-template name="empty-props-element">
37
+ <template>
38
+ <span class="user-name">{{user.name}}</span>
39
+ <span class="settings-theme">{{settings.theme}}</span>
40
+ <button @click="{updateUserName()}">Update Name</button>
41
+ <button @click="{updateSettings()}">Update Settings</button>
42
+ </template>
43
+ </f-template>
44
+ <f-template name="array-selective-element">
45
+ <template>
46
+ <f-repeat value="{{item in items}}">
47
+ <div class="item-row">
48
+ <span class="item-text">{{item.text}}</span>
49
+ <span class="item-count">{{item.meta.count}}</span>
50
+ </div>
51
+ </f-repeat>
52
+ <button @click="{updateItemText()}">Update Item Text</button>
53
+ <button @click="{addItem()}">Add Item</button>
54
+ </template>
55
+ </f-template>
@@ -0,0 +1,7 @@
1
+ # Scenarios
2
+
3
+ Fixtures for complex scenarios that may involve multiple features interacting together and edge cases that arise from real-world usage patterns.
4
+
5
+ | Fixture | Description |
6
+ |---|---|
7
+ | `nested-elements` | Nested custom elements with state propagation through shadow boundaries, event handling inside `f-repeat` with `$c.parent` context access, and `f-when` conditions within repeated content. |
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Nested Elements Hydration Tests</title>
7
+ </head>
8
+ <body>
9
+ <parent-element category="{{category}}"></parent-element>
10
+ <parent-element title="Empty List" :items="{{emptyItems}}" category="{{category}}"></parent-element>
11
+ <parent-element title="Single Item" :items="{{singleItem}}" category="{{category}}"></parent-element>
12
+ <test-element-repeat-event></test-element-repeat-event>
13
+ <test-when-in-repeat></test-when-in-repeat>
14
+ <script type="module" src="./main.ts"></script>
15
+ </body>
16
+ </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,126 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Nested Elements Hydration Tests</title>
7
+ </head>
8
+ <body>
9
+ <parent-element category="General"><template shadowrootmode="open" shadowroot="open"><div class="list-container">
10
+ <h2><!--fe:b-->My Items<!--fe:/b--></h2>
11
+ <div class="items">
12
+ <!--fe:b--><!--fe:r-->
13
+ <child-element text="Item 1" idx="0" category="General" data-fe="3"><template shadowrootmode="open" shadowroot="open"><div class="item">
14
+ <span class="index"><!--fe:b-->0<!--fe:/b--></span>
15
+ <span class="text"><!--fe:b-->Item 1<!--fe:/b--></span>
16
+ <grand-child-element category="General" data-fe="1"><template shadowrootmode="open" shadowroot="open"><span class="category"><!--fe:b-->General<!--fe:/b--></span></template></grand-child-element>
17
+ </div></template></child-element>
18
+ <!--fe:/r--><!--fe:r-->
19
+ <child-element text="Item 2" idx="1" category="General" data-fe="3"><template shadowrootmode="open" shadowroot="open"><div class="item">
20
+ <span class="index"><!--fe:b-->1<!--fe:/b--></span>
21
+ <span class="text"><!--fe:b-->Item 2<!--fe:/b--></span>
22
+ <grand-child-element category="General" data-fe="1"><template shadowrootmode="open" shadowroot="open"><span class="category"><!--fe:b-->General<!--fe:/b--></span></template></grand-child-element>
23
+ </div></template></child-element>
24
+ <!--fe:/r--><!--fe:r-->
25
+ <child-element text="Item 3" idx="2" category="General" data-fe="3"><template shadowrootmode="open" shadowroot="open"><div class="item">
26
+ <span class="index"><!--fe:b-->2<!--fe:/b--></span>
27
+ <span class="text"><!--fe:b-->Item 3<!--fe:/b--></span>
28
+ <grand-child-element category="General" data-fe="1"><template shadowrootmode="open" shadowroot="open"><span class="category"><!--fe:b-->General<!--fe:/b--></span></template></grand-child-element>
29
+ </div></template></child-element>
30
+ <!--fe:/r--><!--fe:/b-->
31
+ </div>
32
+ </div></template></parent-element>
33
+ <parent-element title="Empty List" category="General"><template shadowrootmode="open" shadowroot="open"><div class="list-container">
34
+ <h2><!--fe:b-->Empty List<!--fe:/b--></h2>
35
+ <div class="items">
36
+ <!--fe:b--><!--fe:/b-->
37
+ </div>
38
+ </div></template></parent-element>
39
+ <parent-element title="Single Item" category="General"><template shadowrootmode="open" shadowroot="open"><div class="list-container">
40
+ <h2><!--fe:b-->Single Item<!--fe:/b--></h2>
41
+ <div class="items">
42
+ <!--fe:b--><!--fe:r-->
43
+ <child-element text="Only Item" idx="0" category="General" data-fe="3"><template shadowrootmode="open" shadowroot="open"><div class="item">
44
+ <span class="index"><!--fe:b-->0<!--fe:/b--></span>
45
+ <span class="text"><!--fe:b-->Only Item<!--fe:/b--></span>
46
+ <grand-child-element category="General" data-fe="1"><template shadowrootmode="open" shadowroot="open"><span class="category"><!--fe:b-->General<!--fe:/b--></span></template></grand-child-element>
47
+ </div></template></child-element>
48
+ <!--fe:/r--><!--fe:/b-->
49
+ </div>
50
+ </div></template></parent-element>
51
+ <test-element-repeat-event><template shadowrootmode="open" shadowroot="open"><ul>
52
+ <!--fe:b--><!--fe:/b-->
53
+ </ul></template></test-element-repeat-event>
54
+ <test-when-in-repeat><template shadowrootmode="open" shadowroot="open"><ul>
55
+ <!--fe:b--><!--fe:r-->
56
+ <li>
57
+ <!--fe:b-->
58
+ <button class="name" type="button" data-fe="1"><!--fe:b-->Alpha<!--fe:/b--></button>
59
+ <!--fe:/b-->
60
+ </li>
61
+ <!--fe:/r--><!--fe:r-->
62
+ <li>
63
+ <!--fe:b-->
64
+ <button class="name" type="button" data-fe="1"><!--fe:b-->Beta<!--fe:/b--></button>
65
+ <!--fe:/b-->
66
+ </li>
67
+ <!--fe:/r--><!--fe:/b-->
68
+ </ul></template></test-when-in-repeat>
69
+ <f-template name="test-element-repeat-event">
70
+ <template>
71
+ <ul>
72
+ <f-repeat value="{{item in repeatEventItems}}">
73
+ <li>
74
+ <button type="button" @click="{$c.parent.handleItemClick($e)}">{{item.name}}</button>
75
+ </li>
76
+ </f-repeat>
77
+ </ul>
78
+ </template>
79
+ </f-template>
80
+ <f-template name="test-when-in-repeat">
81
+ <template>
82
+ <ul>
83
+ <f-repeat value="{{item in whenRepeatItems}}">
84
+ <li>
85
+ <f-when value="{{showNames}}">
86
+ <button class="name" type="button" @click="{$c.parent.handleItemClick($e)}">{{item.name}}</button>
87
+ </f-when>
88
+ </li>
89
+ </f-repeat>
90
+ </ul>
91
+ </template>
92
+ </f-template>
93
+ <f-template name="grand-child-element">
94
+ <template>
95
+ <span class="category">{{category}}</span>
96
+ </template>
97
+ </f-template>
98
+ <f-template name="child-element">
99
+ <template>
100
+ <div class="item">
101
+ <span class="index">{{idx}}</span>
102
+ <span class="text">{{text}}</span>
103
+ <grand-child-element category="{{category}}"></grand-child-element>
104
+ </div>
105
+ </template>
106
+ </f-template>
107
+ <f-template name="parent-element">
108
+ <template>
109
+ <div class="list-container">
110
+ <h2>{{title}}</h2>
111
+ <div class="items">
112
+ <f-repeat value="{{item in items}}" positioning="true">
113
+ <child-element
114
+ text="{{item.text}}"
115
+ idx="{{$index}}"
116
+ category="{{category}}"
117
+ ></child-element>
118
+ </f-repeat>
119
+ </div>
120
+ </div>
121
+ </template>
122
+ </f-template>
123
+
124
+ <script type="module" src="./main.ts"></script>
125
+ </body>
126
+ </html>
@@ -0,0 +1,214 @@
1
+ import { attr } from "@microsoft/fast-element/attr.js";
2
+ import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
3
+ import { deepMerge } from "@microsoft/fast-element/declarative-utilities.js";
4
+ import { FASTElement } from "@microsoft/fast-element/fast-element.js";
5
+ import { enableHydration } from "@microsoft/fast-element/hydration.js";
6
+ import { observable } from "@microsoft/fast-element/observable.js";
7
+ import { observerMap } from "@microsoft/fast-element/observer-map.js";
8
+
9
+ (window as any).messages = [];
10
+
11
+ const lifecycleCallbacks = {
12
+ elementDidDefine(name: string) {
13
+ (window as any).messages.push(
14
+ `Element did define: ${name} [${performance.now()}]`,
15
+ );
16
+ },
17
+ elementDidRegister(name: string) {
18
+ (window as any).messages.push(
19
+ `Element did register: ${name} [${performance.now()}]`,
20
+ );
21
+ },
22
+ templateDidUpdate(name: string) {
23
+ (window as any).messages.push(
24
+ `Template did update: ${name} [${performance.now()}]`,
25
+ );
26
+ },
27
+ templateWillUpdate(name: string) {
28
+ (window as any).messages.push(
29
+ `Template will update: ${name} [${performance.now()}]`,
30
+ );
31
+ },
32
+ };
33
+
34
+ enableHydration({
35
+ hydrationComplete() {
36
+ (window as any).messages.push(`Hydration complete [${performance.now()}]`);
37
+ (window as any).hydrationCompleted = true;
38
+ },
39
+ });
40
+
41
+ // Mock data sources - simulating fetched data
42
+ const mockDataSources = {
43
+ getListData(listId: string) {
44
+ const dataSets: Record<
45
+ string,
46
+ { title: string; items: Array<{ text: string }> }
47
+ > = {
48
+ "list-1": {
49
+ title: "My Items",
50
+ items: [{ text: "Item 1" }, { text: "Item 2" }, { text: "Item 3" }],
51
+ },
52
+ "list-2": {
53
+ title: "Empty List",
54
+ items: [],
55
+ },
56
+ "list-3": {
57
+ title: "Single Item",
58
+ items: [{ text: "Only Item" }],
59
+ },
60
+ };
61
+ return dataSets[listId] || { title: "Unknown List", items: [] };
62
+ },
63
+ getItemData(itemId: string) {
64
+ // Simulate fetching individual item data
65
+ return { text: `Loaded: ${itemId}`, timestamp: Date.now() };
66
+ },
67
+ getItemById(itemId: string) {
68
+ // Simulate fetching item data by ID
69
+ const itemDataMap: Record<string, { text: string; idx: number }> = {
70
+ "item-1": { text: "Item 1", idx: 0 },
71
+ "item-2": { text: "Item 2", idx: 1 },
72
+ "item-3": { text: "Item 3", idx: 2 },
73
+ "item-4": { text: "Only Item", idx: 0 },
74
+ };
75
+ return itemDataMap[itemId] || { text: "Unknown", idx: 0 };
76
+ },
77
+ };
78
+
79
+ export class ItemList extends FASTElement {
80
+ @observable
81
+ public items: Array<{ text: string }> = [];
82
+
83
+ @observable
84
+ public title: string = "";
85
+
86
+ @attr
87
+ public category!: string;
88
+
89
+ // Track which list instance this is (1st, 2nd, or 3rd on the page)
90
+ private static connectedCallCount = 0;
91
+ private static instanceMap = new WeakMap<ItemList, number>();
92
+
93
+ connectedCallback() {
94
+ if (!ItemList.instanceMap.has(this)) {
95
+ ItemList.connectedCallCount++;
96
+ ItemList.instanceMap.set(this, ItemList.connectedCallCount);
97
+ }
98
+
99
+ const instanceNumber = ItemList.instanceMap.get(this) || 0;
100
+ const listIds = ["list-1", "list-2", "list-3"];
101
+ const listId = listIds[instanceNumber - 1] || "list-1";
102
+ const data = mockDataSources.getListData(listId);
103
+
104
+ // Set data BEFORE super so items are in _items before
105
+ // ElementController.bindObservables replays boundObservables
106
+ this.title = data.title;
107
+ this.items = data.items;
108
+
109
+ super.connectedCallback();
110
+ }
111
+ }
112
+
113
+ export class Item extends FASTElement {
114
+ @observable
115
+ public text: string = "";
116
+
117
+ @observable
118
+ public idx: number = 0;
119
+
120
+ @attr
121
+ public category!: string;
122
+
123
+ // Track which item instance this is globally
124
+ private static connectedCallCount = 0;
125
+ private static instanceMap = new WeakMap<Item, number>();
126
+
127
+ connectedCallback() {
128
+ if (!Item.instanceMap.has(this)) {
129
+ Item.connectedCallCount++;
130
+ Item.instanceMap.set(this, Item.connectedCallCount);
131
+ }
132
+
133
+ const instanceNumber = Item.instanceMap.get(this) || 0;
134
+ const itemIds = ["item-1", "item-2", "item-3", "item-4"];
135
+ const itemId = itemIds[instanceNumber - 1] || "item-1";
136
+ const data = mockDataSources.getItemById(itemId);
137
+
138
+ // Set data before super so it's available during hydration
139
+ deepMerge(this, data);
140
+
141
+ super.connectedCallback();
142
+ }
143
+ }
144
+
145
+ export class GrandChildItem extends FASTElement {
146
+ @attr
147
+ public category!: string;
148
+ }
149
+
150
+ export interface RepeatItemType {
151
+ name: string;
152
+ }
153
+
154
+ export class TestElementRepeatEvent extends FASTElement {
155
+ @observable
156
+ repeatEventItems: Array<RepeatItemType> = [];
157
+
158
+ @observable
159
+ clickedItemName: string = "";
160
+
161
+ // Called via $c.parent.handleItemClick — `this` is bound to the host
162
+ // because the $c.parent path resolves the method owner from the context.
163
+ handleItemClick(e: Event) {
164
+ this.clickedItemName = (e.currentTarget as HTMLButtonElement).textContent!;
165
+ }
166
+ }
167
+ TestElementRepeatEvent.define({
168
+ name: "test-element-repeat-event",
169
+ template: declarativeTemplate(lifecycleCallbacks),
170
+ });
171
+
172
+ export class TestWhenInRepeat extends FASTElement {
173
+ @observable whenRepeatItems: Array<RepeatItemType> = [
174
+ { name: "Alpha" },
175
+ { name: "Beta" },
176
+ ];
177
+ @observable showNames: boolean = true;
178
+ @observable clickedItemName: string = "";
179
+
180
+ handleItemClick(e: Event) {
181
+ this.clickedItemName = (e.currentTarget as HTMLButtonElement).textContent!;
182
+ }
183
+ }
184
+ TestWhenInRepeat.define(
185
+ {
186
+ name: "test-when-in-repeat",
187
+ template: declarativeTemplate(lifecycleCallbacks),
188
+ },
189
+ [observerMap()],
190
+ );
191
+
192
+ ItemList.define(
193
+ {
194
+ name: "parent-element",
195
+ template: declarativeTemplate(lifecycleCallbacks),
196
+ },
197
+ [observerMap()],
198
+ );
199
+
200
+ Item.define(
201
+ {
202
+ name: "child-element",
203
+ template: declarativeTemplate(lifecycleCallbacks),
204
+ },
205
+ [observerMap()],
206
+ );
207
+
208
+ GrandChildItem.define(
209
+ {
210
+ name: "grand-child-element",
211
+ template: declarativeTemplate(lifecycleCallbacks),
212
+ },
213
+ [observerMap()],
214
+ );
@@ -0,0 +1,10 @@
1
+ {
2
+ "title": "My Items",
3
+ "items": [{ "text": "Item 1" }, { "text": "Item 2" }, { "text": "Item 3" }],
4
+ "emptyItems": [],
5
+ "singleItem": [{ "text": "Only Item" }],
6
+ "category": "General",
7
+ "repeatEventItems": [],
8
+ "whenRepeatItems": [{ "name": "Alpha" }, { "name": "Beta" }],
9
+ "showNames": true
10
+ }