leaner 0.3.0 → 0.4.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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (C) 2024 Michał Męciński
3
+ Copyright (C) 2026 Michał Męciński
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -25,4 +25,4 @@ npm test
25
25
 
26
26
  ## License
27
27
 
28
- Leaner.js is open-source software released under the MIT License. © 2024 Michał Męciński.
28
+ Leaner.js is open-source software released under the MIT License. © 2026 Michał Męciński.
package/dist/web.js CHANGED
@@ -899,15 +899,23 @@ function createSwitchDirective( template ) {
899
899
  }
900
900
 
901
901
  function createTryDirective( template ) {
902
- if ( template.length != 3 || typeof template[ 2 ] != 'function' )
902
+ const catchTemplate = template[ template.length - 1 ];
903
+
904
+ if ( !Array.isArray( catchTemplate ) || catchTemplate.length != 2 || catchTemplate[ 0 ] != 'catch' || typeof catchTemplate[ 1 ] != 'function' )
903
905
  throw new TypeError( 'Invalid try template' );
904
906
 
905
907
  const result = new DynamicNode( null );
906
908
 
907
909
  const context = createChildContext();
908
910
 
911
+ let childTemplate = null;
912
+ if ( template.length == 3 )
913
+ childTemplate = template[ 1 ];
914
+ else
915
+ childTemplate = [ template.slice( 1, template.length - 1 ) ];
916
+
909
917
  try {
910
- updateDynamicNode( result, context, template[ 1 ] );
918
+ updateDynamicNode( result, context, childTemplate );
911
919
  } catch ( err ) {
912
920
  updateErrorState( err );
913
921
  return result;
@@ -929,11 +937,12 @@ function createTryDirective( template ) {
929
937
  context.errorHandler = null;
930
938
  if ( result.content == null )
931
939
  cleanUpContext( context );
932
- updateDynamicNode( result, context, template[ 2 ]( err ) );
940
+ updateDynamicNode( result, context, catchTemplate[ 1 ]( err ) );
933
941
  }
934
942
  }
935
943
 
936
944
  const Directives = {
945
+ catch: unexpectedDirective,
937
946
  dynamic: createDynamicDirective,
938
947
  else: unexpectedDirective,
939
948
  for: createForDirective,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leaner",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Thin, reactive wrapper for DOM",
5
5
  "type": "module",
6
6
  "files": [
@@ -21,6 +21,9 @@
21
21
  "import": "./dist/core.js",
22
22
  "types": "./types/core.d.ts"
23
23
  },
24
+ "./jsx-runtime": {
25
+ "types": "./types/jsx-runtime.d.ts"
26
+ },
24
27
  "./web": {
25
28
  "import": "./dist/web.js",
26
29
  "types": "./types/web.d.ts"
@@ -48,9 +51,12 @@
48
51
  "url": "https://github.com/leaner-js/leaner/issues"
49
52
  },
50
53
  "homepage": "https://leanerjs.org/",
54
+ "dependencies": {
55
+ "csstype": "^3.2.3"
56
+ },
51
57
  "devDependencies": {
52
- "jsdom": "^24.0.0",
53
- "rollup": "^4.17.2",
54
- "vitest": "^1.6.0"
58
+ "jsdom": "^29.1.1",
59
+ "rollup": "^4.63.0",
60
+ "vitest": "^4.1.11"
55
61
  }
56
62
  }
package/types/core.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- type DeepReadonly<T> = T extends object ? {
1
+ type BuiltInObject = Function | Date | Error | RegExp | Promise<any> | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any> | Node;
2
+
3
+ type DeepReadonly<T> = T extends BuiltInObject ? T : T extends object ? {
2
4
  readonly [ K in keyof T ]: DeepReadonly<T[ K ]>;
3
5
  } : T;
4
6
 
@@ -20,7 +22,7 @@ declare class Mutator<T> {
20
22
  private callback: ( value: T ) => void;
21
23
  }
22
24
 
23
- export type Getter<T> = ( () => DeepReadonly<T> ) & ( T extends Array<infer U> ? ArrayGetter<U> : T extends object ? ObjectGetter<T> : {} );
25
+ export type Getter<T> = ( () => DeepReadonly<T> ) & ( T extends BuiltInObject ? {} : T extends Array<infer U> ? ArrayGetter<U> : T extends object ? ObjectGetter<T> : {} );
24
26
 
25
27
  export type Setter<T> = ( value: ( T extends Function ? never : T ) | ( ( value: DeepReadonly<T> ) => T ) | Mutator<T> ) => void;
26
28
 
@@ -0,0 +1,132 @@
1
+ import { Component, Leaner, LeanerNode, LeanerElement } from './web';
2
+
3
+ declare global {
4
+ namespace JSX {
5
+ type ElementType = string | ( ( props: any, children: LeanerNode[] ) => LeanerNode );
6
+
7
+ type Element = LeanerElement;
8
+
9
+ interface IntrinsicElements {
10
+ a: Leaner.HTMLAnchorProps;
11
+ abbr: Leaner.HTMLProps;
12
+ address: Leaner.HTMLProps;
13
+ area: Leaner.HTMLAreaProps;
14
+ article: Leaner.HTMLProps;
15
+ aside: Leaner.HTMLProps;
16
+ audio: Leaner.HTMLAudioProps;
17
+ b: Leaner.HTMLProps;
18
+ base: Leaner.HTMLBaseProps;
19
+ bdi: Leaner.HTMLProps;
20
+ bdo: Leaner.HTMLProps;
21
+ blockquote: Leaner.HTMLQuoteProps;
22
+ body: Leaner.HTMLProps<HTMLBodyElement>;
23
+ br: Leaner.HTMLProps<HTMLBRElement>;
24
+ button: Leaner.HTMLButtonProps;
25
+ canvas: Leaner.HTMLCanvasProps;
26
+ caption: Leaner.HTMLProps<HTMLTableCaptionElement>;
27
+ cite: Leaner.HTMLProps;
28
+ code: Leaner.HTMLProps;
29
+ col: Leaner.HTMLTableColProps;
30
+ colgroup: Leaner.HTMLTableColProps;
31
+ data: Leaner.HTMLDataProps;
32
+ datalist: Leaner.HTMLProps<HTMLDataListElement>;
33
+ dd: Leaner.HTMLProps;
34
+ del: Leaner.HTMLModProps;
35
+ details: Leaner.HTMLDetailsProps;
36
+ dfn: Leaner.HTMLProps;
37
+ dialog: Leaner.HTMLDialogProps;
38
+ div: Leaner.HTMLProps<HTMLDivElement>;
39
+ dl: Leaner.HTMLProps<HTMLDListElement>;
40
+ dt: Leaner.HTMLProps;
41
+ em: Leaner.HTMLProps;
42
+ embed: Leaner.HTMLEmbedProps;
43
+ fieldset: Leaner.HTMLFieldSetProps;
44
+ figcaption: Leaner.HTMLProps;
45
+ figure: Leaner.HTMLProps;
46
+ footer: Leaner.HTMLProps;
47
+ form: Leaner.HTMLFormProps;
48
+ h1: Leaner.HTMLProps<HTMLHeadingElement>;
49
+ h2: Leaner.HTMLProps<HTMLHeadingElement>;
50
+ h3: Leaner.HTMLProps<HTMLHeadingElement>;
51
+ h4: Leaner.HTMLProps<HTMLHeadingElement>;
52
+ h5: Leaner.HTMLProps<HTMLHeadingElement>;
53
+ h6: Leaner.HTMLProps<HTMLHeadingElement>;
54
+ head: Leaner.HTMLProps<HTMLHeadElement>;
55
+ header: Leaner.HTMLProps;
56
+ hgroup: Leaner.HTMLProps;
57
+ hr: Leaner.HTMLProps<HTMLHRElement>;
58
+ html: Leaner.HTMLProps<HTMLHtmlElement>;
59
+ i: Leaner.HTMLProps;
60
+ iframe: Leaner.HTMLIFrameProps;
61
+ img: Leaner.HTMLImageProps;
62
+ input: Leaner.HTMLInputProps;
63
+ ins: Leaner.HTMLModProps;
64
+ kbd: Leaner.HTMLProps;
65
+ label: Leaner.HTMLLabelProps;
66
+ legend: Leaner.HTMLProps<HTMLLegendElement>;
67
+ li: Leaner.HTMLLIProps;
68
+ link: Leaner.HTMLLinkProps;
69
+ main: Leaner.HTMLProps;
70
+ map: Leaner.HTMLMapProps;
71
+ mark: Leaner.HTMLProps;
72
+ menu: Leaner.HTMLProps<HTMLMenuElement>;
73
+ meta: Leaner.HTMLMetaProps;
74
+ meter: Leaner.HTMLMeterProps;
75
+ nav: Leaner.HTMLProps;
76
+ noscript: Leaner.HTMLProps;
77
+ object: Leaner.HTMLObjectProps;
78
+ ol: Leaner.HTMLLOListProps;
79
+ optgroup: Leaner.HTMLOptGroupProps;
80
+ option: Leaner.HTMLOptionProps;
81
+ output: Leaner.HTMLOutputProps;
82
+ p: Leaner.HTMLProps<HTMLParagraphElement>;
83
+ picture: Leaner.HTMLProps<HTMLPictureElement>;
84
+ pre: Leaner.HTMLProps<HTMLPreElement>;
85
+ progress: Leaner.HTMLProgressProps;
86
+ q: Leaner.HTMLQuoteProps;
87
+ rp: Leaner.HTMLProps;
88
+ rt: Leaner.HTMLProps;
89
+ s: Leaner.HTMLProps;
90
+ samp: Leaner.HTMLProps;
91
+ script: Leaner.HTMLScriptProps;
92
+ search: Leaner.HTMLProps;
93
+ section: Leaner.HTMLProps;
94
+ select: Leaner.HTMLSelectProps;
95
+ slot: Leaner.HTMLSlotProps;
96
+ small: Leaner.HTMLProps;
97
+ source: Leaner.HTMLSourceProps;
98
+ span: Leaner.HTMLProps<HTMLSpanElement>;
99
+ strong: Leaner.HTMLProps;
100
+ style: Leaner.HTMLStyleProps;
101
+ sub: Leaner.HTMLProps;
102
+ summary: Leaner.HTMLProps;
103
+ sup: Leaner.HTMLProps;
104
+ table: Leaner.HTMLProps<HTMLTableElement>;
105
+ tbody: Leaner.HTMLProps<HTMLTableSectionElement>;
106
+ td: Leaner.HTMLTableCellProps;
107
+ template: Leaner.HTMLProps<HTMLTemplateElement>;
108
+ textarea: Leaner.HTMLTextAreaProps;
109
+ tfoot: Leaner.HTMLProps<HTMLTableSectionElement>;
110
+ th: Leaner.HTMLTableCellHeaderProps;
111
+ thead: Leaner.HTMLProps<HTMLTableSectionElement>;
112
+ time: Leaner.HTMLTimeProps;
113
+ title: Leaner.HTMLProps<HTMLTimeElement>;
114
+ tr: Leaner.HTMLProps<HTMLTableRowElement>;
115
+ track: Leaner.HTMLTrackProps;
116
+ u: Leaner.HTMLProps;
117
+ ul: Leaner.HTMLProps<HTMLUListElement>;
118
+ var: Leaner.HTMLProps;
119
+ video: Leaner.HTMLVideoProps;
120
+ wbr: Leaner.HTMLProps;
121
+
122
+ catch: {};
123
+ dynamic: { is: () => string | Component, [ K: string ]: any };
124
+ else: {};
125
+ for: { items: () => readonly any[] };
126
+ if: { match: () => boolean };
127
+ repeat: { count: number | ( () => number ) };
128
+ switch: {};
129
+ try: {};
130
+ }
131
+ }
132
+ }
package/types/web.d.ts CHANGED
@@ -1,3 +1,11 @@
1
+ import * as CSS from 'csstype';
2
+
3
+ export type LeanerElement = any[];
4
+
5
+ export type LeanerNode = LeanerElement | Node | null | string | number | ( () => null | string | number );
6
+
7
+ export type Component = ( props: any, children: any[] ) => LeanerNode;
8
+
1
9
  export interface App {
2
10
  mount( target: HTMLElement ): void;
3
11
  destroy(): void;
@@ -5,12 +13,641 @@ export interface App {
5
13
  use( callback: () => void ): void;
6
14
  }
7
15
 
8
- export declare function createApp( component: ( props: object, children: any[] ) => any ): App;
16
+ interface InjectionConstraint<T> {}
17
+
18
+ export type InjectionKey<T> = symbol & InjectionConstraint<T>;
9
19
 
10
- export declare function inject( key: string | symbol ): any;
20
+ export declare function createApp( component: Component ): App;
11
21
 
12
- export declare function provide( key: string | symbol, value: any ): void;
22
+ export declare function inject<T>( key: string | InjectionKey<T> ): T | undefined;
23
+
24
+ export declare function provide<T, K = string | InjectionKey<T>>( key: K, value: K extends InjectionKey<infer V> ? V : T ): void;
13
25
 
14
26
  export declare function onMount( callback: () => void ): void;
15
27
 
16
28
  export declare function onDestroy( callback: () => void ): void;
29
+
30
+ type Prop<T> = T | null | ( () => T | null );
31
+
32
+ type BooleanProp = Prop<boolean | ''>;
33
+
34
+ type ReferrerPolicyProp = Prop<'no-referrer' | 'no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin'
35
+ | 'strict-origin-when-cross-origin' | 'unsafe-url'>;
36
+
37
+ type ClassObject = { [ K: string ]: boolean | null | ( () => boolean | null ) };
38
+
39
+ type ClassProp = string | null | ( () => string | string[] | null ) | Array<string | null | ( () => string | null ) | ClassObject> | ClassObject;
40
+
41
+ type StyleObject = {
42
+ [ K in keyof CSS.Properties ]: CSS.Properties[ K ] | null | ( () => CSS.Properties[ K ] | null );
43
+ };
44
+
45
+ type StyleProp = string | null | ( () => string | null | CSS.Properties ) | StyleObject;
46
+
47
+ type GlobalEvent = Event;
48
+ type GlobalAnimationEvent = AnimationEvent;
49
+ type GlobalClipboardEvent = ClipboardEvent;
50
+ type GlobalCompositionEvent = CompositionEvent;
51
+ type GlobalDragEvent = DragEvent;
52
+ type GlobalFocusEvent = FocusEvent;
53
+ type GlobalFormDataEvent = FormDataEvent;
54
+ type GlobalInputEvent = InputEvent;
55
+ type GlobalKeyboardEvent = KeyboardEvent;
56
+ type GlobalMouseEvent = MouseEvent;
57
+ type GlobalPointerEvent = PointerEvent;
58
+ type GlobalSubmitEvent = SubmitEvent;
59
+ type GlobalToggleEvent = ToggleEvent;
60
+ type GlobalTouchEvent = TouchEvent;
61
+ type GlobalTransitionEvent = TransitionEvent;
62
+ type GlobalUIEvent = UIEvent;
63
+ type GlobalWheelEvent = WheelEvent;
64
+
65
+ type BaseTypedEvent<E, C, T> = E & {
66
+ currentTarget: C;
67
+ target: T;
68
+ };
69
+
70
+ type TypedEvent<E, T> = BaseTypedEvent<E, EventTarget & T, EventTarget>;
71
+ type TypedTargetEvent<E, T> = BaseTypedEvent<E, EventTarget & T, EventTarget & T>;
72
+
73
+ type EventHandler<E> = ( e: E ) => void;
74
+
75
+ export namespace Leaner {
76
+ type Event<T = Element> = TypedEvent<GlobalEvent, T>;
77
+ type AnimationEvent<T = Element> = TypedEvent<GlobalAnimationEvent, T>;
78
+ type ClipboardEvent<T = Element> = TypedEvent<GlobalClipboardEvent, T>;
79
+ type CompositionEvent<T = Element> = TypedEvent<GlobalCompositionEvent, T>;
80
+ type DragEvent<T = Element> = TypedEvent<GlobalDragEvent, T>;
81
+ type FocusEvent<T = Element> = TypedEvent<GlobalFocusEvent, T>;
82
+ type FormDataEvent<T = Element> = TypedEvent<GlobalFormDataEvent, T>;
83
+ type InputEvent<T = Element> = TypedEvent<GlobalInputEvent, T>;
84
+ type KeyboardEvent<T = Element> = TypedEvent<GlobalKeyboardEvent, T>;
85
+ type MouseEvent<T = Element> = TypedEvent<GlobalMouseEvent, T>;
86
+ type PointerEvent<T = Element> = TypedEvent<GlobalPointerEvent, T>;
87
+ type ToggleEvent<T = Element> = TypedEvent<GlobalToggleEvent, T>;
88
+ type TouchEvent<T = Element> = TypedEvent<GlobalTouchEvent, T>;
89
+ type TransitionEvent<T = Element> = TypedEvent<GlobalTransitionEvent, T>;
90
+ type UIEvent<T = Element> = TypedEvent<GlobalUIEvent, T>;
91
+ type WheelEvent<T = Element> = TypedEvent<GlobalWheelEvent, T>;
92
+
93
+ type TargetEvent<T = Element> = TypedTargetEvent<GlobalEvent, T>;
94
+ type FocusTargetEvent<T = Element> = TypedTargetEvent<GlobalFocusEvent, T>;
95
+
96
+ interface HTMLProps<T = HTMLElement> {
97
+ accesskey?: Prop<string>;
98
+ autocapitalize?: Prop<'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters'>;
99
+ autofocus?: BooleanProp;
100
+ class?: ClassProp;
101
+ contenteditable?: Prop<'true' | 'false' | 'plaintext-only'>;
102
+ dir?: Prop<'ltr' | 'rtl' | 'auto'>;
103
+ draggable?: Prop<'true' | 'false'>;
104
+ enterkeyhint?: Prop<'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'>;
105
+ exportparts?: Prop<string>;
106
+ hidden?: BooleanProp;
107
+ id?: Prop<string>;
108
+ inert?: BooleanProp;
109
+ inputmode?: Prop<'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'>;
110
+ is?: Prop<string>;
111
+ itemid?: Prop<string>;
112
+ itemprop?: Prop<string>;
113
+ itemref?: Prop<string>;
114
+ itemscope?: BooleanProp;
115
+ itemtype?: Prop<string>;
116
+ lang?: Prop<string>;
117
+ nonce?: Prop<string>;
118
+ part?: Prop<string>;
119
+ role?: Prop<'alert' | 'alertdialog' | 'application' | 'article' | 'banner' | 'button' | 'cell' | 'checkbox' | 'columnheader' | 'combobox' | 'complementary' | 'contentinfo'
120
+ | 'definition' | 'dialog' | 'directory' | 'document' | 'feed' | 'figure' | 'form' | 'grid' | 'gridcell' | 'group' | 'heading' | 'img' | 'link' | 'list' | 'listbox'
121
+ | 'listitem' | 'log' | 'main' | 'marquee' | 'math' | 'menu' | 'menubar' | 'menuitem' | 'menuitemcheckbox' | 'menuitemradio' | 'navigation' | 'none' | 'note' | 'option'
122
+ | 'presentation' | 'progressbar' | 'radio' | 'radiogroup' | 'region' | 'row' | 'rowgroup' | 'rowheader' | 'scrollbar' | 'search' | 'searchbox' | 'separator' | 'slider'
123
+ | 'spinbutton' | 'status' | 'switch' | 'tab' | 'table' | 'tablist' | 'tabpanel' | 'term' | 'textbox' | 'timer' | 'toolbar' | 'tooltip' | 'tree' | 'treegrid' | 'treeitem'>;
124
+ slot?: Prop<string>;
125
+ spellcheck?: Prop<'true' | 'false'>;
126
+ style?: StyleProp;
127
+ tabindex?: Prop<number>;
128
+ title?: Prop<string>;
129
+ translate?: Prop<'yes' | 'no'>;
130
+
131
+ 'aria-activedescendant'?: Prop<string>;
132
+ 'aria-atomic'?: Prop<'true' | 'false'>;
133
+ 'aria-autocomplete'?: Prop<'none' | 'inline' | 'list' | 'both'>;
134
+ 'aria-braillelabel'?: Prop<string>;
135
+ 'aria-brailleroledescription'?: Prop<string>;
136
+ 'aria-busy'?: Prop<'true' | 'false'>;
137
+ 'aria-checked'?: Prop<'true' | 'false' | 'mixed'>;
138
+ 'aria-colcount'?: Prop<number>;
139
+ 'aria-colindex'?: Prop<number>;
140
+ 'aria-colindextext'?: Prop<string>;
141
+ 'aria-colspan'?: Prop<number>;
142
+ 'aria-controls'?: Prop<string>;
143
+ 'aria-current'?: Prop<'true' | 'false' | 'page' | 'step' | 'location' | 'date' | 'time'>;
144
+ 'aria-describedby'?: Prop<string>;
145
+ 'aria-description'?: Prop<string>;
146
+ 'aria-details'?: Prop<string>;
147
+ 'aria-disabled'?: Prop<'true' | 'false'>;
148
+ 'aria-errormessage'?: Prop<string>;
149
+ 'aria-expanded'?: Prop<'true' | 'false'>;
150
+ 'aria-flowto'?: Prop<string>;
151
+ 'aria-haspopup'?: Prop<'true' | 'false' | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog'>;
152
+ 'aria-hidden'?: Prop<'true' | 'false'>;
153
+ 'aria-invalid'?: Prop<'true' | 'false' | 'grammar' | 'spelling'>;
154
+ 'aria-keyshortcuts'?: Prop<string>;
155
+ 'aria-label'?: Prop<string>;
156
+ 'aria-labelledby'?: Prop<string>;
157
+ 'aria-level'?: Prop<number>;
158
+ 'aria-live'?: Prop<'off' | 'assertive' | 'polite'>;
159
+ 'aria-modal'?: Prop<'true' | 'false'>;
160
+ 'aria-multiline'?: Prop<'true' | 'false'>;
161
+ 'aria-multiselectable'?: Prop<'true' | 'false'>;
162
+ 'aria-orientation'?: Prop<'horizontal' | 'vertical'>;
163
+ 'aria-owns'?: Prop<string>;
164
+ 'aria-placeholder'?: Prop<string>;
165
+ 'aria-posinset'?: Prop<number>;
166
+ 'aria-pressed'?: Prop<'true' | 'false' | 'mixed'>;
167
+ 'aria-readonly'?: Prop<'true' | 'false'>;
168
+ 'aria-relevant'?: Prop<'additions' | 'additions removals' | 'additions text' | 'all' | 'removals' | 'removals additions' | 'removals text' | 'text' | 'text additions' | 'text removals'>;
169
+ 'aria-required'?: Prop<'true' | 'false'>;
170
+ 'aria-roledescription'?: Prop<string>;
171
+ 'aria-rowcount'?: Prop<number>;
172
+ 'aria-rowindex'?: Prop<number>;
173
+ 'aria-rowindextext'?: Prop<string>;
174
+ 'aria-rowspan'?: Prop<number>;
175
+ 'aria-selected'?: Prop<'true' | 'false'>;
176
+ 'aria-setsize'?: Prop<number>;
177
+ 'aria-sort'?: Prop<'none' | 'ascending' | 'descending' | 'other'>;
178
+ 'aria-valuemax'?: Prop<number>;
179
+ 'aria-valuemin'?: Prop<number>;
180
+ 'aria-valuenow'?: Prop<number>;
181
+ 'aria-valuetext'?: Prop<string>;
182
+
183
+ textContent?: Prop<string>;
184
+ innerHTML?: Prop<string>;
185
+
186
+ ref?: ( value: T | null ) => void;
187
+
188
+ onabort?: EventHandler<Event<T>>;
189
+ onanimationend?: EventHandler<AnimationEvent<T>>;
190
+ onanimationiteration?: EventHandler<AnimationEvent<T>>;
191
+ onanimationstart?: EventHandler<AnimationEvent<T>>;
192
+ onauxclick?: EventHandler<MouseEvent<T>>;
193
+ onbeforeinput?: EventHandler<InputEvent<T>>;
194
+ onblur?: EventHandler<FocusTargetEvent<T>>;
195
+ oncancel?: EventHandler<Event<T>>;
196
+ oncanplay?: EventHandler<Event<T>>;
197
+ oncanplaythrough?: EventHandler<Event<T>>;
198
+ onchange?: EventHandler<Event<T>>;
199
+ onclick?: EventHandler<PointerEvent<T>>;
200
+ onclose?: EventHandler<Event<T>>;
201
+ oncompositionend?: EventHandler<CompositionEvent<T>>;
202
+ oncompositionstart?: EventHandler<CompositionEvent<T>>;
203
+ oncompositionupdate?: EventHandler<CompositionEvent<T>>;
204
+ oncontextmenu?: EventHandler<PointerEvent<T>>;
205
+ oncopy?: EventHandler<ClipboardEvent<T>>;
206
+ oncut?: EventHandler<ClipboardEvent<T>>;
207
+ ondblclick?: EventHandler<PointerEvent<T>>;
208
+ ondrag?: EventHandler<DragEvent<T>>;
209
+ ondragend?: EventHandler<DragEvent<T>>;
210
+ ondragenter?: EventHandler<DragEvent<T>>;
211
+ ondragleave?: EventHandler<DragEvent<T>>;
212
+ ondragover?: EventHandler<DragEvent<T>>;
213
+ ondragstart?: EventHandler<DragEvent<T>>;
214
+ ondrop?: EventHandler<DragEvent<T>>;
215
+ ondurationchange?: EventHandler<Event<T>>;
216
+ onemptied?: EventHandler<Event<T>>;
217
+ onencrypted?: EventHandler<Event<T>>;
218
+ onended?: EventHandler<Event<T>>;
219
+ onerror?: EventHandler<UIEvent<T>>;
220
+ onfocus?: EventHandler<FocusTargetEvent<T>>;
221
+ onfocusin?: EventHandler<FocusEvent<T>>;
222
+ onfocusout?: EventHandler<FocusEvent<T>>;
223
+ onformdata?: EventHandler<FormDataEvent<T>>;
224
+ ongotpointercapture?: EventHandler<PointerEvent<T>>;
225
+ oninput?: EventHandler<InputEvent<T>>;
226
+ oninvalid?: EventHandler<Event<T>>;
227
+ onkeydown?: EventHandler<KeyboardEvent<T>>;
228
+ onkeyup?: EventHandler<KeyboardEvent<T>>;
229
+ onload?: EventHandler<UIEvent<T>>;
230
+ onloadeddata?: EventHandler<UIEvent<T>>;
231
+ onloadedmetadata?: EventHandler<UIEvent<T>>;
232
+ onloadstart?: EventHandler<UIEvent<T>>;
233
+ onlostpointercapture?: EventHandler<PointerEvent<T>>;
234
+ onmousedown?: EventHandler<MouseEvent<T>>;
235
+ onmouseenter?: EventHandler<MouseEvent<T>>;
236
+ onmouseleave?: EventHandler<MouseEvent<T>>;
237
+ onmousemove?: EventHandler<MouseEvent<T>>;
238
+ onmouseout?: EventHandler<MouseEvent<T>>;
239
+ onmouseover?: EventHandler<MouseEvent<T>>;
240
+ onmouseup?: EventHandler<MouseEvent<T>>;
241
+ onpaste?: EventHandler<ClipboardEvent<T>>;
242
+ onpause?: EventHandler<Event<T>>;
243
+ onplay?: EventHandler<Event<T>>;
244
+ onplaying?: EventHandler<Event<T>>;
245
+ onpointercancel?: EventHandler<PointerEvent<T>>;
246
+ onpointerdown?: EventHandler<PointerEvent<T>>;
247
+ onpointerenter?: EventHandler<PointerEvent<T>>;
248
+ onpointerleave?: EventHandler<PointerEvent<T>>;
249
+ onpointermove?: EventHandler<PointerEvent<T>>;
250
+ onpointerout?: EventHandler<PointerEvent<T>>;
251
+ onpointerover?: EventHandler<PointerEvent<T>>;
252
+ onpointerup?: EventHandler<PointerEvent<T>>;
253
+ onprogress?: EventHandler<Event<T>>;
254
+ onratechange?: EventHandler<Event<T>>;
255
+ onreset?: EventHandler<Event<T>>;
256
+ onresize?: EventHandler<Event<T>>;
257
+ onseeked?: EventHandler<Event<T>>;
258
+ onseeking?: EventHandler<Event<T>>;
259
+ onscroll?: EventHandler<Event<T>>;
260
+ onscrollend?: EventHandler<Event<T>>;
261
+ onselect?: EventHandler<Event<T>>;
262
+ onselectionchange?: EventHandler<Event<T>>;
263
+ onstalled?: EventHandler<Event<T>>;
264
+ onsubmit?: EventHandler<SubmitEvent<T>>;
265
+ onsuspend?: EventHandler<Event<T>>;
266
+ ontimeupdate?: EventHandler<Event<T>>;
267
+ ontoggle?: EventHandler<ToggleEvent<T>>;
268
+ ontouchcancel?: EventHandler<TouchEvent<T>>;
269
+ ontouchend?: EventHandler<TouchEvent<T>>;
270
+ ontouchmove?: EventHandler<TouchEvent<T>>;
271
+ ontouchstart?: EventHandler<TouchEvent<T>>;
272
+ ontransitioncancel?: EventHandler<TransitionEvent<T>>;
273
+ ontransitionend?: EventHandler<TransitionEvent<T>>;
274
+ ontransitionrun?: EventHandler<TransitionEvent<T>>;
275
+ ontransitionstart?: EventHandler<TransitionEvent<T>>;
276
+ onvolumechange?: EventHandler<Event<T>>;
277
+ onwaiting?: EventHandler<Event<T>>;
278
+ onwaitingforkey?: EventHandler<Event<T>>;
279
+ onwheel?: EventHandler<WheelEvent<T>>;
280
+ }
281
+
282
+ interface HTMLAnchorProps extends HTMLProps<HTMLAnchorElement> {
283
+ download?: Prop<string>;
284
+ href?: Prop<string>;
285
+ hreflang?: Prop<string>;
286
+ media?: Prop<string>;
287
+ ping?: Prop<string>;
288
+ referrerpolicy?: ReferrerPolicyProp;
289
+ rel?: Prop<string>;
290
+ target?: Prop<string>;
291
+ type?: Prop<string>;
292
+ }
293
+
294
+ interface HTMLAreaProps extends HTMLProps<HTMLAreaElement> {
295
+ alt?: Prop<string>;
296
+ coords?: Prop<string>;
297
+ download?: Prop<string>;
298
+ href?: Prop<string>;
299
+ ping?: Prop<string>;
300
+ referrerpolicy?: ReferrerPolicyProp;
301
+ rel?: Prop<string>;
302
+ shape?: Prop<string>;
303
+ target?: Prop<string>;
304
+ }
305
+
306
+ interface HTMLAudioProps extends HTMLProps<HTMLAudioElement> {
307
+ autoplay?: BooleanProp;
308
+ controls?: BooleanProp;
309
+ controlslist?: Prop<string>;
310
+ crossorigin?: Prop<'anonymous' | 'use-credentials'>;
311
+ loading?: Prop<'eager' | 'lazy'>;
312
+ loop?: BooleanProp;
313
+ muted?: BooleanProp;
314
+ preload?: Prop<'none' | 'metadata' | 'auto'>;
315
+ src?: Prop<string>;
316
+ }
317
+
318
+ interface HTMLBaseProps extends HTMLProps<HTMLBaseElement> {
319
+ href?: Prop<string>;
320
+ target?: Prop<string>;
321
+ }
322
+
323
+ interface HTMLButtonProps extends HTMLProps<HTMLButtonElement> {
324
+ autofocus?: BooleanProp;
325
+ disabled?: BooleanProp;
326
+ form?: Prop<string>;
327
+ formaction?: Prop<string>;
328
+ formenctype?: Prop<string>;
329
+ formmethod?: Prop<string>;
330
+ formnovalidate?: BooleanProp;
331
+ formtarget?: Prop<string>;
332
+ name?: Prop<string>;
333
+ type?: Prop<'submit' | 'reset' | 'button'>;
334
+ value?: Prop<string>;
335
+ }
336
+
337
+ interface HTMLCanvasProps extends HTMLProps<HTMLCanvasElement> {
338
+ height?: Prop<number>;
339
+ width?: Prop<number>;
340
+ }
341
+
342
+ interface HTMLDataProps extends HTMLProps<HTMLDataElement> {
343
+ value?: Prop<string>;
344
+ }
345
+
346
+ interface HTMLDetailsProps extends HTMLProps<HTMLDetailsElement> {
347
+ name?: Prop<string>;
348
+ open?: BooleanProp;
349
+ }
350
+
351
+ interface HTMLDialogProps extends HTMLProps<HTMLDialogElement> {
352
+ closedby?: Prop<'any' | 'closerequest' | 'none'>;
353
+ open?: BooleanProp;
354
+ }
355
+
356
+ interface HTMLEmbedProps extends HTMLProps<HTMLEmbedElement> {
357
+ height?: Prop<number>;
358
+ src?: Prop<string>;
359
+ type?: Prop<string>;
360
+ width?: Prop<number>;
361
+ }
362
+
363
+ interface HTMLFieldSetProps extends HTMLProps<HTMLFieldSetElement> {
364
+ disabled?: BooleanProp;
365
+ form?: Prop<string>;
366
+ name?: Prop<string>;
367
+ }
368
+
369
+ interface HTMLFormProps extends HTMLProps<HTMLFormElement> {
370
+ 'accept-charset'?: Prop<string>;
371
+ action?: Prop<string>;
372
+ autocomplete?: Prop<'on' | 'off'>;
373
+ enctype?: Prop<string>;
374
+ method?: Prop<string>;
375
+ name?: Prop<string>;
376
+ novalidate?: BooleanProp;
377
+ rel?: Prop<string>;
378
+ target?: Prop<string>;
379
+ }
380
+
381
+ interface HTMLIFrameProps extends HTMLProps<HTMLIFrameElement> {
382
+ allow?: Prop<string>;
383
+ allowfullscreen?: BooleanProp;
384
+ height?: Prop<number>;
385
+ loading?: Prop<'eager' | 'lazy'>;
386
+ name?: Prop<string>;
387
+ referrerpolicy?: ReferrerPolicyProp;
388
+ sandbox?: Prop<string>;
389
+ src?: Prop<string>;
390
+ srcdoc?: Prop<string>;
391
+ width?: Prop<number>;
392
+ }
393
+
394
+ interface HTMLImageProps extends HTMLProps<HTMLImageElement> {
395
+ alt?: Prop<string>;
396
+ crossorigin?: Prop<'anonymous' | 'use-credentials'>;
397
+ decoding?: Prop<'sync' | 'async' | 'auto'>;
398
+ fetchpriority?: Prop<'high' | 'low' | 'auto'>;
399
+ height?: Prop<number>;
400
+ ismap?: BooleanProp;
401
+ loading?: Prop<'eager' | 'lazy'>;
402
+ referrerpolicy?: ReferrerPolicyProp;
403
+ sizes?: Prop<string>;
404
+ src?: Prop<string>;
405
+ srcset?: Prop<string>;
406
+ usemap?: Prop<string>;
407
+ width?: Prop<number>;
408
+ }
409
+
410
+ interface HTMLInputProps extends HTMLProps<HTMLInputElement> {
411
+ accept?: Prop<string>;
412
+ alt?: Prop<string>;
413
+ autocomplete?: Prop<'on' | 'off'>;
414
+ autofocus?: BooleanProp;
415
+ checked?: Prop<boolean>;
416
+ dirname?: Prop<string>;
417
+ disabled?: BooleanProp;
418
+ form?: Prop<string>;
419
+ formaction?: Prop<string>;
420
+ formenctype?: Prop<string>;
421
+ formmethod?: Prop<string>;
422
+ formnovalidate?: BooleanProp;
423
+ formtarget?: Prop<string>;
424
+ height?: Prop<number>;
425
+ inputmode?: Prop<'none' | 'text' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search'>;
426
+ list?: Prop<string>;
427
+ max?: Prop<number | string>;
428
+ maxlength?: Prop<number>;
429
+ min?: Prop<number | string>;
430
+ minlength?: Prop<number>;
431
+ multiple?: BooleanProp;
432
+ name?: Prop<string>;
433
+ pattern?: Prop<string>;
434
+ placeholder?: Prop<string>;
435
+ readonly?: BooleanProp;
436
+ required?: BooleanProp;
437
+ size?: Prop<number>;
438
+ src?: Prop<string>;
439
+ step?: Prop<number | 'any'>;
440
+ type?: Prop<'button' | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'file' | 'hidden' | 'image' | 'month' | 'number' | 'password' | 'radio' | 'range'
441
+ | 'reset' | 'search' | 'submit' | 'tel' | 'text' | 'time' | 'url' | 'week'>;
442
+ value?: Prop<string>;
443
+ width?: Prop<number>;
444
+
445
+ onchange?: EventHandler<TargetEvent<HTMLInputElement>>;
446
+ }
447
+
448
+ interface HTMLLabelProps extends HTMLProps<HTMLLabelElement> {
449
+ for?: Prop<string>;
450
+ }
451
+
452
+ interface HTMLLIProps extends HTMLProps<HTMLLIElement> {
453
+ value?: Prop<number>;
454
+ }
455
+
456
+ interface HTMLLinkProps extends HTMLProps<HTMLLinkElement> {
457
+ as?: Prop<string>;
458
+ blocking?: Prop<'render'>;
459
+ crossorigin?: Prop<'anonymous' | 'use-credentials'>;
460
+ disabled?: BooleanProp;
461
+ fetchpriority?: Prop<'high' | 'low' | 'auto'>;
462
+ href?: Prop<string>;
463
+ hreflang?: Prop<string>;
464
+ imagesizes?: Prop<string>;
465
+ imagesrcset?: Prop<string>;
466
+ integrity?: Prop<string>;
467
+ media?: Prop<string>;
468
+ referrerpolicy?: ReferrerPolicyProp;
469
+ rel?: Prop<string>;
470
+ sizes?: Prop<string>;
471
+ type?: Prop<string>;
472
+ }
473
+
474
+ interface HTMLMapProps extends HTMLProps<HTMLMapElement> {
475
+ name?: Prop<string>;
476
+ }
477
+
478
+ interface HTMLMetaProps extends HTMLProps<HTMLMetaElement> {
479
+ charset?: Prop<string>;
480
+ content?: Prop<string>;
481
+ 'http-equiv'?: Prop<string>;
482
+ media?: Prop<string>;
483
+ name?: Prop<string>;
484
+ }
485
+
486
+ interface HTMLMeterProps extends HTMLProps<HTMLMeterElement> {
487
+ high?: Prop<number>;
488
+ low?: Prop<number>;
489
+ max?: Prop<number>;
490
+ min?: Prop<number>;
491
+ optimium?: Prop<number>;
492
+ value?: Prop<number>;
493
+ }
494
+
495
+ interface HTMLModProps extends HTMLProps<HTMLModElement> {
496
+ cite?: Prop<string>;
497
+ datetime?: Prop<string>;
498
+ }
499
+
500
+ interface HTMLObjectProps extends HTMLProps<HTMLObjectElement> {
501
+ data?: Prop<string>;
502
+ form?: Prop<string>;
503
+ height?: Prop<number>;
504
+ name?: Prop<string>;
505
+ type?: Prop<string>;
506
+ width?: Prop<number>;
507
+ }
508
+
509
+ interface HTMLLOListProps extends HTMLProps<HTMLOListElement> {
510
+ reversed?: BooleanProp;
511
+ start?: Prop<number>;
512
+ type?: Prop<string>;
513
+ }
514
+
515
+ interface HTMLOptGroupProps extends HTMLProps<HTMLOptGroupElement> {
516
+ disabled?: BooleanProp;
517
+ label?: Prop<string>;
518
+ }
519
+
520
+ interface HTMLOptionProps extends HTMLProps<HTMLOptionElement> {
521
+ disabled?: BooleanProp;
522
+ label?: Prop<string>;
523
+ selected?: BooleanProp;
524
+ value?: Prop<string>;
525
+ }
526
+
527
+ interface HTMLOutputProps extends HTMLProps<HTMLOutputElement> {
528
+ for?: Prop<string>;
529
+ form?: Prop<string>;
530
+ name?: Prop<string>;
531
+ }
532
+
533
+ interface HTMLProgressProps extends HTMLProps<HTMLProgressElement> {
534
+ max?: Prop<number>;
535
+ value?: Prop<number>;
536
+ }
537
+
538
+ interface HTMLQuoteProps extends HTMLProps<HTMLQuoteElement> {
539
+ cite?: Prop<string>;
540
+ }
541
+
542
+ interface HTMLScriptProps extends HTMLProps<HTMLScriptElement> {
543
+ async?: BooleanProp;
544
+ blocking?: Prop<'render'>;
545
+ crossorigin?: Prop<'anonymous' | 'use-credentials'>;
546
+ defer?: BooleanProp;
547
+ fetchpriority?: Prop<'high' | 'low' | 'auto'>;
548
+ integrity?: Prop<string>;
549
+ nomodule?: BooleanProp;
550
+ referrerpolicy?: ReferrerPolicyProp;
551
+ src?: Prop<string>;
552
+ type?: Prop<string>;
553
+ }
554
+
555
+ interface HTMLSelectProps extends HTMLProps<HTMLSelectElement> {
556
+ autocomplete?: Prop<'on' | 'off'>;
557
+ autofocus?: BooleanProp;
558
+ disabled?: BooleanProp;
559
+ form?: Prop<string>;
560
+ multiple?: BooleanProp;
561
+ name?: Prop<string>;
562
+ required?: BooleanProp;
563
+ size?: Prop<number>;
564
+ value?: Prop<string>;
565
+
566
+ onchange?: EventHandler<TargetEvent<HTMLSelectElement>>;
567
+ }
568
+
569
+ interface HTMLSlotProps extends HTMLProps<HTMLSlotElement> {
570
+ name?: Prop<string>;
571
+ }
572
+
573
+ interface HTMLSourceProps extends HTMLProps<HTMLSourceElement> {
574
+ height?: Prop<number>;
575
+ media?: Prop<string>;
576
+ sizes?: Prop<string>;
577
+ src?: Prop<string>;
578
+ srcset?: Prop<string>;
579
+ type?: Prop<string>;
580
+ width?: Prop<number>;
581
+ }
582
+
583
+ interface HTMLStyleProps extends HTMLProps<HTMLStyleElement> {
584
+ blocking?: Prop<'render'>;
585
+ media?: Prop<string>;
586
+ }
587
+
588
+ interface HTMLTableColProps extends HTMLProps<HTMLTableColElement> {
589
+ span?: Prop<number>;
590
+ }
591
+
592
+ interface HTMLTableCellProps extends HTMLProps<HTMLTableCellElement> {
593
+ colspan?: Prop<number>;
594
+ headers?: Prop<string>;
595
+ rowspan?: Prop<number>;
596
+ }
597
+
598
+ interface HTMLTableCellHeaderProps extends HTMLProps<HTMLTableCellElement> {
599
+ abbr?: Prop<string>;
600
+ colspan?: Prop<number>;
601
+ headers?: Prop<string>;
602
+ rowspan?: Prop<number>;
603
+ scope?: Prop<'row' | 'col' | 'rowgroup' | 'colgroup'>;
604
+ }
605
+
606
+ interface HTMLTextAreaProps extends HTMLProps<HTMLTextAreaElement> {
607
+ autocomplete?: Prop<'on' | 'off'>;
608
+ autofocus?: BooleanProp;
609
+ cols?: Prop<number>;
610
+ dirname?: Prop<string>;
611
+ disabled?: BooleanProp;
612
+ form?: Prop<string>;
613
+ maxlength?: Prop<number>;
614
+ minlength?: Prop<number>;
615
+ name?: Prop<string>;
616
+ placeholder?: Prop<string>;
617
+ readonly?: BooleanProp;
618
+ required?: BooleanProp;
619
+ rows?: Prop<number>;
620
+ wrap?: Prop<'hard' | 'soft'>;
621
+ value?: Prop<string>;
622
+
623
+ onchange?: EventHandler<TargetEvent<HTMLTextAreaElement>>;
624
+ }
625
+
626
+ interface HTMLTimeProps extends HTMLProps<HTMLTimeElement> {
627
+ datetime?: Prop<string>;
628
+ }
629
+
630
+ interface HTMLTrackProps extends HTMLProps<HTMLTrackElement> {
631
+ default?: BooleanProp;
632
+ kind?: Prop<string>;
633
+ label?: Prop<string>;
634
+ src?: Prop<string>;
635
+ srclang?: Prop<string>;
636
+ }
637
+
638
+ interface HTMLVideoProps extends HTMLProps<HTMLVideoElement> {
639
+ autoplay?: BooleanProp;
640
+ controls?: BooleanProp;
641
+ controlslist?: Prop<string>;
642
+ crossorigin?: Prop<'anonymous' | 'use-credentials'>;
643
+ height?: Prop<number>;
644
+ loading?: Prop<'eager' | 'lazy'>;
645
+ loop?: BooleanProp;
646
+ muted?: BooleanProp;
647
+ playsinline?: BooleanProp;
648
+ poster?: Prop<string>;
649
+ preload?: Prop<'none' | 'metadata' | 'auto'>;
650
+ src?: Prop<string>;
651
+ width?: Prop<number>;
652
+ }
653
+ }