element-vir 26.11.2 → 26.12.0

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 (188) hide show
  1. package/package.json +12 -12
  2. package/src/declarative-element/declarative-element-init.ts +115 -0
  3. package/src/declarative-element/declarative-element.ts +372 -0
  4. package/src/declarative-element/define-element.ts +515 -0
  5. package/{dist/declarative-element/definition-options.d.ts → src/declarative-element/definition-options.ts} +7 -2
  6. package/src/declarative-element/directives/assign.directive.ts +89 -0
  7. package/{dist/declarative-element/directives/async-prop.js → src/declarative-element/directives/async-prop.ts} +42 -8
  8. package/src/declarative-element/directives/attributes.directive.ts +63 -0
  9. package/src/declarative-element/directives/create-attribute-directive.ts +47 -0
  10. package/src/declarative-element/directives/directive-helpers.ts +67 -0
  11. package/{dist/declarative-element/directives/listen-to-activate.js → src/declarative-element/directives/listen-to-activate.ts} +8 -3
  12. package/src/declarative-element/directives/listen.directive.ts +206 -0
  13. package/src/declarative-element/directives/mutate.directive.ts +78 -0
  14. package/src/declarative-element/directives/on-dom-created.directive.ts +68 -0
  15. package/src/declarative-element/directives/on-dom-rendered.directive.ts +61 -0
  16. package/src/declarative-element/directives/on-intersect.directive.ts +139 -0
  17. package/src/declarative-element/directives/on-resize.directive.ts +142 -0
  18. package/src/declarative-element/directives/render-async.directive.ts +111 -0
  19. package/{dist/declarative-element/directives/render-if.directive.js → src/declarative-element/directives/render-if.directive.ts} +12 -3
  20. package/{dist/declarative-element/directives/test-id.directive.js → src/declarative-element/directives/test-id.directive.ts} +7 -2
  21. package/{dist/declarative-element/has-declarative-element-parent.js → src/declarative-element/has-declarative-element-parent.ts} +7 -4
  22. package/{dist/declarative-element/is-declarative-element-definition.js → src/declarative-element/is-declarative-element-definition.ts} +28 -11
  23. package/{dist/declarative-element/is-declarative-element.js → src/declarative-element/is-declarative-element.ts} +11 -5
  24. package/src/declarative-element/properties/assign-inputs.ts +30 -0
  25. package/src/declarative-element/properties/css-vars.ts +24 -0
  26. package/src/declarative-element/properties/element-events.ts +161 -0
  27. package/src/declarative-element/properties/host-classes.ts +63 -0
  28. package/{dist/declarative-element/properties/property-proxy.js → src/declarative-element/properties/property-proxy.ts} +58 -21
  29. package/src/declarative-element/properties/string-names.ts +83 -0
  30. package/src/declarative-element/properties/styles.ts +112 -0
  31. package/src/declarative-element/render-callback.ts +196 -0
  32. package/src/declarative-element/wrap-define-element.ts +127 -0
  33. package/{dist/index.d.ts → src/index.ts} +2 -0
  34. package/{dist/lit-exports/base-lit-exports.js → src/lit-exports/base-lit-exports.ts} +10 -1
  35. package/{dist/lit-exports/lit-repeat-fix.d.ts → src/lit-exports/lit-repeat-fix.ts} +45 -16
  36. package/{dist/readme-examples/my-app.element.js → src/readme-examples/my-app.element.ts} +5 -4
  37. package/src/readme-examples/my-custom-action.event.ts +3 -0
  38. package/{dist/readme-examples/my-custom-define.js → src/readme-examples/my-custom-define.ts} +9 -4
  39. package/{dist/readme-examples/my-simple.element.js → src/readme-examples/my-simple.element.ts} +4 -3
  40. package/src/readme-examples/my-with-assignment.element.ts +16 -0
  41. package/{dist/readme-examples/my-with-async-prop.element.js → src/readme-examples/my-with-async-prop.element.ts} +24 -16
  42. package/{dist/readme-examples/my-with-cleanup-callback.element.js → src/readme-examples/my-with-cleanup-callback.element.ts} +5 -4
  43. package/{dist/readme-examples/my-with-css-vars.element.js → src/readme-examples/my-with-css-vars.element.ts} +5 -4
  44. package/src/readme-examples/my-with-custom-events.element.ts +23 -0
  45. package/{dist/readme-examples/my-with-event-listening.element.js → src/readme-examples/my-with-event-listening.element.ts} +10 -9
  46. package/src/readme-examples/my-with-events.element.ts +23 -0
  47. package/{dist/readme-examples/my-with-host-class-definition.element.js → src/readme-examples/my-with-host-class-definition.element.ts} +7 -6
  48. package/{dist/readme-examples/my-with-host-class-usage.element.js → src/readme-examples/my-with-host-class-usage.element.ts} +5 -4
  49. package/src/readme-examples/my-with-inputs.element.ts +13 -0
  50. package/{dist/readme-examples/my-with-on-dom-created.element.js → src/readme-examples/my-with-on-dom-created.element.ts} +7 -6
  51. package/src/readme-examples/my-with-on-resize.element.ts +19 -0
  52. package/src/readme-examples/my-with-render-if.element.ts +15 -0
  53. package/{dist/readme-examples/my-with-styles-and-interpolated-selector.element.js → src/readme-examples/my-with-styles-and-interpolated-selector.element.ts} +6 -5
  54. package/{dist/readme-examples/my-with-styles.element.js → src/readme-examples/my-with-styles.element.ts} +5 -4
  55. package/{dist/readme-examples/my-with-update-state.element.js → src/readme-examples/my-with-update-state.element.ts} +8 -7
  56. package/src/readme-examples/require-declarative-element.ts +3 -0
  57. package/{dist/require-declarative-element.js → src/require-declarative-element.ts} +1 -0
  58. package/{dist/template-transforms/minimal-element-definition.d.ts → src/template-transforms/minimal-element-definition.ts} +19 -7
  59. package/src/template-transforms/nested-mapped-templates.ts +157 -0
  60. package/{dist/template-transforms/template-transform-type.d.ts → src/template-transforms/template-transform-type.ts} +3 -1
  61. package/{dist/template-transforms/transform-template.js → src/template-transforms/transform-template.ts} +70 -22
  62. package/src/template-transforms/vir-css/css-transform.ts +30 -0
  63. package/src/template-transforms/vir-css/vir-css.ts +30 -0
  64. package/src/template-transforms/vir-html/html-interpolation.ts +103 -0
  65. package/src/template-transforms/vir-html/html-transform.ts +149 -0
  66. package/{dist/template-transforms/vir-html/tag-name-keys.js → src/template-transforms/vir-html/tag-name-keys.ts} +1 -1
  67. package/{dist/template-transforms/vir-html/vir-html.js → src/template-transforms/vir-html/vir-html.ts} +13 -5
  68. package/src/typed-event/typed-event.ts +90 -0
  69. package/{dist/util/array.js → src/util/array.ts} +18 -5
  70. package/{dist/util/increment.d.ts → src/util/increment.ts} +24 -5
  71. package/{dist/util/lit-template.js → src/util/lit-template.ts} +30 -10
  72. package/src/util/map-async-value.ts +33 -0
  73. package/dist/declarative-element/custom-tag-name.js +0 -1
  74. package/dist/declarative-element/declarative-element-init.d.ts +0 -56
  75. package/dist/declarative-element/declarative-element-init.js +0 -1
  76. package/dist/declarative-element/declarative-element.d.ts +0 -114
  77. package/dist/declarative-element/declarative-element.js +0 -36
  78. package/dist/declarative-element/define-element.d.ts +0 -41
  79. package/dist/declarative-element/define-element.js +0 -248
  80. package/dist/declarative-element/definition-options.js +0 -9
  81. package/dist/declarative-element/directives/assign.directive.d.ts +0 -24
  82. package/dist/declarative-element/directives/assign.directive.js +0 -34
  83. package/dist/declarative-element/directives/async-prop.d.ts +0 -61
  84. package/dist/declarative-element/directives/attributes.directive.d.ts +0 -30
  85. package/dist/declarative-element/directives/attributes.directive.js +0 -35
  86. package/dist/declarative-element/directives/create-attribute-directive.d.ts +0 -28
  87. package/dist/declarative-element/directives/create-attribute-directive.js +0 -41
  88. package/dist/declarative-element/directives/directive-helpers.d.ts +0 -27
  89. package/dist/declarative-element/directives/directive-helpers.js +0 -37
  90. package/dist/declarative-element/directives/listen-to-activate.d.ts +0 -15
  91. package/dist/declarative-element/directives/listen.directive.d.ts +0 -92
  92. package/dist/declarative-element/directives/listen.directive.js +0 -48
  93. package/dist/declarative-element/directives/mutate.directive.d.ts +0 -38
  94. package/dist/declarative-element/directives/mutate.directive.js +0 -45
  95. package/dist/declarative-element/directives/on-dom-created.directive.d.ts +0 -44
  96. package/dist/declarative-element/directives/on-dom-created.directive.js +0 -51
  97. package/dist/declarative-element/directives/on-dom-rendered.directive.d.ts +0 -41
  98. package/dist/declarative-element/directives/on-dom-rendered.directive.js +0 -45
  99. package/dist/declarative-element/directives/on-intersect.directive.d.ts +0 -64
  100. package/dist/declarative-element/directives/on-intersect.directive.js +0 -89
  101. package/dist/declarative-element/directives/on-resize.directive.d.ts +0 -74
  102. package/dist/declarative-element/directives/on-resize.directive.js +0 -106
  103. package/dist/declarative-element/directives/render-async.directive.d.ts +0 -45
  104. package/dist/declarative-element/directives/render-async.directive.js +0 -33
  105. package/dist/declarative-element/directives/render-if.directive.d.ts +0 -32
  106. package/dist/declarative-element/directives/test-id.directive.d.ts +0 -52
  107. package/dist/declarative-element/has-declarative-element-parent.d.ts +0 -1
  108. package/dist/declarative-element/is-declarative-element-definition.d.ts +0 -17
  109. package/dist/declarative-element/is-declarative-element.d.ts +0 -15
  110. package/dist/declarative-element/properties/assign-inputs.d.ts +0 -1
  111. package/dist/declarative-element/properties/assign-inputs.js +0 -25
  112. package/dist/declarative-element/properties/css-vars.d.ts +0 -16
  113. package/dist/declarative-element/properties/css-vars.js +0 -1
  114. package/dist/declarative-element/properties/element-events.d.ts +0 -65
  115. package/dist/declarative-element/properties/element-events.js +0 -62
  116. package/dist/declarative-element/properties/element-properties.js +0 -1
  117. package/dist/declarative-element/properties/host-classes.d.ts +0 -36
  118. package/dist/declarative-element/properties/host-classes.js +0 -16
  119. package/dist/declarative-element/properties/property-proxy.d.ts +0 -22
  120. package/dist/declarative-element/properties/string-names.d.ts +0 -28
  121. package/dist/declarative-element/properties/string-names.js +0 -40
  122. package/dist/declarative-element/properties/styles.d.ts +0 -51
  123. package/dist/declarative-element/properties/styles.js +0 -41
  124. package/dist/declarative-element/properties/tag-name.js +0 -1
  125. package/dist/declarative-element/render-callback.d.ts +0 -56
  126. package/dist/declarative-element/render-callback.js +0 -27
  127. package/dist/declarative-element/wrap-define-element.d.ts +0 -36
  128. package/dist/declarative-element/wrap-define-element.js +0 -25
  129. package/dist/index.js +0 -42
  130. package/dist/lit-exports/all-lit-exports.js +0 -2
  131. package/dist/lit-exports/base-lit-exports.d.ts +0 -25
  132. package/dist/lit-exports/lit-repeat-fix.js +0 -37
  133. package/dist/readme-examples/my-app.element.d.ts +0 -1
  134. package/dist/readme-examples/my-custom-action.event.d.ts +0 -1
  135. package/dist/readme-examples/my-custom-action.event.js +0 -2
  136. package/dist/readme-examples/my-custom-define.d.ts +0 -4
  137. package/dist/readme-examples/my-simple.element.d.ts +0 -1
  138. package/dist/readme-examples/my-with-assignment.element.d.ts +0 -1
  139. package/dist/readme-examples/my-with-assignment.element.js +0 -15
  140. package/dist/readme-examples/my-with-async-prop.element.d.ts +0 -10
  141. package/dist/readme-examples/my-with-cleanup-callback.element.d.ts +0 -3
  142. package/dist/readme-examples/my-with-css-vars.element.d.ts +0 -1
  143. package/dist/readme-examples/my-with-custom-events.element.d.ts +0 -1
  144. package/dist/readme-examples/my-with-custom-events.element.js +0 -22
  145. package/dist/readme-examples/my-with-event-listening.element.d.ts +0 -3
  146. package/dist/readme-examples/my-with-events.element.d.ts +0 -4
  147. package/dist/readme-examples/my-with-events.element.js +0 -20
  148. package/dist/readme-examples/my-with-host-class-definition.element.d.ts +0 -3
  149. package/dist/readme-examples/my-with-host-class-usage.element.d.ts +0 -1
  150. package/dist/readme-examples/my-with-inputs.element.d.ts +0 -4
  151. package/dist/readme-examples/my-with-inputs.element.js +0 -9
  152. package/dist/readme-examples/my-with-on-dom-created.element.d.ts +0 -1
  153. package/dist/readme-examples/my-with-on-resize.element.d.ts +0 -1
  154. package/dist/readme-examples/my-with-on-resize.element.js +0 -18
  155. package/dist/readme-examples/my-with-render-if.element.d.ts +0 -3
  156. package/dist/readme-examples/my-with-render-if.element.js +0 -11
  157. package/dist/readme-examples/my-with-styles-and-interpolated-selector.element.d.ts +0 -1
  158. package/dist/readme-examples/my-with-styles.element.d.ts +0 -1
  159. package/dist/readme-examples/my-with-update-state.element.d.ts +0 -8
  160. package/dist/readme-examples/require-declarative-element.d.ts +0 -1
  161. package/dist/readme-examples/require-declarative-element.js +0 -2
  162. package/dist/require-declarative-element.d.ts +0 -14
  163. package/dist/template-transforms/minimal-element-definition.js +0 -19
  164. package/dist/template-transforms/nested-mapped-templates.d.ts +0 -6
  165. package/dist/template-transforms/nested-mapped-templates.js +0 -96
  166. package/dist/template-transforms/template-transform-type.js +0 -1
  167. package/dist/template-transforms/transform-template.d.ts +0 -14
  168. package/dist/template-transforms/vir-css/css-transform.d.ts +0 -4
  169. package/dist/template-transforms/vir-css/css-transform.js +0 -15
  170. package/dist/template-transforms/vir-css/vir-css.d.ts +0 -12
  171. package/dist/template-transforms/vir-css/vir-css.js +0 -21
  172. package/dist/template-transforms/vir-html/html-interpolation.d.ts +0 -42
  173. package/dist/template-transforms/vir-html/html-interpolation.js +0 -1
  174. package/dist/template-transforms/vir-html/html-transform.d.ts +0 -5
  175. package/dist/template-transforms/vir-html/html-transform.js +0 -96
  176. package/dist/template-transforms/vir-html/tag-name-keys.d.ts +0 -7
  177. package/dist/template-transforms/vir-html/vir-html.d.ts +0 -11
  178. package/dist/typed-event/typed-event.d.ts +0 -55
  179. package/dist/typed-event/typed-event.js +0 -50
  180. package/dist/util/array.d.ts +0 -5
  181. package/dist/util/increment.js +0 -1
  182. package/dist/util/lit-template.d.ts +0 -9
  183. package/dist/util/type.js +0 -1
  184. /package/{dist/declarative-element/custom-tag-name.d.ts → src/declarative-element/custom-tag-name.ts} +0 -0
  185. /package/{dist/declarative-element/properties/element-properties.d.ts → src/declarative-element/properties/element-properties.ts} +0 -0
  186. /package/{dist/declarative-element/properties/tag-name.d.ts → src/declarative-element/properties/tag-name.ts} +0 -0
  187. /package/{dist/lit-exports/all-lit-exports.d.ts → src/lit-exports/all-lit-exports.ts} +0 -0
  188. /package/{dist/util/type.d.ts → src/util/type.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "element-vir",
3
- "version": "26.11.2",
3
+ "version": "26.12.0",
4
4
  "keywords": [
5
5
  "custom",
6
6
  "web",
@@ -27,9 +27,9 @@
27
27
  },
28
28
  "sideEffects": false,
29
29
  "type": "module",
30
- "main": "dist/index.js",
31
- "module": "dist/index.js",
32
- "types": "dist/index.d.ts",
30
+ "main": "src/index.ts",
31
+ "module": "src/index.ts",
32
+ "types": "src/index.ts",
33
33
  "scripts": {
34
34
  "build": "npm run docs",
35
35
  "compile": "virmator compile",
@@ -39,19 +39,19 @@
39
39
  "test:docs": "virmator docs check"
40
40
  },
41
41
  "dependencies": {
42
- "@augment-vir/assert": "^31.50.4",
43
- "@augment-vir/common": "^31.50.4",
42
+ "@augment-vir/assert": "^31.54.3",
43
+ "@augment-vir/common": "^31.54.3",
44
44
  "date-vir": "^8.0.0",
45
45
  "lit": "^3.3.1",
46
46
  "lit-css-vars": "^3.0.11",
47
47
  "lit-html": "^3.3.1",
48
- "object-shape-tester": "^6.9.3",
48
+ "object-shape-tester": "^6.10.0",
49
49
  "observavir": "^2.2.0",
50
50
  "typed-event-target": "^4.1.0"
51
51
  },
52
52
  "devDependencies": {
53
- "@augment-vir/test": "^31.50.4",
54
- "@augment-vir/web": "^31.50.4",
53
+ "@augment-vir/test": "^31.54.3",
54
+ "@augment-vir/web": "^31.54.3",
55
55
  "@web/dev-server-esbuild": "^1.0.4",
56
56
  "@web/test-runner": "^0.20.2",
57
57
  "@web/test-runner-commands": "^0.9.0",
@@ -60,10 +60,10 @@
60
60
  "html-spec-tags": "^2.2.3",
61
61
  "istanbul-smart-text-reporter": "^1.1.5",
62
62
  "markdown-code-example-inserter": "^3.0.3",
63
- "type-fest": "^5.2.0",
64
- "typedoc": "^0.28.14",
63
+ "type-fest": "^5.3.1",
64
+ "typedoc": "^0.28.15",
65
65
  "typescript": "5.9.3",
66
- "vite": "^7.2.2",
66
+ "vite": "^7.2.7",
67
67
  "vite-tsconfig-paths": "^5.1.4"
68
68
  },
69
69
  "engines": {
@@ -0,0 +1,115 @@
1
+ import {type CSSResult} from '../lit-exports/base-lit-exports.js';
2
+ import {type CustomElementTagName} from './custom-tag-name.js';
3
+ import {type DeclarativeElementDefinitionOptions} from './definition-options.js';
4
+ import {type CssVarsInitMap} from './properties/css-vars.js';
5
+ import {type EventsInitMap} from './properties/element-events.js';
6
+ import {type PropertyInitMapBase} from './properties/element-properties.js';
7
+ import {type HostClassesInitMap} from './properties/host-classes.js';
8
+ import {type BaseStringName} from './properties/string-names.js';
9
+ import {type StylesCallback} from './properties/styles.js';
10
+ import {type InitCallback, type RenderCallback, type RenderParams} from './render-callback.js';
11
+
12
+ /**
13
+ * Initialization for an element-vir declarative element. This defines all the pieces required for
14
+ * rendering the element.
15
+ *
16
+ * @category Internal
17
+ */
18
+ export type DeclarativeElementInit<
19
+ TagName extends CustomElementTagName,
20
+ Inputs extends PropertyInitMapBase,
21
+ State extends PropertyInitMapBase,
22
+ EventsInit extends EventsInitMap,
23
+ HostClassKeys extends BaseStringName<TagName>,
24
+ CssVarKeys extends BaseStringName<TagName>,
25
+ SlotNames extends ReadonlyArray<string>,
26
+ TestIds extends ReadonlyArray<string>,
27
+ > = {
28
+ /**
29
+ * HTML tag name. This should not be used directly, as interpolating it with the html tagged
30
+ * template from this package is preferred.
31
+ */
32
+ tagName: TagName;
33
+ /** Static styles. These should not and cannot change. */
34
+ styles?: CSSResult | StylesCallback<TagName, HostClassKeys, CssVarKeys> | undefined;
35
+ /** Events that the element can dispatch. (These can be thought of as "outputs".) */
36
+ events?: EventsInit | undefined;
37
+ slotNames?: SlotNames | undefined;
38
+ testIds?: TestIds | undefined;
39
+ /**
40
+ * HTML host classes. Values can be callbacks to determine when a host class should be defined,
41
+ * based on current instance state or inputs, or just false to indicate that the host class will
42
+ * only be manually set.
43
+ */
44
+ hostClasses?: HostClassesInitMap<TagName, HostClassKeys, Inputs, State> | undefined;
45
+ /**
46
+ * CSS Vars for the component. Keys of this object should be kebab-case and start with the
47
+ * element's tag name.
48
+ *
49
+ * Values of this object represent the default fallback value for the given CSS var. These are
50
+ * then passed to the styles property, which must be a callback to take advantage of these.
51
+ */
52
+ cssVars?: CssVarsInitMap<TagName, CssVarKeys>;
53
+ /**
54
+ * Make sure to define this at the top of your element init object or TypeScript will fail to
55
+ * infer the element's state type.
56
+ *
57
+ * Setup the element's initial state. This is only called once per element instance, before the
58
+ * first render. The return type of this method becomes the element's state type.
59
+ */
60
+ state?: (
61
+ params: Omit<
62
+ RenderParams<
63
+ TagName,
64
+ Inputs,
65
+ any,
66
+ EventsInit,
67
+ HostClassKeys,
68
+ CssVarKeys,
69
+ SlotNames,
70
+ TestIds
71
+ >,
72
+ 'state' | 'updateState'
73
+ >,
74
+ ) => Extract<keyof State, keyof HTMLElement> extends never
75
+ ? Extract<keyof State, keyof Inputs> extends never
76
+ ? State
77
+ : `ERROR: Cannot define an element state property that clashes with input properties: ${Extract<keyof State, keyof Inputs> extends string | number | bigint | boolean | null | undefined ? Extract<keyof State, keyof Inputs> : ''}`
78
+ : `ERROR: Cannot define an element state property that clashes with native HTMLElement properties: ${Extract<keyof State, keyof HTMLElement>}`;
79
+ /** Called as part of the first render call, before the first render call. */
80
+ init?:
81
+ | InitCallback<
82
+ TagName,
83
+ Inputs,
84
+ State,
85
+ EventsInit,
86
+ HostClassKeys,
87
+ CssVarKeys,
88
+ SlotNames,
89
+ TestIds
90
+ >
91
+ | undefined;
92
+ render: RenderCallback<
93
+ TagName,
94
+ Inputs,
95
+ State,
96
+ EventsInit,
97
+ HostClassKeys,
98
+ CssVarKeys,
99
+ SlotNames,
100
+ TestIds
101
+ >;
102
+ cleanup?:
103
+ | InitCallback<
104
+ TagName,
105
+ Inputs,
106
+ State,
107
+ EventsInit,
108
+ HostClassKeys,
109
+ CssVarKeys,
110
+ SlotNames,
111
+ TestIds
112
+ >
113
+ | undefined;
114
+ options?: Partial<DeclarativeElementDefinitionOptions> | undefined;
115
+ };
@@ -0,0 +1,372 @@
1
+ import {type SetRequiredAndNotNull} from '@augment-vir/common';
2
+ import {type EmptyObject, type IsAny, type IsEmptyObject} from 'type-fest';
3
+ import {LitElement, type CSSResult} from '../lit-exports/base-lit-exports.js';
4
+ import {type MinimalDefinitionWithInputs} from '../template-transforms/minimal-element-definition.js';
5
+ import {type CustomElementTagName} from './custom-tag-name.js';
6
+ import {type DeclarativeElementInit} from './declarative-element-init.js';
7
+ import {type DeclarativeElementDefinitionOptions} from './definition-options.js';
8
+ import {type CssVars} from './properties/css-vars.js';
9
+ import {type EventDescriptorMap, type EventsInitMap} from './properties/element-events.js';
10
+ import {type PropertyInitMapBase} from './properties/element-properties.js';
11
+ import {type HostClassNamesMap} from './properties/host-classes.js';
12
+ import {type ObservableListenerMap} from './properties/property-proxy.js';
13
+ import {type BaseStringName, type StringNameMap} from './properties/string-names.js';
14
+ import {
15
+ type RenderCallback,
16
+ type RenderParams,
17
+ type UpdateStateCallback,
18
+ } from './render-callback.js';
19
+
20
+ /**
21
+ * The `host` type for a declarative element. This references a declarative element instance's
22
+ * top-level HTML element and always contains a shadow root (wherein the element is rendered).
23
+ *
24
+ * @category Internal
25
+ */
26
+ export type DeclarativeElementHost<
27
+ TagName extends CustomElementTagName = any,
28
+ Inputs extends PropertyInitMapBase = any,
29
+ State extends PropertyInitMapBase = any,
30
+ EventsInit extends EventsInitMap = any,
31
+ HostClassKeys extends BaseStringName<TagName> = any,
32
+ CssVarKeys extends BaseStringName<TagName> = any,
33
+ SlotNames extends ReadonlyArray<string> = any,
34
+ TestIds extends ReadonlyArray<string> = any,
35
+ > = SetRequiredAndNotNull<
36
+ Omit<
37
+ DeclarativeElement<
38
+ TagName,
39
+ Inputs,
40
+ State,
41
+ EventsInit,
42
+ HostClassKeys,
43
+ CssVarKeys,
44
+ SlotNames,
45
+ TestIds
46
+ >,
47
+ Exclude<
48
+ keyof StaticDeclarativeElementProperties<any, any, any, any, any, any, any, any>,
49
+ keyof HTMLElement
50
+ >
51
+ >,
52
+ 'shadowRoot'
53
+ >;
54
+
55
+ /**
56
+ * The full definition for a declarative element.
57
+ *
58
+ * @category Internal
59
+ */
60
+ export type DeclarativeElementDefinition<
61
+ TagName extends CustomElementTagName = any,
62
+ Inputs extends PropertyInitMapBase = any,
63
+ State extends PropertyInitMapBase = any,
64
+ EventsInit extends EventsInitMap = any,
65
+ HostClassKeys extends BaseStringName<TagName> = any,
66
+ CssVarKeys extends BaseStringName<TagName> = any,
67
+ SlotNames extends ReadonlyArray<string> = any,
68
+ TestIds extends ReadonlyArray<string> = any,
69
+ > = (new () => DeclarativeElementHost<
70
+ TagName,
71
+ Inputs,
72
+ State,
73
+ EventsInit,
74
+ HostClassKeys,
75
+ CssVarKeys,
76
+ SlotNames,
77
+ TestIds
78
+ >) &
79
+ StaticDeclarativeElementProperties<
80
+ TagName,
81
+ Inputs,
82
+ State,
83
+ EventsInit,
84
+ HostClassKeys,
85
+ CssVarKeys,
86
+ SlotNames,
87
+ TestIds
88
+ > & {
89
+ InstanceType: DeclarativeElementHost<
90
+ TagName,
91
+ Inputs,
92
+ State,
93
+ EventsInit,
94
+ HostClassKeys,
95
+ CssVarKeys,
96
+ SlotNames,
97
+ TestIds
98
+ >;
99
+ };
100
+
101
+ /**
102
+ * Abstract class base for all declarative elements.
103
+ *
104
+ * @category Internal
105
+ */
106
+ export abstract class DeclarativeElement<
107
+ TagName extends CustomElementTagName = any,
108
+ Inputs extends PropertyInitMapBase = any,
109
+ State extends PropertyInitMapBase = any,
110
+ EventsInit extends EventsInitMap = any,
111
+ HostClassKeys extends BaseStringName<TagName> = any,
112
+ CssVarKeys extends BaseStringName<TagName> = any,
113
+ SlotNames extends ReadonlyArray<string> = any,
114
+ TestIds extends ReadonlyArray<string> = any,
115
+ > extends LitElement {
116
+ /**
117
+ * Assign inputs to an element instantiation. Use only on the opening tag.
118
+ *
119
+ * @example
120
+ *
121
+ * ```ts
122
+ * import {html} from 'element-vir';
123
+ *
124
+ * const myTemplate = html`
125
+ * <${MyElement.assign({input1: 'a', input2: 'b'})}></${MyElement}>
126
+ * `;
127
+ * ```
128
+ */
129
+ public static readonly assign: StaticDeclarativeElementProperties<
130
+ CustomElementTagName,
131
+ PropertyInitMapBase,
132
+ PropertyInitMapBase,
133
+ EventsInitMap,
134
+ BaseStringName<CustomElementTagName>,
135
+ BaseStringName<CustomElementTagName>,
136
+ ReadonlyArray<string>,
137
+ ReadonlyArray<string>
138
+ >['assign'];
139
+ public static readonly assignedInputs: PropertyInitMapBase | undefined;
140
+ public static readonly tagName: StaticDeclarativeElementProperties<
141
+ CustomElementTagName,
142
+ PropertyInitMapBase,
143
+ PropertyInitMapBase,
144
+ EventsInitMap,
145
+ BaseStringName<CustomElementTagName>,
146
+ BaseStringName<CustomElementTagName>,
147
+ ReadonlyArray<string>,
148
+ ReadonlyArray<string>
149
+ >['tagName'];
150
+ public static override readonly styles: StaticDeclarativeElementProperties<
151
+ CustomElementTagName,
152
+ PropertyInitMapBase,
153
+ PropertyInitMapBase,
154
+ EventsInitMap,
155
+ BaseStringName<CustomElementTagName>,
156
+ BaseStringName<CustomElementTagName>,
157
+ ReadonlyArray<string>,
158
+ ReadonlyArray<string>
159
+ >['styles'];
160
+ public static readonly render: StaticDeclarativeElementProperties<
161
+ CustomElementTagName,
162
+ PropertyInitMapBase,
163
+ PropertyInitMapBase,
164
+ EventsInitMap,
165
+ BaseStringName<CustomElementTagName>,
166
+ BaseStringName<CustomElementTagName>,
167
+ ReadonlyArray<string>,
168
+ ReadonlyArray<string>
169
+ >['render'];
170
+ public static readonly InputsType: StaticDeclarativeElementProperties<
171
+ CustomElementTagName,
172
+ PropertyInitMapBase,
173
+ PropertyInitMapBase,
174
+ EventsInitMap,
175
+ BaseStringName<CustomElementTagName>,
176
+ BaseStringName<CustomElementTagName>,
177
+ ReadonlyArray<string>,
178
+ ReadonlyArray<string>
179
+ >['InputsType'];
180
+ public static readonly StateType: StaticDeclarativeElementProperties<
181
+ CustomElementTagName,
182
+ PropertyInitMapBase,
183
+ PropertyInitMapBase,
184
+ EventsInitMap,
185
+ BaseStringName<CustomElementTagName>,
186
+ BaseStringName<CustomElementTagName>,
187
+ ReadonlyArray<string>,
188
+ ReadonlyArray<string>
189
+ >['StateType'];
190
+ public static readonly UpdateStateType: StaticDeclarativeElementProperties<
191
+ CustomElementTagName,
192
+ PropertyInitMapBase,
193
+ PropertyInitMapBase,
194
+ EventsInitMap,
195
+ BaseStringName<CustomElementTagName>,
196
+ BaseStringName<CustomElementTagName>,
197
+ ReadonlyArray<string>,
198
+ ReadonlyArray<string>
199
+ >['UpdateStateType'];
200
+ public static readonly events: StaticDeclarativeElementProperties<
201
+ CustomElementTagName,
202
+ PropertyInitMapBase,
203
+ PropertyInitMapBase,
204
+ EventsInitMap,
205
+ BaseStringName<CustomElementTagName>,
206
+ BaseStringName<CustomElementTagName>,
207
+ ReadonlyArray<string>,
208
+ ReadonlyArray<string>
209
+ >['events'];
210
+ public static readonly init: StaticDeclarativeElementProperties<
211
+ CustomElementTagName,
212
+ PropertyInitMapBase,
213
+ PropertyInitMapBase,
214
+ EventsInitMap,
215
+ BaseStringName<CustomElementTagName>,
216
+ BaseStringName<CustomElementTagName>,
217
+ ReadonlyArray<string>,
218
+ ReadonlyArray<string>
219
+ >['init'];
220
+ public static readonly elementOptions: StaticDeclarativeElementProperties<
221
+ CustomElementTagName,
222
+ PropertyInitMapBase,
223
+ PropertyInitMapBase,
224
+ EventsInitMap,
225
+ BaseStringName<CustomElementTagName>,
226
+ BaseStringName<CustomElementTagName>,
227
+ ReadonlyArray<string>,
228
+ ReadonlyArray<string>
229
+ >['elementOptions'];
230
+ public static readonly hostClasses: StaticDeclarativeElementProperties<
231
+ CustomElementTagName,
232
+ PropertyInitMapBase,
233
+ PropertyInitMapBase,
234
+ EventsInitMap,
235
+ BaseStringName<CustomElementTagName>,
236
+ BaseStringName<CustomElementTagName>,
237
+ ReadonlyArray<string>,
238
+ ReadonlyArray<string>
239
+ >['hostClasses'];
240
+ public static readonly cssVars: StaticDeclarativeElementProperties<
241
+ CustomElementTagName,
242
+ PropertyInitMapBase,
243
+ PropertyInitMapBase,
244
+ EventsInitMap,
245
+ BaseStringName<CustomElementTagName>,
246
+ BaseStringName<CustomElementTagName>,
247
+ ReadonlyArray<string>,
248
+ ReadonlyArray<string>
249
+ >['cssVars'];
250
+ public static readonly slotNames: StaticDeclarativeElementProperties<
251
+ CustomElementTagName,
252
+ PropertyInitMapBase,
253
+ PropertyInitMapBase,
254
+ EventsInitMap,
255
+ BaseStringName<CustomElementTagName>,
256
+ BaseStringName<CustomElementTagName>,
257
+ ReadonlyArray<string>,
258
+ ReadonlyArray<string>
259
+ >['slotNames'];
260
+ public static readonly testIds: StaticDeclarativeElementProperties<
261
+ CustomElementTagName,
262
+ PropertyInitMapBase,
263
+ PropertyInitMapBase,
264
+ EventsInitMap,
265
+ BaseStringName<CustomElementTagName>,
266
+ BaseStringName<CustomElementTagName>,
267
+ ReadonlyArray<string>,
268
+ ReadonlyArray<string>
269
+ >['testIds'];
270
+
271
+ public abstract _lastRenderError: Error | undefined;
272
+ public abstract _internalRenderCount: number;
273
+ public abstract _lastRenderedProps: Readonly<
274
+ Pick<RenderParams<any, Inputs, State, any, any, any, any, any>, 'inputs' | 'state'>
275
+ >;
276
+ /**
277
+ * Calls all destroy methods on all state properties, if they exist. This is automatically
278
+ * called whenever the element is detached.
279
+ */
280
+ public abstract destroy(): void;
281
+ public abstract override render(): unknown;
282
+ public abstract readonly instanceState: State;
283
+ public abstract readonly observablePropertyListenerMap: ObservableListenerMap<State & Inputs>;
284
+ public abstract readonly instanceInputs: Inputs;
285
+ /**
286
+ * Used to assign inputs to the given element. This can be externally called as an API for
287
+ * setting inputs on an element reference, though this is discouraged. Inputs should typically
288
+ * be called using the `.assign()` method on an element definition inside of an HTML template.
289
+ */
290
+ public abstract assignInputs(
291
+ inputs: EmptyObject extends Required<Inputs> ? never : Partial<Inputs>,
292
+ ): void;
293
+ /** The element definition for this element instance. */
294
+ public abstract readonly definition: DeclarativeElementDefinition<
295
+ TagName,
296
+ Inputs,
297
+ State,
298
+ EventsInit,
299
+ HostClassKeys,
300
+ CssVarKeys,
301
+ SlotNames,
302
+ TestIds
303
+ >;
304
+ }
305
+
306
+ /**
307
+ * The assign inputs method of a declarative element.
308
+ *
309
+ * @category Internal
310
+ */
311
+ export type AssignMethod<TagName extends CustomElementTagName, Inputs extends PropertyInitMapBase> =
312
+ IsAny<Inputs> extends true
313
+ ? any
314
+ : IsEmptyObject<Required<Inputs>> extends true
315
+ ? (inputsObject: never) => never
316
+ : (
317
+ inputsObject: IsEmptyObject<Required<Inputs>> extends true ? never : Inputs,
318
+ ) => MinimalDefinitionWithInputs<TagName>;
319
+
320
+ /**
321
+ * All static properties on a declarative element. These all come from the element's definition.
322
+ *
323
+ * @category Internal
324
+ */
325
+ export type StaticDeclarativeElementProperties<
326
+ TagName extends CustomElementTagName,
327
+ Inputs extends PropertyInitMapBase,
328
+ State extends PropertyInitMapBase,
329
+ EventsInit extends EventsInitMap,
330
+ HostClassKeys extends BaseStringName<TagName>,
331
+ CssVarKeys extends BaseStringName<TagName>,
332
+ SlotNames extends ReadonlyArray<string>,
333
+ TestIds extends ReadonlyArray<string>,
334
+ > = {
335
+ /** Assign inputs to an element directly on its interpolated tag. */
336
+ readonly assign: AssignMethod<TagName, Inputs>;
337
+ assignedInputs: Inputs | undefined;
338
+
339
+ /** Pass through the render callback for direct unit testability */
340
+ readonly render: RenderCallback<
341
+ TagName,
342
+ Inputs,
343
+ State,
344
+ EventsInit,
345
+ HostClassKeys,
346
+ CssVarKeys,
347
+ SlotNames,
348
+ TestIds
349
+ >;
350
+ readonly events: EventDescriptorMap<TagName, EventsInit>;
351
+ readonly slotNames: Readonly<StringNameMap<TagName, 'slot', SlotNames>>;
352
+ readonly testIds: Readonly<StringNameMap<TagName, 'test-id', TestIds>>;
353
+ readonly init: DeclarativeElementInit<
354
+ TagName,
355
+ Inputs,
356
+ State,
357
+ EventsInit,
358
+ HostClassKeys,
359
+ CssVarKeys,
360
+ SlotNames,
361
+ TestIds
362
+ >;
363
+ readonly elementOptions: DeclarativeElementDefinitionOptions;
364
+ readonly InputsType: Inputs;
365
+ readonly StateType: Readonly<State>;
366
+ readonly UpdateStateType: UpdateStateCallback<State>;
367
+ readonly hostClasses: HostClassNamesMap<string, HostClassKeys>;
368
+ readonly cssVars: CssVars<TagName, CssVarKeys>;
369
+
370
+ readonly tagName: TagName;
371
+ readonly styles: CSSResult;
372
+ };