@praxisjs/jsx 0.6.0 → 0.7.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/src/dom-types.ts CHANGED
@@ -4,8 +4,13 @@ import type { Children } from "@praxisjs/shared";
4
4
  // Primitive helpers
5
5
  // ---------------------------------------------------------------------------
6
6
 
7
- /** A value OR a zero-argument function returning that value (for reactive bindings). */
8
- export type Reactive<T> = T | (() => T);
7
+ /**
8
+ * A value OR a zero-argument function returning that value (for reactive
9
+ * bindings). `null`/`undefined` are always accepted too — both as a static
10
+ * value and as what the function returns — so a prop can be conditionally
11
+ * omitted or cleared (the runtime removes the attribute in that case).
12
+ */
13
+ export type Reactive<T> = T | null | undefined | (() => T | null | undefined);
9
14
 
10
15
  /** Boolean that can also be expressed as its string form for HTML attributes. */
11
16
  export type Booleanish = boolean | "true" | "false";
@@ -109,43 +114,43 @@ export type CSSProperties = {
109
114
 
110
115
  export interface AriaAttributes {
111
116
  /** Identifies the currently active element when DOM focus is on a composite widget, combobox, textbox, group, or application. */
112
- "aria-activedescendant"?: string;
117
+ "aria-activedescendant"?: Reactive<string>;
113
118
  /** Indicates whether assistive technologies will present all, or only parts of, the changed region based on the change notifications defined by the aria-relevant attribute. */
114
119
  "aria-atomic"?: Reactive<Booleanish>;
115
120
  /** Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for a combobox, searchbox, or textbox and specifies how predictions would be presented. */
116
- "aria-autocomplete"?: LiteralUnion<"none" | "inline" | "list" | "both">;
121
+ "aria-autocomplete"?: Reactive<LiteralUnion<"none" | "inline" | "list" | "both">>;
117
122
  /** Indicates an element's "busy" status. */
118
123
  "aria-busy"?: Reactive<Booleanish>;
119
124
  /** Indicates the current "checked" state of checkboxes, radio buttons, and other widgets. */
120
125
  "aria-checked"?: Reactive<Booleanish | LiteralUnion<"mixed">>;
121
126
  /** Defines the total number of columns in a table, grid, or treegrid. */
122
- "aria-colcount"?: number;
127
+ "aria-colcount"?: Reactive<number>;
123
128
  /** Defines an element's column index or position with respect to the total number of columns within a table, grid, or treegrid. */
124
- "aria-colindex"?: number;
129
+ "aria-colindex"?: Reactive<number>;
125
130
  /** Defines a human readable text alternative of aria-colindex. */
126
- "aria-colindextext"?: string;
131
+ "aria-colindextext"?: Reactive<string>;
127
132
  /** Defines the number of columns spanned by a cell or gridcell within a table, grid, or treegrid. */
128
- "aria-colspan"?: number;
133
+ "aria-colspan"?: Reactive<number>;
129
134
  /** Identifies the element(s) whose contents or presence are controlled by the current element. */
130
- "aria-controls"?: string;
135
+ "aria-controls"?: Reactive<string>;
131
136
  /** Indicates the element that represents the current item within a container or set of related elements. */
132
137
  "aria-current"?: Reactive<
133
138
  Booleanish | LiteralUnion<"page" | "step" | "location" | "date" | "time">
134
139
  >;
135
140
  /** Identifies the element(s) that describes the object. */
136
- "aria-describedby"?: string;
141
+ "aria-describedby"?: Reactive<string>;
137
142
  /** Defines a string value that describes or annotates the current element. */
138
- "aria-description"?: string;
143
+ "aria-description"?: Reactive<string>;
139
144
  /** Identifies the element that provides a detailed, extended description for the object. */
140
- "aria-details"?: string;
145
+ "aria-details"?: Reactive<string>;
141
146
  /** Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable. */
142
147
  "aria-disabled"?: Reactive<Booleanish>;
143
148
  /** Identifies the element that provides an error message for the current element. */
144
- "aria-errormessage"?: string;
149
+ "aria-errormessage"?: Reactive<string>;
145
150
  /** Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed. */
146
151
  "aria-expanded"?: Reactive<Booleanish>;
147
152
  /** Identifies the next element (or elements) in an alternate reading order of content which, at the user's discretion, allows assistive technology to override the general default of reading in document source order. */
148
- "aria-flowto"?: string;
153
+ "aria-flowto"?: Reactive<string>;
149
154
  /** Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an element. */
150
155
  "aria-haspopup"?: Reactive<
151
156
  Booleanish | LiteralUnion<"menu" | "listbox" | "tree" | "grid" | "dialog">
@@ -155,13 +160,13 @@ export interface AriaAttributes {
155
160
  /** Indicates the entered value does not conform to the format expected by the application. */
156
161
  "aria-invalid"?: Reactive<Booleanish | LiteralUnion<"grammar" | "spelling">>;
157
162
  /** Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element. */
158
- "aria-keyshortcuts"?: string;
163
+ "aria-keyshortcuts"?: Reactive<string>;
159
164
  /** Defines a string value that labels the current element. */
160
165
  "aria-label"?: Reactive<string>;
161
166
  /** Identifies the element(s) that labels the current element. */
162
- "aria-labelledby"?: string;
167
+ "aria-labelledby"?: Reactive<string>;
163
168
  /** Defines the hierarchical level of an element within a structure. */
164
- "aria-level"?: number;
169
+ "aria-level"?: Reactive<number>;
165
170
  /** Indicates that an element will be updated, and describes the types of updates the user agents, assistive technologies, and user can expect from the live region. */
166
171
  "aria-live"?: Reactive<LiteralUnion<"off" | "assertive" | "polite">>;
167
172
  /** Indicates whether an element is modal when displayed. */
@@ -171,13 +176,13 @@ export interface AriaAttributes {
171
176
  /** Indicates that the user may select more than one item from the current selectable descendants. */
172
177
  "aria-multiselectable"?: Reactive<Booleanish>;
173
178
  /** Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous. */
174
- "aria-orientation"?: LiteralUnion<"horizontal" | "vertical">;
179
+ "aria-orientation"?: Reactive<LiteralUnion<"horizontal" | "vertical">>;
175
180
  /** Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship between DOM elements where the DOM hierarchy cannot be used to represent the relationship. */
176
- "aria-owns"?: string;
181
+ "aria-owns"?: Reactive<string>;
177
182
  /** Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value. */
178
- "aria-placeholder"?: string;
183
+ "aria-placeholder"?: Reactive<string>;
179
184
  /** Defines an element's number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. */
180
- "aria-posinset"?: number;
185
+ "aria-posinset"?: Reactive<number>;
181
186
  /** Indicates the current "pressed" state of toggle buttons. */
182
187
  "aria-pressed"?: Reactive<Booleanish | LiteralUnion<"mixed">>;
183
188
  /** Indicates that the element is not editable, but is otherwise operable. */
@@ -198,31 +203,31 @@ export interface AriaAttributes {
198
203
  /** Indicates that user input is required on the element before a form may be submitted. */
199
204
  "aria-required"?: Reactive<Booleanish>;
200
205
  /** Defines a human-readable, author-localized description for the role of an element. */
201
- "aria-roledescription"?: string;
206
+ "aria-roledescription"?: Reactive<string>;
202
207
  /** Defines the total number of rows in a table, grid, or treegrid. */
203
- "aria-rowcount"?: number;
208
+ "aria-rowcount"?: Reactive<number>;
204
209
  /** Defines an element's row index or position with respect to the total number of rows within a table, grid, or treegrid. */
205
- "aria-rowindex"?: number;
210
+ "aria-rowindex"?: Reactive<number>;
206
211
  /** Defines a human readable text alternative of aria-rowindex. */
207
- "aria-rowindextext"?: string;
212
+ "aria-rowindextext"?: Reactive<string>;
208
213
  /** Defines the number of rows spanned by a cell or gridcell within a table, grid, or treegrid. */
209
- "aria-rowspan"?: number;
214
+ "aria-rowspan"?: Reactive<number>;
210
215
  /** Indicates the current "selected" state of various widgets. */
211
216
  "aria-selected"?: Reactive<Booleanish>;
212
217
  /** Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. */
213
- "aria-setsize"?: number;
218
+ "aria-setsize"?: Reactive<number>;
214
219
  /** Indicates if items in a table or grid are sorted in ascending or descending order. */
215
- "aria-sort"?: LiteralUnion<"none" | "ascending" | "descending" | "other">;
220
+ "aria-sort"?: Reactive<LiteralUnion<"none" | "ascending" | "descending" | "other">>;
216
221
  /** Defines the maximum allowed value for a range widget. */
217
- "aria-valuemax"?: number;
222
+ "aria-valuemax"?: Reactive<number>;
218
223
  /** Defines the minimum allowed value for a range widget. */
219
- "aria-valuemin"?: number;
224
+ "aria-valuemin"?: Reactive<number>;
220
225
  /** Defines the current value for a range widget. */
221
- "aria-valuenow"?: number;
226
+ "aria-valuenow"?: Reactive<number>;
222
227
  /** Defines the human readable text alternative of aria-valuenow for a range widget. */
223
- "aria-valuetext"?: string;
228
+ "aria-valuetext"?: Reactive<string>;
224
229
  /** Defines the ARIA role of the element. */
225
- role?: LiteralUnion<
230
+ role?: Reactive<LiteralUnion<
226
231
  | "alert"
227
232
  | "alertdialog"
228
233
  | "application"
@@ -294,7 +299,7 @@ export interface AriaAttributes {
294
299
  | "tree"
295
300
  | "treegrid"
296
301
  | "treeitem"
297
- >;
302
+ >>;
298
303
  }
299
304
 
300
305
  // ---------------------------------------------------------------------------
@@ -400,24 +405,29 @@ export interface HTMLAttributes<T extends Element = HTMLElement>
400
405
  title?: Reactive<string>;
401
406
  lang?: Reactive<string>;
402
407
  dir?: Reactive<Dir>;
403
- slot?: string;
404
- accessKey?: string;
408
+ /** Web Components named-slot assignment. */
409
+ slot?: Reactive<string>;
410
+ accessKey?: Reactive<string>;
411
+ /** Content Security Policy nonce. Single-use: browsers blank this out after first read. */
405
412
  nonce?: string;
406
413
  // Visibility / interaction
407
414
  hidden?: Reactive<boolean>;
408
415
  tabIndex?: Reactive<number>;
409
416
  draggable?: Reactive<boolean>;
410
- /** Autofocus on mount (global HTML5 attribute). */
417
+ /**
418
+ * Autofocus on mount (global HTML5 attribute). One-shot by spec — the browser
419
+ * only consults this at insertion time, so it is not reactive.
420
+ */
411
421
  autoFocus?: boolean;
412
422
  contentEditable?: Reactive<Booleanish | LiteralUnion<"inherit" | "plaintext-only">>;
413
423
  spellcheck?: Reactive<Booleanish>;
414
- translate?: LiteralUnion<"yes" | "no">;
424
+ translate?: Reactive<LiteralUnion<"yes" | "no">>;
415
425
  /** Marks the element as inert — blocks all user interaction and assistive technology. */
416
426
  inert?: Reactive<boolean>;
417
427
  /** Declares the element as a popover. Use `"auto"` (default, light-dismiss) or `"manual"`. */
418
- popover?: boolean | LiteralUnion<"auto" | "manual">;
428
+ popover?: Reactive<boolean | LiteralUnion<"auto" | "manual">>;
419
429
  /** CSS `::part()` export list for shadow DOM styling. */
420
- part?: string;
430
+ part?: Reactive<string>;
421
431
  // Input hints
422
432
  inputMode?: Reactive<InputMode>;
423
433
  enterKeyHint?: Reactive<EnterKeyHint>;
@@ -426,12 +436,15 @@ export interface HTMLAttributes<T extends Element = HTMLElement>
426
436
  // Raw HTML injection
427
437
  innerHTML?: Reactive<string>;
428
438
  // Micro-data
429
- itemID?: string;
430
- itemProp?: string;
431
- itemRef?: string;
432
- itemScope?: boolean;
433
- itemType?: string;
434
- // Custom elements
439
+ itemID?: Reactive<string>;
440
+ itemProp?: Reactive<string>;
441
+ itemRef?: Reactive<string>;
442
+ itemScope?: Reactive<boolean>;
443
+ itemType?: Reactive<string>;
444
+ /**
445
+ * Customized built-in element name (`is="my-button"`). Fixed at
446
+ * `document.createElement(tag, { is })` time — cannot change post-construction.
447
+ */
435
448
  is?: string;
436
449
  // JSX internals
437
450
  key?: string | number | symbol;
@@ -450,14 +463,14 @@ export interface HTMLAttributes<T extends Element = HTMLElement>
450
463
  export interface BaseHTMLAttributes<
451
464
  T extends HTMLBaseElement = HTMLBaseElement,
452
465
  > extends HTMLAttributes<T> {
453
- href?: string;
454
- target?: LinkTarget;
466
+ href?: Reactive<string>;
467
+ target?: Reactive<LinkTarget>;
455
468
  }
456
469
 
457
470
  export interface LinkHTMLAttributes<
458
471
  T extends HTMLLinkElement = HTMLLinkElement,
459
472
  > extends HTMLAttributes<T> {
460
- as?: LiteralUnion<
473
+ as?: Reactive<LiteralUnion<
461
474
  | "audio"
462
475
  | "document"
463
476
  | "embed"
@@ -470,49 +483,49 @@ export interface LinkHTMLAttributes<
470
483
  | "track"
471
484
  | "video"
472
485
  | "worker"
473
- >;
474
- crossOrigin?: CrossOrigin;
475
- href?: string;
476
- hrefLang?: string;
477
- integrity?: string;
478
- media?: string;
479
- referrerPolicy?: ReferrerPolicy;
480
- rel?: string;
481
- sizes?: string;
482
- type?: string;
483
- charSet?: string;
486
+ >>;
487
+ crossOrigin?: Reactive<CrossOrigin>;
488
+ href?: Reactive<string>;
489
+ hrefLang?: Reactive<string>;
490
+ integrity?: Reactive<string>;
491
+ media?: Reactive<string>;
492
+ referrerPolicy?: Reactive<ReferrerPolicy>;
493
+ rel?: Reactive<string>;
494
+ sizes?: Reactive<string>;
495
+ type?: Reactive<string>;
496
+ charSet?: Reactive<string>;
484
497
  }
485
498
 
486
499
  export interface MetaHTMLAttributes<
487
500
  T extends HTMLMetaElement = HTMLMetaElement,
488
501
  > extends HTMLAttributes<T> {
489
- charSet?: string;
490
- content?: string;
491
- httpEquiv?: string;
492
- name?: string;
493
- media?: string;
502
+ charSet?: Reactive<string>;
503
+ content?: Reactive<string>;
504
+ httpEquiv?: Reactive<string>;
505
+ name?: Reactive<string>;
506
+ media?: Reactive<string>;
494
507
  }
495
508
 
496
509
  export interface ScriptHTMLAttributes<
497
510
  T extends HTMLScriptElement = HTMLScriptElement,
498
511
  > extends HTMLAttributes<T> {
499
- async?: boolean;
500
- crossOrigin?: CrossOrigin;
501
- defer?: boolean;
502
- integrity?: string;
503
- noModule?: boolean;
504
- referrerPolicy?: ReferrerPolicy;
505
- src?: string;
506
- type?: string;
507
- charSet?: string;
512
+ async?: Reactive<boolean>;
513
+ crossOrigin?: Reactive<CrossOrigin>;
514
+ defer?: Reactive<boolean>;
515
+ integrity?: Reactive<string>;
516
+ noModule?: Reactive<boolean>;
517
+ referrerPolicy?: Reactive<ReferrerPolicy>;
518
+ src?: Reactive<string>;
519
+ type?: Reactive<string>;
520
+ charSet?: Reactive<string>;
508
521
  }
509
522
 
510
523
  export interface StyleHTMLAttributes<
511
524
  T extends HTMLStyleElement = HTMLStyleElement,
512
525
  > extends HTMLAttributes<T> {
513
- media?: string;
514
- scoped?: boolean;
515
- type?: string;
526
+ media?: Reactive<string>;
527
+ scoped?: Reactive<boolean>;
528
+ type?: Reactive<string>;
516
529
  }
517
530
 
518
531
  // --- Sectioning / grouping ---
@@ -520,26 +533,26 @@ export interface StyleHTMLAttributes<
520
533
  export interface BlockquoteHTMLAttributes<
521
534
  T extends HTMLQuoteElement = HTMLQuoteElement,
522
535
  > extends HTMLAttributes<T> {
523
- cite?: string;
536
+ cite?: Reactive<string>;
524
537
  }
525
538
 
526
539
  export interface OlHTMLAttributes<
527
540
  T extends HTMLOListElement = HTMLOListElement,
528
541
  > extends HTMLAttributes<T> {
529
- reversed?: boolean;
530
- start?: number;
531
- type?: LiteralUnion<"1" | "a" | "A" | "i" | "I">;
542
+ reversed?: Reactive<boolean>;
543
+ start?: Reactive<number>;
544
+ type?: Reactive<LiteralUnion<"1" | "a" | "A" | "i" | "I">>;
532
545
  }
533
546
 
534
547
  export interface LiHTMLAttributes<T extends HTMLLIElement = HTMLLIElement>
535
548
  extends HTMLAttributes<T> {
536
- value?: number;
549
+ value?: Reactive<number>;
537
550
  }
538
551
 
539
552
  export interface MenuHTMLAttributes<
540
553
  T extends HTMLMenuElement = HTMLMenuElement,
541
554
  > extends HTMLAttributes<T> {
542
- type?: string;
555
+ type?: Reactive<string>;
543
556
  }
544
557
 
545
558
  // --- Text-level ---
@@ -549,13 +562,13 @@ export interface AnchorHTMLAttributes<
549
562
  > extends HTMLAttributes<T> {
550
563
  download?: Reactive<string | boolean>;
551
564
  href?: Reactive<string>;
552
- hrefLang?: string;
553
- media?: string;
554
- ping?: string;
555
- referrerPolicy?: ReferrerPolicy;
556
- rel?: string;
565
+ hrefLang?: Reactive<string>;
566
+ media?: Reactive<string>;
567
+ ping?: Reactive<string>;
568
+ referrerPolicy?: Reactive<ReferrerPolicy>;
569
+ rel?: Reactive<string>;
557
570
  target?: Reactive<LinkTarget>;
558
- type?: string;
571
+ type?: Reactive<string>;
559
572
  }
560
573
 
561
574
  export interface DataHTMLAttributes<
@@ -575,32 +588,32 @@ export interface TimeHTMLAttributes<
575
588
  export interface ImgHTMLAttributes<
576
589
  T extends HTMLImageElement = HTMLImageElement,
577
590
  > extends HTMLAttributes<T> {
578
- alt?: string;
579
- crossOrigin?: CrossOrigin;
580
- decoding?: Decoding;
591
+ alt?: Reactive<string>;
592
+ crossOrigin?: Reactive<CrossOrigin>;
593
+ decoding?: Reactive<Decoding>;
581
594
  height?: Reactive<number | string>;
582
- loading?: Loading;
583
- referrerPolicy?: ReferrerPolicy;
584
- sizes?: string;
595
+ loading?: Reactive<Loading>;
596
+ referrerPolicy?: Reactive<ReferrerPolicy>;
597
+ sizes?: Reactive<string>;
585
598
  src?: Reactive<string>;
586
599
  srcSet?: Reactive<string>;
587
- useMap?: string;
600
+ useMap?: Reactive<string>;
588
601
  width?: Reactive<number | string>;
589
- fetchPriority?: LiteralUnion<"high" | "low" | "auto">;
602
+ fetchPriority?: Reactive<LiteralUnion<"high" | "low" | "auto">>;
590
603
  }
591
604
 
592
605
  export interface IframeHTMLAttributes<
593
606
  T extends HTMLIFrameElement = HTMLIFrameElement,
594
607
  > extends HTMLAttributes<T> {
595
- allow?: string;
608
+ allow?: Reactive<string>;
596
609
  allowFullScreen?: Reactive<boolean>;
597
610
  height?: Reactive<number | string>;
598
- loading?: Loading;
599
- name?: string;
600
- referrerPolicy?: ReferrerPolicy;
611
+ loading?: Reactive<Loading>;
612
+ name?: Reactive<string>;
613
+ referrerPolicy?: Reactive<ReferrerPolicy>;
601
614
  sandbox?: Reactive<string>;
602
615
  src?: Reactive<string>;
603
- srcDoc?: string;
616
+ srcDoc?: Reactive<string>;
604
617
  title?: Reactive<string>;
605
618
  width?: Reactive<number | string>;
606
619
  }
@@ -610,19 +623,19 @@ export interface EmbedHTMLAttributes<
610
623
  > extends HTMLAttributes<T> {
611
624
  height?: Reactive<number | string>;
612
625
  src?: Reactive<string>;
613
- type?: string;
626
+ type?: Reactive<string>;
614
627
  width?: Reactive<number | string>;
615
628
  }
616
629
 
617
630
  export interface ObjectHTMLAttributes<
618
631
  T extends HTMLObjectElement = HTMLObjectElement,
619
632
  > extends HTMLAttributes<T> {
620
- data?: string;
621
- form?: string;
633
+ data?: Reactive<string>;
634
+ form?: Reactive<string>;
622
635
  height?: Reactive<number | string>;
623
- name?: string;
624
- type?: string;
625
- useMap?: string;
636
+ name?: Reactive<string>;
637
+ type?: Reactive<string>;
638
+ useMap?: Reactive<string>;
626
639
  width?: Reactive<number | string>;
627
640
  }
628
641
 
@@ -630,37 +643,41 @@ export interface SourceHTMLAttributes<
630
643
  T extends HTMLSourceElement = HTMLSourceElement,
631
644
  > extends HTMLAttributes<T> {
632
645
  height?: Reactive<number | string>;
633
- media?: string;
634
- sizes?: string;
646
+ media?: Reactive<string>;
647
+ sizes?: Reactive<string>;
635
648
  src?: Reactive<string>;
636
649
  srcSet?: Reactive<string>;
637
- type?: string;
650
+ type?: Reactive<string>;
638
651
  width?: Reactive<number | string>;
639
652
  }
640
653
 
641
654
  export interface TrackHTMLAttributes<
642
655
  T extends HTMLTrackElement = HTMLTrackElement,
643
656
  > extends HTMLAttributes<T> {
644
- default?: boolean;
645
- kind?: LiteralUnion<
657
+ default?: Reactive<boolean>;
658
+ kind?: Reactive<LiteralUnion<
646
659
  "subtitles" | "captions" | "descriptions" | "chapters" | "metadata"
647
- >;
648
- label?: string;
649
- src?: string;
650
- srcLang?: string;
660
+ >>;
661
+ label?: Reactive<string>;
662
+ src?: Reactive<string>;
663
+ srcLang?: Reactive<string>;
651
664
  }
652
665
 
653
666
  export interface MediaHTMLAttributes<T extends HTMLMediaElement = HTMLMediaElement>
654
667
  extends HTMLAttributes<T> {
668
+ /**
669
+ * One-shot by spec — the browser only consults `autoplay` at insertion
670
+ * time, so it is not reactive.
671
+ */
655
672
  autoPlay?: boolean;
656
673
  controls?: Reactive<boolean>;
657
- controlsList?: string;
658
- crossOrigin?: CrossOrigin;
674
+ controlsList?: Reactive<string>;
675
+ crossOrigin?: Reactive<CrossOrigin>;
659
676
  loop?: Reactive<boolean>;
660
- mediaGroup?: string;
677
+ mediaGroup?: Reactive<string>;
661
678
  muted?: Reactive<boolean>;
662
- playsInline?: boolean;
663
- preload?: LiteralUnion<"none" | "metadata" | "auto">;
679
+ playsInline?: Reactive<boolean>;
680
+ preload?: Reactive<LiteralUnion<"none" | "metadata" | "auto">>;
664
681
  src?: Reactive<string>;
665
682
  // Media events
666
683
  onAbort?: (e: NativeEventOf<Event, T>) => void;
@@ -694,11 +711,11 @@ export interface VideoHTMLAttributes<
694
711
  T extends HTMLVideoElement = HTMLVideoElement,
695
712
  > extends MediaHTMLAttributes<T> {
696
713
  height?: Reactive<number | string>;
697
- playsInline?: boolean;
714
+ playsInline?: Reactive<boolean>;
698
715
  poster?: Reactive<string>;
699
716
  width?: Reactive<number | string>;
700
- disablePictureInPicture?: boolean;
701
- disableRemotePlayback?: boolean;
717
+ disablePictureInPicture?: Reactive<boolean>;
718
+ disableRemotePlayback?: Reactive<boolean>;
702
719
  }
703
720
 
704
721
  export interface CanvasHTMLAttributes<
@@ -711,21 +728,21 @@ export interface CanvasHTMLAttributes<
711
728
  export interface MapHTMLAttributes<
712
729
  T extends HTMLMapElement = HTMLMapElement,
713
730
  > extends HTMLAttributes<T> {
714
- name?: string;
731
+ name?: Reactive<string>;
715
732
  }
716
733
 
717
734
  export interface AreaHTMLAttributes<
718
735
  T extends HTMLAreaElement = HTMLAreaElement,
719
736
  > extends HTMLAttributes<T> {
720
- alt?: string;
721
- coords?: string;
722
- download?: string;
737
+ alt?: Reactive<string>;
738
+ coords?: Reactive<string>;
739
+ download?: Reactive<string | boolean>;
723
740
  href?: Reactive<string>;
724
- hrefLang?: string;
725
- media?: string;
726
- referrerPolicy?: ReferrerPolicy;
727
- rel?: string;
728
- shape?: string;
741
+ hrefLang?: Reactive<string>;
742
+ media?: Reactive<string>;
743
+ referrerPolicy?: Reactive<ReferrerPolicy>;
744
+ rel?: Reactive<string>;
745
+ shape?: Reactive<string>;
729
746
  target?: Reactive<LinkTarget>;
730
747
  }
731
748
 
@@ -734,106 +751,120 @@ export interface AreaHTMLAttributes<
734
751
  export interface FormHTMLAttributes<
735
752
  T extends HTMLFormElement = HTMLFormElement,
736
753
  > extends HTMLAttributes<T> {
737
- acceptCharset?: string;
754
+ acceptCharset?: Reactive<string>;
738
755
  action?: Reactive<string>;
739
- autoComplete?: string;
740
- encType?: FormEncType;
741
- method?: FormMethod;
742
- name?: string;
743
- noValidate?: boolean;
744
- target?: LinkTarget;
745
- rel?: string;
756
+ autoComplete?: Reactive<string>;
757
+ encType?: Reactive<FormEncType>;
758
+ method?: Reactive<FormMethod>;
759
+ name?: Reactive<string>;
760
+ noValidate?: Reactive<boolean>;
761
+ target?: Reactive<LinkTarget>;
762
+ rel?: Reactive<string>;
746
763
  }
747
764
 
748
765
  export interface FieldsetHTMLAttributes<
749
766
  T extends HTMLFieldSetElement = HTMLFieldSetElement,
750
767
  > extends HTMLAttributes<T> {
751
768
  disabled?: Reactive<boolean>;
752
- form?: string;
753
- name?: string;
769
+ form?: Reactive<string>;
770
+ name?: Reactive<string>;
754
771
  }
755
772
 
756
773
  export interface InputHTMLAttributes<
757
774
  T extends HTMLInputElement = HTMLInputElement,
758
775
  > extends HTMLAttributes<T> {
759
- accept?: string;
760
- alt?: string;
761
- autoComplete?: LiteralUnion<string>;
776
+ accept?: Reactive<string>;
777
+ alt?: Reactive<string>;
778
+ autoComplete?: Reactive<LiteralUnion<string>>;
779
+ /**
780
+ * Autofocus on mount. One-shot by spec — the browser only consults this
781
+ * at insertion time, so it is not reactive.
782
+ */
762
783
  autoFocus?: boolean;
763
- capture?: boolean | LiteralUnion<"user" | "environment">;
784
+ capture?: Reactive<boolean | LiteralUnion<"user" | "environment">>;
764
785
  checked?: Reactive<boolean>;
765
- crossOrigin?: CrossOrigin;
786
+ crossOrigin?: Reactive<CrossOrigin>;
787
+ /** Uncontrolled-baseline value, set once on mount — not reactive. */
766
788
  defaultChecked?: boolean;
789
+ /** Uncontrolled-baseline value, set once on mount — not reactive. */
767
790
  defaultValue?: string | number | readonly string[];
768
- dirName?: string;
791
+ dirName?: Reactive<string>;
769
792
  disabled?: Reactive<boolean>;
770
793
  enterKeyHint?: Reactive<EnterKeyHint>;
771
- form?: string;
772
- formAction?: string;
773
- formEncType?: FormEncType;
774
- formMethod?: FormMethod;
775
- formNoValidate?: boolean;
776
- formTarget?: string;
794
+ form?: Reactive<string>;
795
+ formAction?: Reactive<string>;
796
+ formEncType?: Reactive<FormEncType>;
797
+ formMethod?: Reactive<FormMethod>;
798
+ formNoValidate?: Reactive<boolean>;
799
+ formTarget?: Reactive<string>;
777
800
  height?: Reactive<number | string>;
778
- list?: string;
801
+ list?: Reactive<string>;
779
802
  max?: Reactive<number | string>;
780
- maxLength?: number;
803
+ maxLength?: Reactive<number>;
781
804
  min?: Reactive<number | string>;
782
- minLength?: number;
783
- multiple?: boolean;
784
- name?: string;
785
- pattern?: string;
805
+ minLength?: Reactive<number>;
806
+ multiple?: Reactive<boolean>;
807
+ name?: Reactive<string>;
808
+ pattern?: Reactive<string>;
786
809
  placeholder?: Reactive<string>;
787
810
  readOnly?: Reactive<boolean>;
788
811
  required?: Reactive<boolean>;
789
- size?: number;
790
- src?: string;
812
+ size?: Reactive<number>;
813
+ src?: Reactive<string>;
791
814
  step?: Reactive<number | string>;
792
815
  type?: Reactive<HTMLInputTypeAttribute>;
793
816
  value?: Reactive<string | number | readonly string[]>;
794
817
  width?: Reactive<number | string>;
795
- popovertarget?: string;
796
- popovertargetaction?: LiteralUnion<"hide" | "show" | "toggle">;
818
+ popovertarget?: Reactive<string>;
819
+ popovertargetaction?: Reactive<LiteralUnion<"hide" | "show" | "toggle">>;
797
820
  }
798
821
 
799
822
  export interface ButtonHTMLAttributes<
800
823
  T extends HTMLButtonElement = HTMLButtonElement,
801
824
  > extends HTMLAttributes<T> {
825
+ /**
826
+ * Autofocus on mount. One-shot by spec — the browser only consults this
827
+ * at insertion time, so it is not reactive.
828
+ */
802
829
  autoFocus?: boolean;
803
830
  disabled?: Reactive<boolean>;
804
- form?: string;
805
- formAction?: string;
806
- formEncType?: FormEncType;
807
- formMethod?: FormMethod;
808
- formNoValidate?: boolean;
809
- formTarget?: string;
810
- name?: string;
831
+ form?: Reactive<string>;
832
+ formAction?: Reactive<string>;
833
+ formEncType?: Reactive<FormEncType>;
834
+ formMethod?: Reactive<FormMethod>;
835
+ formNoValidate?: Reactive<boolean>;
836
+ formTarget?: Reactive<string>;
837
+ name?: Reactive<string>;
811
838
  type?: Reactive<ButtonType>;
812
839
  value?: Reactive<string>;
813
- popovertarget?: string;
814
- popovertargetaction?: LiteralUnion<"hide" | "show" | "toggle">;
840
+ popovertarget?: Reactive<string>;
841
+ popovertargetaction?: Reactive<LiteralUnion<"hide" | "show" | "toggle">>;
815
842
  }
816
843
 
817
844
  export interface LabelHTMLAttributes<
818
845
  T extends HTMLLabelElement = HTMLLabelElement,
819
846
  > extends HTMLAttributes<T> {
820
- form?: string;
821
- htmlFor?: string;
847
+ form?: Reactive<string>;
848
+ htmlFor?: Reactive<string>;
822
849
  /** DOM attribute alias for `htmlFor`. */
823
- for?: string;
850
+ for?: Reactive<string>;
824
851
  }
825
852
 
826
853
  export interface SelectHTMLAttributes<
827
854
  T extends HTMLSelectElement = HTMLSelectElement,
828
855
  > extends HTMLAttributes<T> {
829
- autoComplete?: string;
856
+ autoComplete?: Reactive<string>;
857
+ /**
858
+ * Autofocus on mount. One-shot by spec — the browser only consults this
859
+ * at insertion time, so it is not reactive.
860
+ */
830
861
  autoFocus?: boolean;
831
862
  disabled?: Reactive<boolean>;
832
- form?: string;
833
- multiple?: boolean;
834
- name?: string;
863
+ form?: Reactive<string>;
864
+ multiple?: Reactive<boolean>;
865
+ name?: Reactive<string>;
835
866
  required?: Reactive<boolean>;
836
- size?: number;
867
+ size?: Reactive<number>;
837
868
  value?: Reactive<string | number | readonly string[]>;
838
869
  }
839
870
 
@@ -841,14 +872,14 @@ export interface OptgroupHTMLAttributes<
841
872
  T extends HTMLOptGroupElement = HTMLOptGroupElement,
842
873
  > extends HTMLAttributes<T> {
843
874
  disabled?: Reactive<boolean>;
844
- label?: string;
875
+ label?: Reactive<string>;
845
876
  }
846
877
 
847
878
  export interface OptionHTMLAttributes<
848
879
  T extends HTMLOptionElement = HTMLOptionElement,
849
880
  > extends HTMLAttributes<T> {
850
881
  disabled?: Reactive<boolean>;
851
- label?: string;
882
+ label?: Reactive<string>;
852
883
  selected?: Reactive<boolean>;
853
884
  value?: Reactive<string | number>;
854
885
  }
@@ -856,48 +887,53 @@ export interface OptionHTMLAttributes<
856
887
  export interface OutputHTMLAttributes<
857
888
  T extends HTMLOutputElement = HTMLOutputElement,
858
889
  > extends HTMLAttributes<T> {
859
- form?: string;
860
- htmlFor?: string;
861
- name?: string;
890
+ form?: Reactive<string>;
891
+ htmlFor?: Reactive<string>;
892
+ name?: Reactive<string>;
862
893
  }
863
894
 
864
895
  export interface TextareaHTMLAttributes<
865
896
  T extends HTMLTextAreaElement = HTMLTextAreaElement,
866
897
  > extends HTMLAttributes<T> {
867
- autoComplete?: string;
898
+ autoComplete?: Reactive<string>;
899
+ /**
900
+ * Autofocus on mount. One-shot by spec — the browser only consults this
901
+ * at insertion time, so it is not reactive.
902
+ */
868
903
  autoFocus?: boolean;
869
- cols?: number;
904
+ cols?: Reactive<number>;
905
+ /** Uncontrolled-baseline value, set once on mount — not reactive. */
870
906
  defaultValue?: string;
871
- dirName?: string;
907
+ dirName?: Reactive<string>;
872
908
  disabled?: Reactive<boolean>;
873
- form?: string;
874
- maxLength?: number;
875
- minLength?: number;
876
- name?: string;
909
+ form?: Reactive<string>;
910
+ maxLength?: Reactive<number>;
911
+ minLength?: Reactive<number>;
912
+ name?: Reactive<string>;
877
913
  placeholder?: Reactive<string>;
878
914
  readOnly?: Reactive<boolean>;
879
915
  required?: Reactive<boolean>;
880
- rows?: number;
916
+ rows?: Reactive<number>;
881
917
  value?: Reactive<string>;
882
- wrap?: LiteralUnion<"hard" | "soft" | "off">;
918
+ wrap?: Reactive<LiteralUnion<"hard" | "soft" | "off">>;
883
919
  }
884
920
 
885
921
  export interface MeterHTMLAttributes<
886
922
  T extends HTMLMeterElement = HTMLMeterElement,
887
923
  > extends HTMLAttributes<T> {
888
- form?: string;
889
- high?: number;
890
- low?: number;
924
+ form?: Reactive<string>;
925
+ high?: Reactive<number>;
926
+ low?: Reactive<number>;
891
927
  max?: Reactive<number | string>;
892
928
  min?: Reactive<number | string>;
893
- optimum?: number;
929
+ optimum?: Reactive<number>;
894
930
  value?: Reactive<string | number>;
895
931
  }
896
932
 
897
933
  export interface ProgressHTMLAttributes<
898
934
  T extends HTMLProgressElement = HTMLProgressElement,
899
935
  > extends HTMLAttributes<T> {
900
- max?: number | string;
936
+ max?: Reactive<number | string>;
901
937
  value?: Reactive<string | number>;
902
938
  }
903
939
 
@@ -911,7 +947,7 @@ export interface DetailsHTMLAttributes<
911
947
  T extends HTMLDetailsElement = HTMLDetailsElement,
912
948
  > extends HTMLAttributes<T> {
913
949
  open?: Reactive<boolean>;
914
- name?: string;
950
+ name?: Reactive<string>;
915
951
  onToggle?: (e: NativeEventOf<Event, T>) => void;
916
952
  onBeforeToggle?: (e: NativeEventOf<Event, T>) => void;
917
953
  }
@@ -929,7 +965,7 @@ export interface DialogHTMLAttributes<
929
965
  export interface SlotHTMLAttributes<
930
966
  T extends HTMLSlotElement = HTMLSlotElement,
931
967
  > extends HTMLAttributes<T> {
932
- name?: string;
968
+ name?: Reactive<string>;
933
969
  }
934
970
 
935
971
  // --- Tabular ---
@@ -937,48 +973,48 @@ export interface SlotHTMLAttributes<
937
973
  export interface TableHTMLAttributes<
938
974
  T extends HTMLTableElement = HTMLTableElement,
939
975
  > extends HTMLAttributes<T> {
940
- cellPadding?: number | string;
941
- cellSpacing?: number | string;
942
- summary?: string;
943
- width?: number | string;
976
+ cellPadding?: Reactive<number | string>;
977
+ cellSpacing?: Reactive<number | string>;
978
+ summary?: Reactive<string>;
979
+ width?: Reactive<number | string>;
944
980
  }
945
981
 
946
982
  export interface ColHTMLAttributes<
947
983
  T extends HTMLTableColElement = HTMLTableColElement,
948
984
  > extends HTMLAttributes<T> {
949
- span?: number;
950
- width?: number | string;
985
+ span?: Reactive<number>;
986
+ width?: Reactive<number | string>;
951
987
  }
952
988
 
953
989
  export interface ColgroupHTMLAttributes<
954
990
  T extends HTMLTableColElement = HTMLTableColElement,
955
991
  > extends HTMLAttributes<T> {
956
- span?: number;
992
+ span?: Reactive<number>;
957
993
  }
958
994
 
959
995
  export interface TdHTMLAttributes<
960
996
  T extends HTMLTableCellElement = HTMLTableCellElement,
961
997
  > extends HTMLAttributes<T> {
962
- align?: LiteralUnion<"left" | "center" | "right" | "justify" | "char">;
963
- colSpan?: number;
964
- headers?: string;
965
- rowSpan?: number;
966
- scope?: LiteralUnion<"col" | "row" | "colgroup" | "rowgroup">;
967
- abbr?: string;
968
- height?: number | string;
969
- width?: number | string;
970
- valign?: LiteralUnion<"top" | "middle" | "bottom" | "baseline">;
998
+ align?: Reactive<LiteralUnion<"left" | "center" | "right" | "justify" | "char">>;
999
+ colSpan?: Reactive<number>;
1000
+ headers?: Reactive<string>;
1001
+ rowSpan?: Reactive<number>;
1002
+ scope?: Reactive<LiteralUnion<"col" | "row" | "colgroup" | "rowgroup">>;
1003
+ abbr?: Reactive<string>;
1004
+ height?: Reactive<number | string>;
1005
+ width?: Reactive<number | string>;
1006
+ valign?: Reactive<LiteralUnion<"top" | "middle" | "bottom" | "baseline">>;
971
1007
  }
972
1008
 
973
1009
  export interface ThHTMLAttributes<
974
1010
  T extends HTMLTableCellElement = HTMLTableCellElement,
975
1011
  > extends HTMLAttributes<T> {
976
- align?: LiteralUnion<"left" | "center" | "right" | "justify" | "char">;
977
- colSpan?: number;
978
- headers?: string;
979
- rowSpan?: number;
980
- scope?: LiteralUnion<"col" | "row" | "colgroup" | "rowgroup">;
981
- abbr?: string;
1012
+ align?: Reactive<LiteralUnion<"left" | "center" | "right" | "justify" | "char">>;
1013
+ colSpan?: Reactive<number>;
1014
+ headers?: Reactive<string>;
1015
+ rowSpan?: Reactive<number>;
1016
+ scope?: Reactive<LiteralUnion<"col" | "row" | "colgroup" | "rowgroup">>;
1017
+ abbr?: Reactive<string>;
982
1018
  }
983
1019
 
984
1020
  // --- Content edits ---
@@ -986,15 +1022,15 @@ export interface ThHTMLAttributes<
986
1022
  export interface DelHTMLAttributes<
987
1023
  T extends HTMLModElement = HTMLModElement,
988
1024
  > extends HTMLAttributes<T> {
989
- cite?: string;
990
- dateTime?: string;
1025
+ cite?: Reactive<string>;
1026
+ dateTime?: Reactive<string>;
991
1027
  }
992
1028
 
993
1029
  export interface InsHTMLAttributes<
994
1030
  T extends HTMLModElement = HTMLModElement,
995
1031
  > extends HTMLAttributes<T> {
996
- cite?: string;
997
- dateTime?: string;
1032
+ cite?: Reactive<string>;
1033
+ dateTime?: Reactive<string>;
998
1034
  }
999
1035
 
1000
1036
  // ---------------------------------------------------------------------------