@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.
- package/ARCHITECTURE_HTML_TAGGED_TEMPLATE_LITERAL.md +1 -1
- package/ARCHITECTURE_OVERVIEW.md +2 -2
- package/CHANGELOG.json +31 -1
- package/CHANGELOG.md +10 -2
- package/DECLARATIVE_DESIGN.md +806 -0
- package/DECLARATIVE_HTML.md +470 -0
- package/DECLARATIVE_MIGRATION.md +215 -0
- package/DECLARATIVE_RENDERING.md +530 -0
- package/DECLARATIVE_RENDERING_LIFECYCLE.md +288 -0
- package/DECLARATIVE_SCHEMA_OBSERVER_MAP.md +489 -0
- package/DESIGN.md +143 -34
- package/MIGRATION.md +387 -0
- package/README.md +208 -1
- package/SIZES.md +25 -0
- package/api-extractor.arrays.json +15 -0
- package/api-extractor.context.json +1 -0
- package/api-extractor.declarative.json +15 -0
- package/api-extractor.di.json +1 -0
- package/api-extractor.hydration.json +15 -0
- package/api-extractor.styles.json +15 -0
- package/dist/arrays/arrays.api.json +2621 -0
- package/dist/context/context.api.json +1 -1
- package/dist/declarative/declarative.api.json +7844 -0
- package/dist/di/di.api.json +2 -2
- package/dist/dts/array-observer.d.ts +2 -0
- package/dist/dts/arrays.d.ts +2 -0
- package/dist/dts/attr.d.ts +1 -0
- package/dist/dts/binding/signal.d.ts +6 -6
- package/dist/dts/binding/two-way.d.ts +1 -0
- package/dist/dts/binding.d.ts +7 -0
- package/dist/dts/components/attributes.d.ts +2 -5
- package/dist/dts/components/definition-schema-transforms.d.ts +9 -0
- package/dist/dts/components/element-controller.d.ts +80 -114
- package/dist/dts/components/element-hydration.d.ts +1 -1
- package/dist/dts/components/enable-hydration.d.ts +34 -0
- package/dist/dts/components/fast-definitions.d.ts +91 -42
- package/dist/dts/components/fast-element.d.ts +5 -8
- package/dist/dts/components/hydration-tracker.d.ts +40 -0
- package/dist/dts/components/hydration.d.ts +18 -53
- package/dist/dts/components/schema.d.ts +205 -0
- package/dist/dts/context.d.ts +6 -6
- package/dist/dts/css.d.ts +3 -0
- package/dist/dts/debug.d.ts +5 -1
- package/dist/dts/declarative/attribute-map.d.ts +58 -0
- package/dist/dts/declarative/debug.d.ts +5 -0
- package/dist/dts/declarative/index.d.ts +13 -0
- package/dist/dts/declarative/interfaces.d.ts +9 -0
- package/dist/dts/declarative/observer-map-utilities.d.ts +58 -0
- package/dist/dts/declarative/observer-map.d.ts +89 -0
- package/dist/dts/declarative/runtime.d.ts +5 -0
- package/dist/dts/declarative/syntax.d.ts +21 -0
- package/dist/dts/declarative/template-bridge.d.ts +33 -0
- package/dist/dts/declarative/template-parser.d.ts +98 -0
- package/dist/dts/declarative/template.d.ts +9 -0
- package/dist/dts/declarative/utilities.d.ts +312 -0
- package/dist/dts/di/di.d.ts +1 -1
- package/dist/dts/directives/children.d.ts +2 -0
- package/dist/dts/directives/node-observation.d.ts +2 -0
- package/dist/dts/directives/ref.d.ts +2 -0
- package/dist/dts/directives/repeat.d.ts +4 -0
- package/dist/dts/directives/slotted.d.ts +2 -0
- package/dist/dts/directives/when.d.ts +3 -0
- package/dist/dts/dom-policy.d.ts +1 -1
- package/dist/dts/html.d.ts +5 -0
- package/dist/dts/hydration/runtime.d.ts +7 -0
- package/dist/dts/hydration/target-builder.d.ts +15 -12
- package/dist/dts/hydration.d.ts +14 -0
- package/dist/dts/index.d.ts +38 -42
- package/dist/dts/index.debug.d.ts +0 -1
- package/dist/dts/index.rollup.debug.d.ts +0 -1
- package/dist/dts/interfaces.d.ts +1 -49
- package/dist/dts/observable.d.ts +3 -6
- package/dist/dts/observation/arrays.d.ts +1 -1
- package/dist/dts/observation/update-queue.d.ts +1 -1
- package/dist/dts/platform.d.ts +25 -4
- package/dist/dts/render.d.ts +7 -0
- package/dist/dts/schema.d.ts +1 -0
- package/dist/dts/state/exports.d.ts +1 -1
- package/dist/dts/state/state.d.ts +2 -2
- package/dist/dts/styles/css-directive.d.ts +5 -12
- package/dist/dts/styles/css.d.ts +5 -7
- package/dist/dts/styles/element-styles.d.ts +0 -10
- package/dist/dts/styles.d.ts +6 -0
- package/dist/dts/templating/children.d.ts +1 -1
- package/dist/dts/templating/html-binding-directive.d.ts +10 -0
- package/dist/dts/templating/html-directive.d.ts +17 -0
- package/dist/dts/templating/hydration-view.d.ts +109 -0
- package/dist/dts/templating/ref.d.ts +1 -1
- package/dist/dts/templating/render.d.ts +8 -2
- package/dist/dts/templating/repeat.d.ts +2 -2
- package/dist/dts/templating/slotted.d.ts +1 -1
- package/dist/dts/templating/template.d.ts +17 -9
- package/dist/dts/templating/view.d.ts +25 -102
- package/dist/dts/templating/when.d.ts +1 -1
- package/dist/dts/templating.d.ts +10 -0
- package/dist/dts/testing/exports.d.ts +2 -2
- package/dist/dts/tsdoc-metadata.json +1 -1
- package/dist/dts/updates.d.ts +1 -0
- package/dist/dts/volatile.d.ts +2 -0
- package/dist/esm/array-observer.js +1 -0
- package/dist/esm/arrays.js +1 -0
- package/dist/esm/attr.js +1 -0
- package/dist/esm/binding/normalize.js +1 -1
- package/dist/esm/binding/signal.js +4 -4
- package/dist/esm/binding/two-way.js +2 -1
- package/dist/esm/binding.js +4 -0
- package/dist/esm/components/attributes.js +8 -5
- package/dist/esm/components/definition-schema-transforms.js +23 -0
- package/dist/esm/components/element-controller.js +200 -269
- package/dist/esm/components/element-hydration.js +1 -1
- package/dist/esm/components/enable-hydration.js +100 -0
- package/dist/esm/components/fast-definitions.js +211 -49
- package/dist/esm/components/fast-element.js +18 -27
- package/dist/esm/components/hydration-tracker.js +93 -0
- package/dist/esm/components/hydration.js +62 -144
- package/dist/esm/components/schema.js +253 -0
- package/dist/esm/context.js +6 -6
- package/dist/esm/css.js +3 -0
- package/dist/esm/debug.js +26 -26
- package/dist/esm/declarative/attribute-map.js +121 -0
- package/dist/esm/declarative/debug.js +5 -0
- package/dist/esm/declarative/index.js +3 -0
- package/dist/esm/declarative/interfaces.js +10 -0
- package/dist/esm/declarative/observer-map-utilities.js +562 -0
- package/dist/esm/declarative/observer-map.js +216 -0
- package/dist/esm/declarative/runtime.js +14 -0
- package/dist/esm/declarative/syntax.js +36 -0
- package/dist/esm/declarative/template-bridge.js +170 -0
- package/dist/esm/declarative/template-parser.js +306 -0
- package/dist/esm/declarative/template.js +142 -0
- package/dist/esm/declarative/utilities.js +834 -0
- package/dist/esm/di/di.js +6 -8
- package/dist/esm/directives/children.js +1 -0
- package/dist/esm/directives/node-observation.js +1 -0
- package/dist/esm/directives/ref.js +1 -0
- package/dist/esm/directives/repeat.js +1 -0
- package/dist/esm/directives/slotted.js +1 -0
- package/dist/esm/directives/when.js +1 -0
- package/dist/esm/dom-policy.js +2 -2
- package/dist/esm/dom.js +1 -1
- package/dist/esm/html.js +2 -0
- package/dist/esm/hydration/runtime.js +33 -0
- package/dist/esm/hydration/target-builder.js +97 -90
- package/dist/esm/hydration.js +4 -0
- package/dist/esm/index.debug.js +2 -1
- package/dist/esm/index.js +34 -29
- package/dist/esm/index.rollup.debug.js +3 -2
- package/dist/esm/index.rollup.js +1 -1
- package/dist/esm/interfaces.js +1 -45
- package/dist/esm/observable.js +1 -4
- package/dist/esm/observation/arrays.js +1 -1
- package/dist/esm/observation/observable.js +5 -5
- package/dist/esm/observation/update-queue.js +47 -58
- package/dist/esm/platform.js +31 -30
- package/dist/esm/render.js +1 -0
- package/dist/esm/schema.js +1 -0
- package/dist/esm/state/exports.js +1 -1
- package/dist/esm/styles/css-directive.js +1 -2
- package/dist/esm/styles/css.js +15 -56
- package/dist/esm/styles/element-styles.js +69 -15
- package/dist/esm/styles.js +2 -0
- package/dist/esm/templating/html-binding-directive.js +24 -10
- package/dist/esm/templating/hydration-view.js +235 -0
- package/dist/esm/templating/render.js +13 -2
- package/dist/esm/templating/repeat.js +36 -34
- package/dist/esm/templating/template.js +7 -7
- package/dist/esm/templating/view.js +24 -233
- package/dist/esm/templating.js +7 -0
- package/dist/esm/testing/exports.js +2 -2
- package/dist/esm/updates.js +1 -0
- package/dist/esm/volatile.js +1 -0
- package/dist/fast-element.api.json +9017 -6996
- package/dist/fast-element.d.ts +3557 -796
- package/dist/fast-element.debug.js +5093 -4419
- package/dist/fast-element.debug.min.js +2 -2
- package/dist/fast-element.js +5398 -4655
- package/dist/fast-element.min.js +2 -2
- package/dist/fast-element.untrimmed.d.ts +881 -481
- package/dist/hydration/hydration.api.json +5237 -0
- package/dist/styles/styles.api.json +2672 -0
- package/docs/api-report.api.md +344 -167
- package/docs/arrays/api-report.api.md +114 -0
- package/docs/declarative/api-report.api.md +397 -0
- package/docs/hydration/api-report.api.md +285 -0
- package/docs/styles/api-report.api.md +135 -0
- package/package.json +149 -40
- package/playwright.declarative.config.ts +26 -0
- package/playwright.declarative.webui.config.ts +20 -0
- package/scripts/declarative/build-fixtures-with-webui.js +135 -0
- package/scripts/declarative/build-fixtures.js +49 -0
- package/scripts/declarative/build-fixtures.utilities.js +101 -0
- package/scripts/measure-sizes.js +219 -0
- package/scripts/run-api-extractor.js +39 -20
- package/test/declarative/fixtures/README.md +72 -0
- package/test/declarative/fixtures/WRITING_FIXTURES.md +330 -0
- package/test/declarative/fixtures/bindings/README.md +12 -0
- package/test/declarative/fixtures/bindings/attribute/entry.html +13 -0
- package/test/declarative/fixtures/bindings/attribute/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/attribute/index.html +25 -0
- package/test/declarative/fixtures/bindings/attribute/main.ts +41 -0
- package/test/declarative/fixtures/bindings/attribute/state.json +8 -0
- package/test/declarative/fixtures/bindings/attribute/templates.html +11 -0
- package/test/declarative/fixtures/bindings/content/entry.html +12 -0
- package/test/declarative/fixtures/bindings/content/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/content/index.html +19 -0
- package/test/declarative/fixtures/bindings/content/main.ts +27 -0
- package/test/declarative/fixtures/bindings/content/state.json +4 -0
- package/test/declarative/fixtures/bindings/content/templates.html +6 -0
- package/test/declarative/fixtures/bindings/dot-syntax/entry.html +11 -0
- package/test/declarative/fixtures/bindings/dot-syntax/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/dot-syntax/index.html +47 -0
- package/test/declarative/fixtures/bindings/dot-syntax/main.ts +59 -0
- package/test/declarative/fixtures/bindings/dot-syntax/state.json +16 -0
- package/test/declarative/fixtures/bindings/dot-syntax/templates.html +17 -0
- package/test/declarative/fixtures/bindings/event/entry.html +11 -0
- package/test/declarative/fixtures/bindings/event/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/event/index.html +43 -0
- package/test/declarative/fixtures/bindings/event/main.ts +43 -0
- package/test/declarative/fixtures/bindings/event/state.json +3 -0
- package/test/declarative/fixtures/bindings/event/templates.html +18 -0
- package/test/declarative/fixtures/bindings/host/entry.html +40 -0
- package/test/declarative/fixtures/bindings/host/fast-build.config.json +6 -0
- package/test/declarative/fixtures/bindings/host/index.html +96 -0
- package/test/declarative/fixtures/bindings/host/main.ts +222 -0
- package/test/declarative/fixtures/bindings/host/state.json +9 -0
- package/test/declarative/fixtures/bindings/host/templates.html +55 -0
- package/test/declarative/fixtures/directives/README.md +12 -0
- package/test/declarative/fixtures/directives/children/entry.html +11 -0
- package/test/declarative/fixtures/directives/children/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/children/index.html +15 -0
- package/test/declarative/fixtures/directives/children/main.ts +22 -0
- package/test/declarative/fixtures/directives/children/state.json +3 -0
- package/test/declarative/fixtures/directives/children/templates.html +3 -0
- package/test/declarative/fixtures/directives/ref/entry.html +11 -0
- package/test/declarative/fixtures/directives/ref/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/ref/index.html +15 -0
- package/test/declarative/fixtures/directives/ref/main.ts +17 -0
- package/test/declarative/fixtures/directives/ref/state.json +1 -0
- package/test/declarative/fixtures/directives/ref/templates.html +3 -0
- package/test/declarative/fixtures/directives/repeat/entry.html +21 -0
- package/test/declarative/fixtures/directives/repeat/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/repeat/index.html +133 -0
- package/test/declarative/fixtures/directives/repeat/main.ts +110 -0
- package/test/declarative/fixtures/directives/repeat/sprites.svg +8 -0
- package/test/declarative/fixtures/directives/repeat/state.json +10 -0
- package/test/declarative/fixtures/directives/repeat/templates.html +75 -0
- package/test/declarative/fixtures/directives/slotted/entry.html +17 -0
- package/test/declarative/fixtures/directives/slotted/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/slotted/index.html +27 -0
- package/test/declarative/fixtures/directives/slotted/main.ts +29 -0
- package/test/declarative/fixtures/directives/slotted/state.json +1 -0
- package/test/declarative/fixtures/directives/slotted/templates.html +7 -0
- package/test/declarative/fixtures/directives/when/entry.html +51 -0
- package/test/declarative/fixtures/directives/when/fast-build.config.json +6 -0
- package/test/declarative/fixtures/directives/when/index.html +136 -0
- package/test/declarative/fixtures/directives/when/main.ts +172 -0
- package/test/declarative/fixtures/directives/when/state.json +12 -0
- package/test/declarative/fixtures/directives/when/templates.html +75 -0
- package/test/declarative/fixtures/ecosystem/README.md +11 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/entry.html +12 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/index.html +20 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/main.ts +68 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/state.json +4 -0
- package/test/declarative/fixtures/ecosystem/declarative-no-hydration/templates.html +7 -0
- package/test/declarative/fixtures/ecosystem/errors/entry.html +12 -0
- package/test/declarative/fixtures/ecosystem/errors/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/errors/index.html +20 -0
- package/test/declarative/fixtures/ecosystem/errors/main.ts +17 -0
- package/test/declarative/fixtures/ecosystem/errors/state.json +1 -0
- package/test/declarative/fixtures/ecosystem/errors/templates.html +7 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/entry.html +17 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/index.html +56 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/main.ts +134 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/state.json +12 -0
- package/test/declarative/fixtures/ecosystem/lifecycle-callbacks/templates.html +34 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/entry.html +25 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/fast-build.config.json +6 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/fast-card.css +10 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/index.html +181 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/main.ts +58 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/state.json +6 -0
- package/test/declarative/fixtures/ecosystem/performance-metrics/templates.html +15 -0
- package/test/declarative/fixtures/extensions/README.md +15 -0
- package/test/declarative/fixtures/extensions/attribute-map/entry.html +14 -0
- package/test/declarative/fixtures/extensions/attribute-map/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/attribute-map/index.html +31 -0
- package/test/declarative/fixtures/extensions/attribute-map/main.ts +40 -0
- package/test/declarative/fixtures/extensions/attribute-map/state.json +4 -0
- package/test/declarative/fixtures/extensions/attribute-map/templates.html +14 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/entry.html +12 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/fast-build.config.json +7 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/index.html +25 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/main.ts +31 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/state.json +5 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy/templates.html +11 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/entry.html +13 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/fast-build.config.json +7 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/index.html +23 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/main.ts +37 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/state.json +1 -0
- package/test/declarative/fixtures/extensions/attribute-map-naming-strategy-camel-case/templates.html +9 -0
- package/test/declarative/fixtures/extensions/observer-map/entry.html +15 -0
- package/test/declarative/fixtures/extensions/observer-map/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map/index.html +442 -0
- package/test/declarative/fixtures/extensions/observer-map/main.ts +482 -0
- package/test/declarative/fixtures/extensions/observer-map/state.json +158 -0
- package/test/declarative/fixtures/extensions/observer-map/templates.html +172 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/entry.html +16 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/index.html +27 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/main.ts +53 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/state.json +9 -0
- package/test/declarative/fixtures/extensions/observer-map-config-object/templates.html +12 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/README.md +98 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/entry.html +156 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/index.html +376 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/main.ts +366 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/state.json +69 -0
- package/test/declarative/fixtures/extensions/observer-map-deep-merge/templates.html +91 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/entry.html +14 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/fast-build.config.json +6 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/index.html +110 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/main.ts +175 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/state.json +29 -0
- package/test/declarative/fixtures/extensions/observer-map-properties/templates.html +55 -0
- package/test/declarative/fixtures/scenarios/README.md +7 -0
- package/test/declarative/fixtures/scenarios/nested-elements/entry.html +16 -0
- package/test/declarative/fixtures/scenarios/nested-elements/fast-build.config.json +6 -0
- package/test/declarative/fixtures/scenarios/nested-elements/index.html +126 -0
- package/test/declarative/fixtures/scenarios/nested-elements/main.ts +214 -0
- package/test/declarative/fixtures/scenarios/nested-elements/state.json +10 -0
- package/test/declarative/fixtures/scenarios/nested-elements/templates.html +54 -0
- package/test/declarative/index.html +12 -0
- package/test/declarative/vite.config.ts +55 -0
- package/test/declarative-main.ts +6 -0
- package/test/extension-subpaths-main.ts +9 -0
- package/test/main.ts +38 -33
- package/test/pure-declarative-main.ts +1 -0
- package/dist/dts/components/install-hydration.d.ts +0 -1
- package/dist/dts/pending-task.d.ts +0 -32
- package/dist/dts/polyfills.d.ts +0 -0
- package/dist/dts/styles/css-binding-directive.d.ts +0 -60
- package/dist/dts/templating/install-hydratable-view-templates.d.ts +0 -1
- package/dist/esm/components/install-hydration.js +0 -3
- package/dist/esm/pending-task.js +0 -28
- package/dist/esm/polyfills.js +0 -60
- package/dist/esm/styles/css-binding-directive.js +0 -76
- package/dist/esm/templating/install-hydratable-view-templates.js +0 -23
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
<f-template name="observer-map-test-element">
|
|
2
|
+
<template>
|
|
3
|
+
<observer-map-internal-test-element
|
|
4
|
+
:selecteduserid="{{selecteduserid}}"
|
|
5
|
+
:totalusers="{{stats.totalusers}}"
|
|
6
|
+
:metrics="{{stats.metrics}}"
|
|
7
|
+
></observer-map-internal-test-element>
|
|
8
|
+
<div class="stats">
|
|
9
|
+
<h2>Global Stats</h2>
|
|
10
|
+
<div class="nested-info">
|
|
11
|
+
<strong>Total Users:</strong> {{stats.totalusers}} |
|
|
12
|
+
<strong>Active Users:</strong> {{stats.activeusers}}
|
|
13
|
+
</div>
|
|
14
|
+
<div class="nested-info">
|
|
15
|
+
<strong>Performance:</strong>
|
|
16
|
+
Load: {{stats.metrics.performance.loadtime}}s,
|
|
17
|
+
Render: {{stats.metrics.performance.rendertime}}s
|
|
18
|
+
</div>
|
|
19
|
+
<div class="controls">
|
|
20
|
+
<button @click="{updateStats()}">Update Stats</button>
|
|
21
|
+
<button @click="{addNewUser()}">Add New User</button>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div class="section">
|
|
26
|
+
<h2>Users List</h2>
|
|
27
|
+
<f-repeat value="{{user in users}}">
|
|
28
|
+
<div class="user-card">
|
|
29
|
+
<h3>{{user.name}} (ID: {{user.id}})
|
|
30
|
+
<f-when value="{{user.id == selecteduserid}}">
|
|
31
|
+
<span>⭐ SELECTED</span>
|
|
32
|
+
</f-when>
|
|
33
|
+
</h3>
|
|
34
|
+
|
|
35
|
+
<div class="nested-info">
|
|
36
|
+
<strong>Age:</strong> {{user.details.personal.age}} years old
|
|
37
|
+
</div>
|
|
38
|
+
<div class="nested-info">
|
|
39
|
+
<strong>Location:</strong> {{user.details.personal.location.city}}, {{user.details.personal.location.country}}
|
|
40
|
+
</div>
|
|
41
|
+
<div class="nested-info">
|
|
42
|
+
<strong>Coordinates:</strong>
|
|
43
|
+
Lat: {{user.details.personal.location.coordinates.lat}},
|
|
44
|
+
Lng: {{user.details.personal.location.coordinates.lng}}
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<div class="nested-info">
|
|
48
|
+
<strong>Theme:</strong> {{user.details.preferences.theme}} |
|
|
49
|
+
<strong>Email Notifications:</strong> {{user.details.preferences.notifications.email}} |
|
|
50
|
+
<strong>Push Notifications:</strong> {{user.details.preferences.notifications.push}}
|
|
51
|
+
</div>
|
|
52
|
+
<div class="nested-info">
|
|
53
|
+
<strong>Notification Frequency:</strong> {{user.details.preferences.notifications.settings.frequency}}
|
|
54
|
+
</div>
|
|
55
|
+
<div class="nested-info">
|
|
56
|
+
<strong>Categories:</strong>
|
|
57
|
+
<f-repeat value="{{category in user.details.preferences.notifications.settings.categories}}">
|
|
58
|
+
<span class="tag">{{category}}</span>
|
|
59
|
+
</f-repeat>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="controls">
|
|
63
|
+
<button @click="{selectUser(user.id)}">Select User</button>
|
|
64
|
+
<button @click="{updateUserAge(user.id)}">Age +1</button>
|
|
65
|
+
<button @click="{toggleUserTheme(user.id)}">Toggle Theme</button>
|
|
66
|
+
<button @click="{updateUserLocation(user.id)}">Change Location</button>
|
|
67
|
+
<button @click="{updateNotificationSettings(user.id)}">Update Notifications</button>
|
|
68
|
+
<button @click="{addNotificationCategory(user.id)}">Add Category</button>
|
|
69
|
+
<button @click="{removeNotificationCategory(user.id)}">Remove Tech Category</button>
|
|
70
|
+
<button @click="{removeUser(user.id)}">Remove User</button>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<div>
|
|
74
|
+
<h4>Posts ({{user.posts.length}} posts)</h4>
|
|
75
|
+
<f-repeat value="{{post in user.posts}}">
|
|
76
|
+
<div class="post-card">
|
|
77
|
+
<div><strong>{{post.title}}</strong> (ID: {{post.id}})</div>
|
|
78
|
+
<div class="nested-info">{{post.content}}</div>
|
|
79
|
+
<div class="nested-info">
|
|
80
|
+
<strong>Author:</strong> {{post.metadata.author.name}}
|
|
81
|
+
<f-when value="{{post.metadata.author.verified}}">
|
|
82
|
+
<span>✓ Verified</span>
|
|
83
|
+
</f-when>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="nested-info">
|
|
86
|
+
<strong>Stats:</strong> {{post.metadata.views}} views, {{post.metadata.likes}} likes
|
|
87
|
+
</div>
|
|
88
|
+
<div class="nested-info">
|
|
89
|
+
<strong>Tags:</strong>
|
|
90
|
+
<f-repeat value="{{tag in post.metadata.tags}}">
|
|
91
|
+
<span class="tag">{{tag}}</span>
|
|
92
|
+
</f-repeat>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="controls">
|
|
95
|
+
<button @click="{incrementPostLikes(post.id)}">Like Post</button>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</f-repeat>
|
|
99
|
+
<div class="controls">
|
|
100
|
+
<button @click="{addPostToUser(user.id)}">Add New Post</button>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</f-repeat>
|
|
105
|
+
</div>
|
|
106
|
+
</template>
|
|
107
|
+
</f-template>
|
|
108
|
+
<f-template name="observer-map-internal-test-element">
|
|
109
|
+
<template>
|
|
110
|
+
selected user: {{selecteduserid}} <!-- because this is bound to an attribute property it must be lowercase -->
|
|
111
|
+
<br>
|
|
112
|
+
total users: {{totalusers}}
|
|
113
|
+
<br>
|
|
114
|
+
<div class="stats">
|
|
115
|
+
<div class="nested-info">
|
|
116
|
+
<strong>Engagement:</strong>
|
|
117
|
+
Daily: {{metrics.engagement.daily}},
|
|
118
|
+
Weekly: {{metrics.engagement.weekly}},
|
|
119
|
+
Monthly: {{metrics.engagement.monthly}}
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
<f-when value="{{a}}">
|
|
123
|
+
<span class="nested-define">{{a.b.c}}</span>
|
|
124
|
+
</f-when>
|
|
125
|
+
<button @click="{defineB()}">Define B</button>
|
|
126
|
+
<button @click="{updateC()}">Update C</button>
|
|
127
|
+
<br>
|
|
128
|
+
<f-when value="{{x}}">
|
|
129
|
+
<span class="nested-define-2">{{x.y.z}}</span>
|
|
130
|
+
</f-when>
|
|
131
|
+
<button @click="{defineY()}">Define Y</button>
|
|
132
|
+
<button @click="{updateZ()}">Update Z</button>
|
|
133
|
+
<div>
|
|
134
|
+
<f-repeat value="{{group in groups}}">
|
|
135
|
+
<f-repeat value="{{item in group.items}}">
|
|
136
|
+
<div class="item">{{item.text}}</div>
|
|
137
|
+
<span>
|
|
138
|
+
<f-repeat value="{{action in item.actions.trailing}}">
|
|
139
|
+
<span class="action-label">{{action.label}}</span>
|
|
140
|
+
</f-repeat>
|
|
141
|
+
</span>
|
|
142
|
+
</f-repeat>
|
|
143
|
+
</f-repeat>
|
|
144
|
+
</div>
|
|
145
|
+
<button @click="{removeAllItems()}">Remove all items</button>
|
|
146
|
+
<button @click="{addAnItem()}">Add an item</button>
|
|
147
|
+
<button @click="{updateAnItem()}">Update an item</button>
|
|
148
|
+
<button @click="{removeGroup()}">Remove groups</button>
|
|
149
|
+
<button @click="{addGroup()}">Add group</button>
|
|
150
|
+
<button @click="{updateActionLabel()}">Update an action label</button>
|
|
151
|
+
</template>
|
|
152
|
+
</f-template>
|
|
153
|
+
<f-template name="observer-map-with-observables-test-element">
|
|
154
|
+
<template>
|
|
155
|
+
Level 3 Value: {{value1}}
|
|
156
|
+
<button @click="{updateValue1()}">Update Value1</button>
|
|
157
|
+
<br>
|
|
158
|
+
Level 3 Value Observable: {{value2}}
|
|
159
|
+
<button @click="{updateValue2()}">Update Value2</button>
|
|
160
|
+
</template>
|
|
161
|
+
</f-template>
|
|
162
|
+
<f-template name="observer-map-simple-array-test-element">
|
|
163
|
+
<template>
|
|
164
|
+
<ul>
|
|
165
|
+
<f-repeat value="{{item in items}}">
|
|
166
|
+
<li class="simple-item">{{item}}</li>
|
|
167
|
+
</f-repeat>
|
|
168
|
+
</ul>
|
|
169
|
+
<button @click="{updateFirstItem()}">Update First Item</button>
|
|
170
|
+
<button @click="{updateSecondItem()}">Update Second Item</button>
|
|
171
|
+
</template>
|
|
172
|
+
</f-template>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en-US">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title></title>
|
|
6
|
+
</head>
|
|
7
|
+
<body>
|
|
8
|
+
<config-observer-map-test-element
|
|
9
|
+
id="observer-test"
|
|
10
|
+
></config-observer-map-test-element>
|
|
11
|
+
<config-attribute-map-test-element
|
|
12
|
+
id="attribute-test"
|
|
13
|
+
></config-attribute-map-test-element>
|
|
14
|
+
<script type="module" src="./main.ts"></script>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en-US">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title></title>
|
|
6
|
+
</head>
|
|
7
|
+
<body>
|
|
8
|
+
<config-observer-map-test-element id="observer-test"><template shadowrootmode="open" shadowroot="open"><div class="message"><!--fe:b-->hello<!--fe:/b--></div>
|
|
9
|
+
<div class="nested-value"><!--fe:b-->42<!--fe:/b--></div></template></config-observer-map-test-element>
|
|
10
|
+
<config-attribute-map-test-element id="attribute-test"><template shadowrootmode="open" shadowroot="open"><span class="label-value"><!--fe:b--><!--fe:/b--></span>
|
|
11
|
+
<button type="button" data-fe="1">Set Label</button></template></config-attribute-map-test-element>
|
|
12
|
+
<f-template name="config-observer-map-test-element">
|
|
13
|
+
<template>
|
|
14
|
+
<div class="message">{{data.message}}</div>
|
|
15
|
+
<div class="nested-value">{{data.nested.value}}</div>
|
|
16
|
+
</template>
|
|
17
|
+
</f-template>
|
|
18
|
+
<f-template name="config-attribute-map-test-element">
|
|
19
|
+
<template>
|
|
20
|
+
<span class="label-value">{{label}}</span>
|
|
21
|
+
<button type="button" @click="{setLabel()}">Set Label</button>
|
|
22
|
+
</template>
|
|
23
|
+
</f-template>
|
|
24
|
+
|
|
25
|
+
<script type="module" src="./main.ts"></script>
|
|
26
|
+
</body>
|
|
27
|
+
</html>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { attributeMap } from "@microsoft/fast-element/attribute-map.js";
|
|
2
|
+
import { declarativeTemplate } from "@microsoft/fast-element/declarative.js";
|
|
3
|
+
import { FASTElement } from "@microsoft/fast-element/fast-element.js";
|
|
4
|
+
import { observerMap } from "@microsoft/fast-element/observer-map.js";
|
|
5
|
+
|
|
6
|
+
class ConfigObserverMapTestElement extends FASTElement {
|
|
7
|
+
public data: any = {
|
|
8
|
+
message: "hello",
|
|
9
|
+
nested: {
|
|
10
|
+
value: 42,
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
public updateMessage() {
|
|
15
|
+
this.data.message = "updated";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public updateNestedValue() {
|
|
19
|
+
this.data.nested.value = 99;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
ConfigObserverMapTestElement.define(
|
|
24
|
+
{
|
|
25
|
+
name: "config-observer-map-test-element",
|
|
26
|
+
template: declarativeTemplate(),
|
|
27
|
+
},
|
|
28
|
+
[
|
|
29
|
+
observerMap({
|
|
30
|
+
properties: {
|
|
31
|
+
data: true,
|
|
32
|
+
},
|
|
33
|
+
}),
|
|
34
|
+
],
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
class ConfigAttributeMapTestElement extends FASTElement {
|
|
38
|
+
public setLabel() {
|
|
39
|
+
(this as any).label = "new-label";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
ConfigAttributeMapTestElement.define(
|
|
44
|
+
{
|
|
45
|
+
name: "config-attribute-map-test-element",
|
|
46
|
+
template: declarativeTemplate(),
|
|
47
|
+
},
|
|
48
|
+
[
|
|
49
|
+
attributeMap({
|
|
50
|
+
"attribute-name-strategy": "none",
|
|
51
|
+
}),
|
|
52
|
+
],
|
|
53
|
+
);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<f-template name="config-observer-map-test-element">
|
|
2
|
+
<template>
|
|
3
|
+
<div class="message">{{data.message}}</div>
|
|
4
|
+
<div class="nested-value">{{data.nested.value}}</div>
|
|
5
|
+
</template>
|
|
6
|
+
</f-template>
|
|
7
|
+
<f-template name="config-attribute-map-test-element">
|
|
8
|
+
<template>
|
|
9
|
+
<span class="label-value">{{label}}</span>
|
|
10
|
+
<button type="button" @click="{setLabel()}">Set Label</button>
|
|
11
|
+
</template>
|
|
12
|
+
</f-template>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Deep Merge Test Fixture
|
|
2
|
+
|
|
3
|
+
A comprehensive test fixture for validating the `deepMerge` utility function with FAST's observable system.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This fixture combines multiple FAST features to thoroughly test `deepMerge` behavior:
|
|
8
|
+
|
|
9
|
+
- **Observable Arrays** - Tests array mutation tracking via splice operations
|
|
10
|
+
- **Nested Objects** - Deep property access with dot syntax (e.g., `user.profile.location.city`)
|
|
11
|
+
- **Conditional Rendering** - `f-when` directives with boolean expressions and comparisons
|
|
12
|
+
- **Nested Repeats** - Multiple levels: users → orders → items → tags
|
|
13
|
+
- **Observer Map** - Full observable tracking across all nested structures
|
|
14
|
+
|
|
15
|
+
## Data Structure
|
|
16
|
+
|
|
17
|
+
The fixture uses a realistic e-commerce data model:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
DeepMergeTestElement
|
|
21
|
+
├── users[] (observable array)
|
|
22
|
+
│ ├── User
|
|
23
|
+
│ │ ├── id, name, email
|
|
24
|
+
│ │ ├── profile
|
|
25
|
+
│ │ │ ├── age
|
|
26
|
+
│ │ │ ├── location { city, country }
|
|
27
|
+
│ │ │ └── preferences { theme, notifications }
|
|
28
|
+
│ │ └── orders[] (nested observable array)
|
|
29
|
+
│ │ └── Order
|
|
30
|
+
│ │ ├── id, date, total
|
|
31
|
+
│ │ └── items[] (deeply nested array)
|
|
32
|
+
│ │ └── Product
|
|
33
|
+
│ │ ├── id, name, price, inStock
|
|
34
|
+
│ │ ├── tags[] (4th level array)
|
|
35
|
+
│ │ └── metadata { views, rating }
|
|
36
|
+
├── showDetails (boolean for conditionals)
|
|
37
|
+
└── stats { totalOrders, totalRevenue, activeUsers }
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Test Scenarios
|
|
41
|
+
|
|
42
|
+
### 1. **Nested Object Updates** (`updateUserProfile`)
|
|
43
|
+
- Updates deeply nested properties
|
|
44
|
+
- Verifies partial merging (some properties unchanged)
|
|
45
|
+
- Tests: `profile.age`, `profile.location.city`, `profile.preferences.theme`
|
|
46
|
+
|
|
47
|
+
### 2. **Array Replacement** (`updateUserOrders`)
|
|
48
|
+
- Completely replaces an array with new data
|
|
49
|
+
- Tests observable array splice operations
|
|
50
|
+
- Verifies UI updates correctly
|
|
51
|
+
|
|
52
|
+
### 3. **Array Item Removal** (`removeOrderItems`)
|
|
53
|
+
- Reduces array length (2 items → 1 item)
|
|
54
|
+
- Tests that removed items disappear from UI
|
|
55
|
+
- Validates splice handles item deletion
|
|
56
|
+
|
|
57
|
+
### 4. **Nested Array Updates** (`updateProductTags`)
|
|
58
|
+
- Updates deeply nested arrays (tags within items within orders)
|
|
59
|
+
- Modifies multiple properties simultaneously
|
|
60
|
+
- Tests 4-level deep array structures
|
|
61
|
+
|
|
62
|
+
### 5. **Array Addition** (`addNewUser`)
|
|
63
|
+
- Adds new items to observable arrays
|
|
64
|
+
- Tests array expansion
|
|
65
|
+
- Verifies new items render correctly
|
|
66
|
+
|
|
67
|
+
### 6. **Conditional Rendering** (`toggleDetails`)
|
|
68
|
+
- Shows/hides content based on boolean flag
|
|
69
|
+
- Tests `f-when` integration
|
|
70
|
+
- Verifies conditional updates propagate
|
|
71
|
+
|
|
72
|
+
### 7. **Direct Property Mutation** (`incrementAge`)
|
|
73
|
+
- Updates properties without using deepMerge
|
|
74
|
+
- Provides baseline comparison
|
|
75
|
+
- Tests standard observable behavior
|
|
76
|
+
|
|
77
|
+
### 8. **Stats Object Update** (`updateStats`)
|
|
78
|
+
- Partial object updates
|
|
79
|
+
- Verifies unchanged properties remain untouched
|
|
80
|
+
- Tests shallow object merging
|
|
81
|
+
|
|
82
|
+
### 9. **Undefined Value Handling** (`testUndefinedMerge`)
|
|
83
|
+
- Validates undefined values are skipped
|
|
84
|
+
- Tests selective property updates
|
|
85
|
+
- Ensures undefined doesn't overwrite existing values
|
|
86
|
+
|
|
87
|
+
## Key Test Assertions
|
|
88
|
+
|
|
89
|
+
The spec file validates:
|
|
90
|
+
|
|
91
|
+
1. **Splice-based Updates** - Arrays maintain identity and use splice
|
|
92
|
+
2. **Partial Merges** - Only specified properties change
|
|
93
|
+
3. **Nested Updates** - Deep property paths update correctly
|
|
94
|
+
4. **Array Length Changes** - Items added/removed appropriately
|
|
95
|
+
5. **Conditional Re-evaluation** - UI responds to boolean changes
|
|
96
|
+
6. **Multiple Update Cycles** - Repeated operations work consistently
|
|
97
|
+
7. **Empty Array Handling** - Zero-length arrays render correctly
|
|
98
|
+
8. **Cross-cutting Updates** - Changes propagate through nested structures
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>Deep Merge Test Fixture</title>
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
9
|
+
max-width: 1200px;
|
|
10
|
+
margin: 0 auto;
|
|
11
|
+
padding: 20px;
|
|
12
|
+
background: #f5f5f5;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
h1 {
|
|
16
|
+
color: #333;
|
|
17
|
+
border-bottom: 2px solid #0078d4;
|
|
18
|
+
padding-bottom: 10px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
h2 {
|
|
22
|
+
color: #555;
|
|
23
|
+
margin-top: 30px;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.container {
|
|
27
|
+
background: white;
|
|
28
|
+
padding: 20px;
|
|
29
|
+
border-radius: 8px;
|
|
30
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.stats {
|
|
34
|
+
background: #e3f2fd;
|
|
35
|
+
padding: 15px;
|
|
36
|
+
border-radius: 6px;
|
|
37
|
+
margin: 20px 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.stats p {
|
|
41
|
+
margin: 8px 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.controls {
|
|
45
|
+
background: #f5f5f5;
|
|
46
|
+
padding: 15px;
|
|
47
|
+
border-radius: 6px;
|
|
48
|
+
margin: 20px 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
button {
|
|
52
|
+
background: #0078d4;
|
|
53
|
+
color: white;
|
|
54
|
+
border: none;
|
|
55
|
+
padding: 10px 16px;
|
|
56
|
+
border-radius: 4px;
|
|
57
|
+
cursor: pointer;
|
|
58
|
+
margin: 5px;
|
|
59
|
+
font-size: 14px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
button:hover {
|
|
63
|
+
background: #106ebe;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
button:active {
|
|
67
|
+
background: #005a9e;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.user-card {
|
|
71
|
+
border: 1px solid #ddd;
|
|
72
|
+
border-radius: 6px;
|
|
73
|
+
padding: 15px;
|
|
74
|
+
margin: 15px 0;
|
|
75
|
+
background: #fafafa;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.user-card h3 {
|
|
79
|
+
margin-top: 0;
|
|
80
|
+
color: #0078d4;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.profile {
|
|
84
|
+
background: white;
|
|
85
|
+
padding: 10px;
|
|
86
|
+
border-radius: 4px;
|
|
87
|
+
margin: 10px 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.profile h4 {
|
|
91
|
+
margin-top: 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.orders {
|
|
95
|
+
margin-top: 15px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.order {
|
|
99
|
+
background: white;
|
|
100
|
+
padding: 10px;
|
|
101
|
+
border-radius: 4px;
|
|
102
|
+
margin: 10px 0;
|
|
103
|
+
border-left: 3px solid #0078d4;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.items {
|
|
107
|
+
list-style: none;
|
|
108
|
+
padding: 0;
|
|
109
|
+
margin: 10px 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.item {
|
|
113
|
+
padding: 8px;
|
|
114
|
+
margin: 5px 0;
|
|
115
|
+
background: #f9f9f9;
|
|
116
|
+
border-radius: 4px;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.stock {
|
|
120
|
+
margin-left: 10px;
|
|
121
|
+
font-size: 12px;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.tags {
|
|
125
|
+
margin-top: 5px;
|
|
126
|
+
font-size: 12px;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.tag {
|
|
130
|
+
background: #0078d4;
|
|
131
|
+
color: white;
|
|
132
|
+
padding: 2px 8px;
|
|
133
|
+
border-radius: 3px;
|
|
134
|
+
margin-right: 5px;
|
|
135
|
+
display: inline-block;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.metadata {
|
|
139
|
+
margin-top: 5px;
|
|
140
|
+
color: #666;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
strong {
|
|
144
|
+
color: #333;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
em {
|
|
148
|
+
color: #999;
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
151
|
+
</head>
|
|
152
|
+
<body>
|
|
153
|
+
<deep-merge-test-element></deep-merge-test-element>
|
|
154
|
+
<script type="module" src="./main.ts"></script>
|
|
155
|
+
</body>
|
|
156
|
+
</html>
|