@ryupold/vode 1.1.9 → 1.3.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.
@@ -0,0 +1,228 @@
1
+ import { AnimatedPatch, DeepPartial, PatchableState, RenderPatch } from "./vode.js";
2
+
3
+ /**
4
+ * Generates dot-notation path strings for all nested properties in an object type.
5
+ *
6
+ * @example
7
+ * type User = { profile: { settings: { theme: string } } };
8
+ * type Paths = KeyPath<User>; // "profile" | "profile.settings" | "profile.settings.theme"
9
+ */
10
+ export type KeyPath<ObjectType extends object> =
11
+ { [Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object
12
+ ? `${Key}` | `${Key}.${KeyPath<ObjectType[Key]>}`
13
+ : `${Key}`
14
+ }[keyof ObjectType & (string | number)];
15
+
16
+ /**
17
+ * Extracts the value type at a given dot-notation path in an object type.
18
+ *
19
+ * @example
20
+ * type User = { profile: { settings: { theme: string } } };
21
+ * type Theme = PathValue<User, "profile.settings.theme">; // string
22
+ */
23
+ export type PathValue<T, P extends string> =
24
+ P extends `${infer Key}.${infer Rest}`
25
+ ? Key extends keyof T ? PathValue<T[Key], Rest> : never
26
+ : P extends keyof T ? T[P] : never;
27
+
28
+ /**
29
+ * Maps valid paths in an object type to paths that resolve to a specific substate type.
30
+ * Used for type-safe path constraints in StateContext.
31
+ * Ensures exact type matching (not just compatibility).
32
+ *
33
+ * @example
34
+ * type User = { profile: { name: string, settings: { theme: string } } };
35
+ * type SettingsPaths = KeyToSubState<User, { theme: string }>; // "profile.settings"
36
+ * type InvalidPath = KeyToSubState<User, { theme: string }, "profile">; // never (type mismatch)
37
+ */
38
+ export type KeyToSubState<S extends object, Sub, K = KeyPath<S>> =
39
+ K extends KeyPath<S> ? [PathValue<S, K>] extends [Sub] ? [Sub] extends [PathValue<S, K>] ? K
40
+ : never : never : never;
41
+
42
+ /**
43
+ * State context for type-safe access and manipulation of nested state paths
44
+ * while still be able to access the parent state.
45
+ */
46
+ export interface StateContext<S extends PatchableState, SubState> extends SubStateContext<SubState> {
47
+ /**
48
+ * parent state
49
+ * @see PatchableState<S>
50
+ */
51
+ get state(): S;
52
+ }
53
+
54
+ /**
55
+ * State context for type-safe access and manipulation of nested sub-state values without knowledge of the parent state.
56
+ */
57
+ export interface SubStateContext<SubState> {
58
+ /**
59
+ * Reads the current value of the substate if it exists.
60
+ *
61
+ * @returns The current value, or undefined if the path doesn't exist
62
+ */
63
+ get(): SubState | undefined;
64
+
65
+ /**
66
+ * Updates the nested sub-state value WITHOUT triggering a render.
67
+ * This performs a silent mutation of the parent state object.
68
+ *
69
+ * @param {DeepPartial<SubState>} value - The new value or partial update to apply
70
+ */
71
+ put(value: SubState | DeepPartial<SubState> | undefined | null): void;
72
+
73
+ /**
74
+ * Updates the nested sub-state value AND triggers a render.
75
+ * This is the recommended way to update nested state in most cases.
76
+ *
77
+ * @param value - The new value or partial update to apply
78
+ */
79
+ patch(value: SubState | DeepPartial<SubState> | Array<DeepPartial<SubState>> | undefined | null): void;
80
+ }
81
+
82
+ /**
83
+ * Provides type-safe access to deeply nested state with path-based operations.
84
+ *
85
+ * **When to use:**
86
+ * - State is deeply nested
87
+ * - Multiple components access the same nested path
88
+ * - You need type safety for nested updates
89
+ *
90
+ * **When to avoid:**
91
+ * - Shallow state structures for main state
92
+ * - State structure changes frequently
93
+ * - Learning vode for the first time (start simpler)
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const state = createState({
98
+ * user: {
99
+ * profile: {
100
+ * settings: { theme: 'dark', lang: 'en' }
101
+ * }
102
+ * }
103
+ * });
104
+ * app(element, state, (s) => [DIV]);
105
+ *
106
+ * // Create a context for the nested settings
107
+ * const settingsCtx = new StateContext(state, 'user.profile.settings');
108
+ *
109
+ * // Read current value
110
+ * const settings = settingsCtx.get(); // { theme: 'dark', lang: 'en' }
111
+ *
112
+ * // Update and trigger render
113
+ * settingsCtx.patch({ theme: 'light' });
114
+ *
115
+ * // Update without render (silent mutation)
116
+ * settingsCtx.put({ lang: 'de' });
117
+ * state.patch({}); // trigger render manually later
118
+ * ```
119
+ *
120
+ * @template S - The root state type (must extend PatchableState)
121
+ * @template SubState - The type of the nested state being accessed
122
+ */
123
+ export class KeyStateContext<S extends PatchableState, SubState>
124
+ implements StateContext<S, SubState> {
125
+ private readonly keys: string[];
126
+
127
+ constructor(
128
+ public readonly state: S,
129
+ public readonly path: KeyToSubState<S, SubState>
130
+ ) {
131
+ this.keys = path.split('.');
132
+ }
133
+
134
+ get(): SubState | undefined {
135
+ const keys = this.keys;
136
+ let raw = this.state ? (<any>this.state)[keys[0]] : undefined;
137
+ for (let i = 1; i < keys.length && !!raw; i++) {
138
+ raw = raw[keys[i]];
139
+ }
140
+ return raw;
141
+ }
142
+
143
+ put(value: SubState | DeepPartial<SubState> | undefined | null) {
144
+ this.putDeep(value, this.state);
145
+ }
146
+
147
+ patch(value: SubState | DeepPartial<SubState> | Array<DeepPartial<SubState>> | undefined | null) {
148
+ if (Array.isArray(value)) {
149
+ const animation: AnimatedPatch<S> = [];
150
+ for(const v of value){
151
+ animation.push(this.createPatch(v));
152
+ }
153
+ this.state.patch(animation);
154
+ }
155
+ this.state.patch(this.createPatch(value as DeepPartial<SubState>));
156
+ }
157
+
158
+ /**
159
+ * Creates a render-patch for the parent state by setting a nested sub-state value while creating necessary structure.
160
+ *
161
+ * @example
162
+ * ```typescript
163
+ * const ctx = new StateContext(state, 'user.profile.settings');
164
+ * const patch = ctx.createPatch({ theme: 'light' });
165
+ * // patch is { user: { profile: { settings: { theme: 'light' } } } }
166
+ * ```
167
+ *
168
+ * @param value
169
+ * @returns {{key-path}:{...: value}} render-patch for the parent state
170
+ */
171
+ createPatch(value: SubState | DeepPartial<SubState> | undefined | null): RenderPatch<S> {
172
+ const renderPatch: DeepPartial<S> = {};
173
+ this.putDeep(value, renderPatch);
174
+ return renderPatch;
175
+ }
176
+
177
+ private putDeep(value: SubState | DeepPartial<SubState> | undefined | null, target: S | DeepPartial<S>) {
178
+ const keys = this.keys;
179
+ if (keys.length > 1) {
180
+ let i = 0;
181
+ let raw = (<any>target)[keys[i]];
182
+ if (typeof raw !== "object" || raw === null) {
183
+ (<any>target)[keys[i]] = raw = {};
184
+ }
185
+ for (i = 1; i < keys.length - 1; i++) {
186
+ const p = raw;
187
+ raw = raw[keys[i]];
188
+ if (typeof raw !== "object" || raw === null) {
189
+ p[keys[i]] = raw = {};
190
+ }
191
+ }
192
+ raw[keys[i]] = value;
193
+ } else {
194
+ if (typeof (<any>target)[keys[0]] === "object" && typeof value === "object")
195
+ Object.assign((<any>target)[keys[0]], value);
196
+ else
197
+ (<any>target)[keys[0]] = value;
198
+ }
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Provides type-safe access to sub-state with fetch & store delegate functions.
204
+ * Implementer is responsible for reading/writing the sub-state correctly.
205
+ *
206
+ * **When to use:**
207
+ * - State structure is dynamic or complex
208
+ * - You need custom logic for accessing nested state
209
+ * - You want to encapsulate access logic outside of parent state
210
+ *
211
+ * **When to avoid:**
212
+ * - Simple, static state structures
213
+ * - You want automatic path-based access (use KeyStateContext instead)
214
+ * - Learning vode for the first time (start simpler)
215
+ */
216
+ export class DelegateStateContext<S extends PatchableState, SubState>
217
+ implements StateContext<S, SubState> {
218
+ constructor(
219
+ public readonly state: S,
220
+
221
+ public readonly get: () => SubState | undefined,
222
+
223
+ public readonly put: (value: SubState | DeepPartial<SubState> | undefined | null) => void,
224
+
225
+ public readonly patch: (value: SubState | DeepPartial<SubState> | Array<DeepPartial<SubState>> | undefined | null) => void,
226
+ ) {
227
+ }
228
+ }
package/src/vode-tags.ts CHANGED
@@ -1,207 +1,208 @@
1
1
  import { Tag } from "./vode.js";
2
2
 
3
- //=== HTML ========================================================================================
4
- export const A: Tag = "a";
5
- export const ABBR: Tag = "abbr";
6
- export const ADDRESS: Tag = "address";
7
- export const AREA: Tag = "area";
8
- export const ARTICLE: Tag = "article";
9
- export const ASIDE: Tag = "aside";
10
- export const AUDIO: Tag = "audio";
11
- export const B: Tag = "b";
12
- export const BASE: Tag = "base";
13
- export const BDI: Tag = "bdi";
14
- export const BDO: Tag = "bdo";
15
- export const BLOCKQUOTE: Tag = "blockquote";
16
- export const BODY: Tag = "body";
17
- export const BR: Tag = "br";
18
- export const BUTTON: Tag = "button";
19
- export const CANVAS: Tag = "canvas";
20
- export const CAPTION: Tag = "caption";
21
- export const CITE: Tag = "cite";
22
- export const CODE: Tag = "code";
23
- export const COL: Tag = "col";
24
- export const COLGROUP: Tag = "colgroup";
25
- export const DATA: Tag = "data";
26
- export const DATALIST: Tag = "datalist";
27
- export const DD: Tag = "dd";
28
- export const DEL: Tag = "del";
29
- export const DETAILS: Tag = "details";
30
- export const DFN: Tag = "dfn";
31
- export const DIALOG: Tag = "dialog";
32
- export const DIV: Tag = "div";
33
- export const DL: Tag = "dl";
34
- export const DT: Tag = "dt";
35
- export const EM: Tag = "em";
36
- export const EMBED: Tag = "embed";
37
- export const FIELDSET: Tag = "fieldset";
38
- export const FIGCAPTION: Tag = "figcaption";
39
- export const FIGURE: Tag = "figure";
40
- export const FOOTER: Tag = "footer";
41
- export const FORM: Tag = "form";
42
- export const H1: Tag = "h1";
43
- export const H2: Tag = "h2";
44
- export const H3: Tag = "h3";
45
- export const H4: Tag = "h4";
46
- export const H5: Tag = "h5";
47
- export const H6: Tag = "h6";
48
- export const HEAD: Tag = "head";
49
- export const HEADER: Tag = "header";
50
- export const HGROUP: Tag = "hgroup";
51
- export const HR: Tag = "hr";
52
- export const HTML: Tag = "html";
53
- export const I: Tag = "i";
54
- export const IFRAME: Tag = "iframe";
55
- export const IMG: Tag = "img";
56
- export const INPUT: Tag = "input";
57
- export const INS: Tag = "ins";
58
- export const KBD: Tag = "kbd";
59
- export const LABEL: Tag = "label";
60
- export const LEGEND: Tag = "legend";
61
- export const LI: Tag = "li";
62
- export const LINK: Tag = "link";
63
- export const MAIN: Tag = "main";
64
- export const MAP: Tag = "map";
65
- export const MARK: Tag = "mark";
66
- export const MENU: Tag = "menu";
67
- export const META: Tag = "meta";
68
- export const METER: Tag = "meter";
69
- export const NAV: Tag = "nav";
70
- export const NOSCRIPT: Tag = "noscript";
71
- export const OBJECT: Tag = "object";
72
- export const OL: Tag = "ol";
73
- export const OPTGROUP: Tag = "optgroup";
74
- export const OPTION: Tag = "option";
75
- export const OUTPUT: Tag = "output";
76
- export const P: Tag = "p";
77
- export const PICTURE: Tag = "picture";
78
- export const PRE: Tag = "pre";
79
- export const PROGRESS: Tag = "progress";
80
- export const Q: Tag = "q";
81
- export const RP: Tag = "rp";
82
- export const RT: Tag = "rt";
83
- export const RUBY: Tag = "ruby";
84
- export const S: Tag = "s";
85
- export const SAMP: Tag = "samp";
86
- export const SCRIPT: Tag = "script";
87
- export const SECTION: Tag = "section";
88
- export const SELECT: Tag = "select";
89
- export const SLOT: Tag = "slot";
90
- export const SMALL: Tag = "small";
91
- export const SOURCE: Tag = "source";
92
- export const SPAN: Tag = "span";
93
- export const STRONG: Tag = "strong";
94
- export const STYLE: Tag = "style";
95
- export const SUB: Tag = "sub";
96
- export const SUMMARY: Tag = "summary";
97
- export const SUP: Tag = "sup";
98
- export const TABLE: Tag = "table";
99
- export const TBODY: Tag = "tbody";
100
- export const TD: Tag = "td";
101
- export const TEMPLATE: Tag = "template";
102
- export const TEXTAREA: Tag = "textarea";
103
- export const TFOOT: Tag = "tfoot";
104
- export const TH: Tag = "th";
105
- export const THEAD: Tag = "thead";
106
- export const TIME: Tag = "time";
107
- export const TITLE: Tag = "title";
108
- export const TR: Tag = "tr";
109
- export const TRACK: Tag = "track";
110
- export const U: Tag = "u";
111
- export const UL: Tag = "ul";
112
- export const VIDEO: Tag = "video";
113
- export const WBR: Tag = "wbr";
3
+ //=== HTML ====================================================
4
+ export const A: Tag = "a" as const;
5
+ export const ABBR: Tag = "abbr" as const;
6
+ export const ADDRESS: Tag = "address" as const;
7
+ export const AREA: Tag = "area" as const;
8
+ export const ARTICLE: Tag = "article" as const;
9
+ export const ASIDE: Tag = "aside" as const;
10
+ export const AUDIO: Tag = "audio" as const;
11
+ export const B: Tag = "b" as const;
12
+ export const BASE: Tag = "base" as const;
13
+ export const BDI: Tag = "bdi" as const;
14
+ export const BDO: Tag = "bdo" as const;
15
+ export const BLOCKQUOTE: Tag = "blockquote" as const;
16
+ export const BODY: Tag = "body" as const;
17
+ export const BR: Tag = "br" as const;
18
+ export const BUTTON: Tag = "button" as const;
19
+ export const CANVAS: Tag = "canvas" as const;
20
+ export const CAPTION: Tag = "caption" as const;
21
+ export const CITE: Tag = "cite" as const;
22
+ export const CODE: Tag = "code" as const;
23
+ export const COL: Tag = "col" as const;
24
+ export const COLGROUP: Tag = "colgroup" as const;
25
+ export const DATA: Tag = "data" as const;
26
+ export const DATALIST: Tag = "datalist" as const;
27
+ export const DD: Tag = "dd" as const;
28
+ export const DEL: Tag = "del" as const;
29
+ export const DETAILS: Tag = "details" as const;
30
+ export const DFN: Tag = "dfn" as const;
31
+ export const DIALOG: Tag = "dialog" as const;
32
+ export const DIV: Tag = "div" as const;
33
+ export const DL: Tag = "dl" as const;
34
+ export const DT: Tag = "dt" as const;
35
+ export const EM: Tag = "em" as const;
36
+ export const EMBED: Tag = "embed" as const;
37
+ export const FIELDSET: Tag = "fieldset" as const;
38
+ export const FIGCAPTION: Tag = "figcaption" as const;
39
+ export const FIGURE: Tag = "figure" as const;
40
+ export const FOOTER: Tag = "footer" as const;
41
+ export const FORM: Tag = "form" as const;
42
+ export const H1: Tag = "h1" as const;
43
+ export const H2: Tag = "h2" as const;
44
+ export const H3: Tag = "h3" as const;
45
+ export const H4: Tag = "h4" as const;
46
+ export const H5: Tag = "h5" as const;
47
+ export const H6: Tag = "h6" as const;
48
+ export const HEAD: Tag = "head" as const;
49
+ export const HEADER: Tag = "header" as const;
50
+ export const HGROUP: Tag = "hgroup" as const;
51
+ export const HR: Tag = "hr" as const;
52
+ export const HTML: Tag = "html" as const;
53
+ export const I: Tag = "i" as const;
54
+ export const IFRAME: Tag = "iframe" as const;
55
+ export const IMG: Tag = "img" as const;
56
+ export const INPUT: Tag = "input" as const;
57
+ export const INS: Tag = "ins" as const;
58
+ export const KBD: Tag = "kbd" as const;
59
+ export const LABEL: Tag = "label" as const;
60
+ export const LEGEND: Tag = "legend" as const;
61
+ export const LI: Tag = "li" as const;
62
+ export const LINK: Tag = "link" as const;
63
+ export const MAIN: Tag = "main" as const;
64
+ export const MAP: Tag = "map" as const;
65
+ export const MARK: Tag = "mark" as const;
66
+ export const MENU: Tag = "menu" as const;
67
+ export const META: Tag = "meta" as const;
68
+ export const METER: Tag = "meter" as const;
69
+ export const NAV: Tag = "nav" as const;
70
+ export const NOSCRIPT: Tag = "noscript" as const;
71
+ export const OBJECT: Tag = "object" as const;
72
+ export const OL: Tag = "ol" as const;
73
+ export const OPTGROUP: Tag = "optgroup" as const;
74
+ export const OPTION: Tag = "option" as const;
75
+ export const OUTPUT: Tag = "output" as const;
76
+ export const P: Tag = "p" as const;
77
+ export const PICTURE: Tag = "picture" as const;
78
+ export const PRE: Tag = "pre" as const;
79
+ export const PROGRESS: Tag = "progress" as const;
80
+ export const Q: Tag = "q" as const;
81
+ export const RP: Tag = "rp" as const;
82
+ export const RT: Tag = "rt" as const;
83
+ export const RUBY: Tag = "ruby" as const;
84
+ export const S: Tag = "s" as const;
85
+ export const SAMP: Tag = "samp" as const;
86
+ export const SCRIPT: Tag = "script" as const;
87
+ export const SEARCH: Tag = "search" as const;
88
+ export const SECTION: Tag = "section" as const;
89
+ export const SELECT: Tag = "select" as const;
90
+ export const SLOT: Tag = "slot" as const;
91
+ export const SMALL: Tag = "small" as const;
92
+ export const SOURCE: Tag = "source" as const;
93
+ export const SPAN: Tag = "span" as const;
94
+ export const STRONG: Tag = "strong" as const;
95
+ export const STYLE: Tag = "style" as const;
96
+ export const SUB: Tag = "sub" as const;
97
+ export const SUMMARY: Tag = "summary" as const;
98
+ export const SUP: Tag = "sup" as const;
99
+ export const TABLE: Tag = "table" as const;
100
+ export const TBODY: Tag = "tbody" as const;
101
+ export const TD: Tag = "td" as const;
102
+ export const TEMPLATE: Tag = "template" as const;
103
+ export const TEXTAREA: Tag = "textarea" as const;
104
+ export const TFOOT: Tag = "tfoot" as const;
105
+ export const TH: Tag = "th" as const;
106
+ export const THEAD: Tag = "thead" as const;
107
+ export const TIME: Tag = "time" as const;
108
+ export const TITLE: Tag = "title" as const;
109
+ export const TR: Tag = "tr" as const;
110
+ export const TRACK: Tag = "track" as const;
111
+ export const U: Tag = "u" as const;
112
+ export const UL: Tag = "ul" as const;
113
+ export const VAR: Tag = "var" as const;
114
+ export const VIDEO: Tag = "video" as const;
115
+ export const WBR: Tag = "wbr" as const;
114
116
 
115
- //=== SVG =========================================================================================
116
- export const ANIMATE: Tag = "animate";
117
- export const ANIMATEMOTION: Tag = "animateMotion";
118
- export const ANIMATETRANSFORM: Tag = "animateTransform";
119
- export const CIRCLE: Tag = "circle";
120
- export const CLIPPATH: Tag = "clipPath";
121
- export const DEFS: Tag = "defs";
122
- export const DESC: Tag = "desc";
123
- export const ELLIPSE: Tag = "ellipse";
124
- export const FEBLEND: Tag = "feBlend";
125
- export const FECOLORMATRIX: Tag = "feColorMatrix";
126
- export const FECOMPONENTTRANSFER: Tag = "feComponentTransfer";
127
- export const FECOMPOSITE: Tag = "feComposite";
128
- export const FECONVOLVEMATRIX: Tag = "feConvolveMatrix";
129
- export const FEDIFFUSELIGHTING: Tag = "feDiffuseLighting";
130
- export const FEDISPLACEMENTMAP: Tag = "feDisplacementMap";
131
- export const FEDISTANTLIGHT: Tag = "feDistantLight";
132
- export const FEDROPSHADOW: Tag = "feDropShadow";
133
- export const FEFLOOD: Tag = "feFlood";
134
- export const FEFUNCA: Tag = "feFuncA";
135
- export const FEFUNCB: Tag = "feFuncB";
136
- export const FEFUNCG: Tag = "feFuncG";
137
- export const FEFUNCR: Tag = "feFuncR";
138
- export const FEGAUSSIANBLUR: Tag = "feGaussianBlur";
139
- export const FEIMAGE: Tag = "feImage";
140
- export const FEMERGE: Tag = "feMerge";
141
- export const FEMERGENODE: Tag = "feMergeNode";
142
- export const FEMORPHOLOGY: Tag = "feMorphology";
143
- export const FEOFFSET: Tag = "feOffset";
144
- export const FEPOINTLIGHT: Tag = "fePointLight";
145
- export const FESPECULARLIGHTING: Tag = "feSpecularLighting";
146
- export const FESPOTLIGHT: Tag = "feSpotLight";
147
- export const FETILE: Tag = "feTile";
148
- export const FETURBULENCE: Tag = "feTurbulence";
149
- export const FILTER: Tag = "filter";
150
- export const FOREIGNOBJECT: Tag = "foreignObject";
151
- export const G: Tag = "g";
152
- export const IMAGE: Tag = "image";
153
- export const LINE: Tag = "line";
154
- export const LINEARGRADIENT: Tag = "linearGradient";
155
- export const MARKER: Tag = "marker";
156
- export const MASK: Tag = "mask";
157
- export const METADATA: Tag = "metadata";
158
- export const MPATH: Tag = "mpath";
159
- export const PATH: Tag = "path";
160
- export const PATTERN: Tag = "pattern";
161
- export const POLYGON: Tag = "polygon";
162
- export const POLYLINE: Tag = "polyline";
163
- export const RADIALGRADIENT: Tag = "radialGradient";
164
- export const RECT: Tag = "rect";
165
- export const SET: Tag = "set";
166
- export const STOP: Tag = "stop";
167
- export const SVG: Tag = "svg";
168
- export const SWITCH: Tag = "switch";
169
- export const SYMBOL: Tag = "symbol";
170
- export const TEXT: Tag = "text";
171
- export const TEXTPATH: Tag = "textPath";
172
- export const TSPAN: Tag = "tspan";
173
- export const USE: Tag = "use";
174
- export const VIEW: Tag = "view";
117
+ //=== SVG =====================================================
118
+ export const ANIMATE: Tag = "animate" as const;
119
+ export const ANIMATEMOTION: Tag = "animateMotion" as const;
120
+ export const ANIMATETRANSFORM: Tag = "animateTransform" as const;
121
+ export const CIRCLE: Tag = "circle" as const;
122
+ export const CLIPPATH: Tag = "clipPath" as const;
123
+ export const DEFS: Tag = "defs" as const;
124
+ export const DESC: Tag = "desc" as const;
125
+ export const ELLIPSE: Tag = "ellipse" as const;
126
+ export const FEBLEND: Tag = "feBlend" as const;
127
+ export const FECOLORMATRIX: Tag = "feColorMatrix" as const;
128
+ export const FECOMPONENTTRANSFER: Tag = "feComponentTransfer" as const;
129
+ export const FECOMPOSITE: Tag = "feComposite" as const;
130
+ export const FECONVOLVEMATRIX: Tag = "feConvolveMatrix" as const;
131
+ export const FEDIFFUSELIGHTING: Tag = "feDiffuseLighting" as const;
132
+ export const FEDISPLACEMENTMAP: Tag = "feDisplacementMap" as const;
133
+ export const FEDISTANTLIGHT: Tag = "feDistantLight" as const;
134
+ export const FEDROPSHADOW: Tag = "feDropShadow" as const;
135
+ export const FEFLOOD: Tag = "feFlood" as const;
136
+ export const FEFUNCA: Tag = "feFuncA" as const;
137
+ export const FEFUNCB: Tag = "feFuncB" as const;
138
+ export const FEFUNCG: Tag = "feFuncG" as const;
139
+ export const FEFUNCR: Tag = "feFuncR" as const;
140
+ export const FEGAUSSIANBLUR: Tag = "feGaussianBlur" as const;
141
+ export const FEIMAGE: Tag = "feImage" as const;
142
+ export const FEMERGE: Tag = "feMerge" as const;
143
+ export const FEMERGENODE: Tag = "feMergeNode" as const;
144
+ export const FEMORPHOLOGY: Tag = "feMorphology" as const;
145
+ export const FEOFFSET: Tag = "feOffset" as const;
146
+ export const FEPOINTLIGHT: Tag = "fePointLight" as const;
147
+ export const FESPECULARLIGHTING: Tag = "feSpecularLighting" as const;
148
+ export const FESPOTLIGHT: Tag = "feSpotLight" as const;
149
+ export const FETILE: Tag = "feTile" as const;
150
+ export const FETURBULENCE: Tag = "feTurbulence" as const;
151
+ export const FILTER: Tag = "filter" as const;
152
+ export const FOREIGNOBJECT: Tag = "foreignObject" as const;
153
+ export const G: Tag = "g" as const;
154
+ export const IMAGE: Tag = "image" as const;
155
+ export const LINE: Tag = "line" as const;
156
+ export const LINEARGRADIENT: Tag = "linearGradient" as const;
157
+ export const MARKER: Tag = "marker" as const;
158
+ export const MASK: Tag = "mask" as const;
159
+ export const METADATA: Tag = "metadata" as const;
160
+ export const MPATH: Tag = "mpath" as const;
161
+ export const PATH: Tag = "path" as const;
162
+ export const PATTERN: Tag = "pattern" as const;
163
+ export const POLYGON: Tag = "polygon" as const;
164
+ export const POLYLINE: Tag = "polyline" as const;
165
+ export const RADIALGRADIENT: Tag = "radialGradient" as const;
166
+ export const RECT: Tag = "rect" as const;
167
+ export const SET: Tag = "set" as const;
168
+ export const STOP: Tag = "stop" as const;
169
+ export const SVG: Tag = "svg" as const;
170
+ export const SWITCH: Tag = "switch" as const;
171
+ export const SYMBOL: Tag = "symbol" as const;
172
+ export const TEXT: Tag = "text" as const;
173
+ export const TEXTPATH: Tag = "textPath" as const;
174
+ export const TSPAN: Tag = "tspan" as const;
175
+ export const USE: Tag = "use" as const;
176
+ export const VIEW: Tag = "view" as const;
175
177
 
176
- //=== MathML ======================================================================================
177
-
178
- export const ANNOTATION: Tag = "annotation";
179
- export const ANNOTATION_XML: Tag = "annotation-xml";
180
- export const MACTION: Tag = "maction";
181
- export const MATH: Tag = "math";
182
- export const MERROR: Tag = "merror";
183
- export const MFRAC: Tag = "mfrac";
184
- export const MI: Tag = "mi";
185
- export const MMULTISCRIPTS: Tag = "mmultiscripts";
186
- export const MN: Tag = "mn";
187
- export const MO: Tag = "mo";
188
- export const MOVER: Tag = "mover";
189
- export const MPADDED: Tag = "mpadded";
190
- export const MPHANTOM: Tag = "mphantom";
191
- export const MPRESCRIPTS: Tag = "mprescripts";
192
- export const MROOT: Tag = "mroot";
193
- export const MROW: Tag = "mrow";
194
- export const MS: Tag = "ms";
195
- export const MSPACE: Tag = "mspace";
196
- export const MSQRT: Tag = "msqrt";
197
- export const MSTYLE: Tag = "mstyle";
198
- export const MSUB: Tag = "msub";
199
- export const MSUBSUP: Tag = "msubsup";
200
- export const MSUP: Tag = "msup";
201
- export const MTABLE: Tag = "mtable";
202
- export const MTD: Tag = "mtd";
203
- export const MTEXT: Tag = "mtext";
204
- export const MTR: Tag = "mtr";
205
- export const MUNDER: Tag = "munder";
206
- export const MUNDEROVER: Tag = "munderover";
207
- export const SEMANTICS: Tag = "semantics";
178
+ //=== MathML ==================================================
179
+ export const ANNOTATION: Tag = "annotation" as const;
180
+ export const ANNOTATION_XML: Tag = "annotation-xml" as const;
181
+ export const MACTION: Tag = "maction" as const;
182
+ export const MATH: Tag = "math" as const;
183
+ export const MERROR: Tag = "merror" as const;
184
+ export const MFRAC: Tag = "mfrac" as const;
185
+ export const MI: Tag = "mi" as const;
186
+ export const MMULTISCRIPTS: Tag = "mmultiscripts" as const;
187
+ export const MN: Tag = "mn" as const;
188
+ export const MO: Tag = "mo" as const;
189
+ export const MOVER: Tag = "mover" as const;
190
+ export const MPADDED: Tag = "mpadded" as const;
191
+ export const MPHANTOM: Tag = "mphantom" as const;
192
+ export const MPRESCRIPTS: Tag = "mprescripts" as const;
193
+ export const MROOT: Tag = "mroot" as const;
194
+ export const MROW: Tag = "mrow" as const;
195
+ export const MS: Tag = "ms" as const;
196
+ export const MSPACE: Tag = "mspace" as const;
197
+ export const MSQRT: Tag = "msqrt" as const;
198
+ export const MSTYLE: Tag = "mstyle" as const;
199
+ export const MSUB: Tag = "msub" as const;
200
+ export const MSUBSUP: Tag = "msubsup" as const;
201
+ export const MSUP: Tag = "msup" as const;
202
+ export const MTABLE: Tag = "mtable" as const;
203
+ export const MTD: Tag = "mtd" as const;
204
+ export const MTEXT: Tag = "mtext" as const;
205
+ export const MTR: Tag = "mtr" as const;
206
+ export const MUNDER: Tag = "munder" as const;
207
+ export const MUNDEROVER: Tag = "munderover" as const;
208
+ export const SEMANTICS: Tag = "semantics" as const;