@typed/ui 1.0.0-beta.1 → 1.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -10
  3. package/dist/Alert.d.ts +72 -0
  4. package/dist/Alert.d.ts.map +1 -0
  5. package/dist/Alert.js +40 -0
  6. package/dist/Button.d.ts +100 -0
  7. package/dist/Button.d.ts.map +1 -0
  8. package/dist/Button.js +42 -0
  9. package/dist/Carousel.d.ts +346 -0
  10. package/dist/Carousel.d.ts.map +1 -0
  11. package/dist/Carousel.js +264 -0
  12. package/dist/Checkbox.d.ts +168 -0
  13. package/dist/Checkbox.d.ts.map +1 -0
  14. package/dist/Checkbox.js +146 -0
  15. package/dist/Collection.d.ts +254 -0
  16. package/dist/Collection.d.ts.map +1 -0
  17. package/dist/Collection.js +218 -0
  18. package/dist/Combobox.d.ts +367 -0
  19. package/dist/Combobox.d.ts.map +1 -0
  20. package/dist/Combobox.js +300 -0
  21. package/dist/Composite.d.ts +823 -0
  22. package/dist/Composite.d.ts.map +1 -0
  23. package/dist/Composite.js +615 -0
  24. package/dist/Dialog.d.ts +544 -0
  25. package/dist/Dialog.d.ts.map +1 -0
  26. package/dist/Dialog.js +357 -0
  27. package/dist/Disclosure.d.ts +219 -0
  28. package/dist/Disclosure.d.ts.map +1 -0
  29. package/dist/Disclosure.js +128 -0
  30. package/dist/Dom/Events.d.ts +122 -0
  31. package/dist/Dom/Events.d.ts.map +1 -0
  32. package/dist/Dom/Events.js +192 -0
  33. package/dist/Dom/Props.d.ts +161 -0
  34. package/dist/Dom/Props.d.ts.map +1 -0
  35. package/dist/Dom/Props.js +110 -0
  36. package/dist/Dom/Refs.d.ts +58 -0
  37. package/dist/Dom/Refs.d.ts.map +1 -0
  38. package/dist/Dom/Refs.js +61 -0
  39. package/dist/Dom/Render.d.ts +59 -0
  40. package/dist/Dom/Render.d.ts.map +1 -0
  41. package/dist/Dom/Render.js +71 -0
  42. package/dist/Dom/Types.d.ts +570 -0
  43. package/dist/Dom/Types.d.ts.map +1 -0
  44. package/dist/Dom/Types.js +1 -0
  45. package/dist/Dom/index.d.ts +20 -0
  46. package/dist/Dom/index.d.ts.map +1 -0
  47. package/dist/Dom/index.js +8 -0
  48. package/dist/Dom.d.ts +14 -0
  49. package/dist/Dom.d.ts.map +1 -0
  50. package/dist/Dom.js +13 -0
  51. package/dist/Focusable.d.ts +85 -0
  52. package/dist/Focusable.d.ts.map +1 -0
  53. package/dist/Focusable.js +35 -0
  54. package/dist/Form.d.ts +1727 -0
  55. package/dist/Form.d.ts.map +1 -0
  56. package/dist/Form.js +1142 -0
  57. package/dist/Grid.d.ts +388 -0
  58. package/dist/Grid.d.ts.map +1 -0
  59. package/dist/Grid.js +284 -0
  60. package/dist/Group.d.ts +128 -0
  61. package/dist/Group.d.ts.map +1 -0
  62. package/dist/Group.js +71 -0
  63. package/dist/Heading.d.ts +87 -0
  64. package/dist/Heading.d.ts.map +1 -0
  65. package/dist/Heading.js +58 -0
  66. package/dist/Hovercard.d.ts +297 -0
  67. package/dist/Hovercard.d.ts.map +1 -0
  68. package/dist/Hovercard.js +188 -0
  69. package/dist/HttpRouter.d.ts +129 -6
  70. package/dist/HttpRouter.d.ts.map +1 -1
  71. package/dist/HttpRouter.js +198 -55
  72. package/dist/Link.d.ts +63 -28
  73. package/dist/Link.d.ts.map +1 -1
  74. package/dist/Link.js +84 -37
  75. package/dist/Listbox.d.ts +305 -0
  76. package/dist/Listbox.d.ts.map +1 -0
  77. package/dist/Listbox.js +245 -0
  78. package/dist/Menu.d.ts +663 -0
  79. package/dist/Menu.d.ts.map +1 -0
  80. package/dist/Menu.js +569 -0
  81. package/dist/Menubar.d.ts +249 -0
  82. package/dist/Menubar.d.ts.map +1 -0
  83. package/dist/Menubar.js +207 -0
  84. package/dist/Meter.d.ts +157 -0
  85. package/dist/Meter.d.ts.map +1 -0
  86. package/dist/Meter.js +87 -0
  87. package/dist/NativeDetails.d.ts +41 -0
  88. package/dist/NativeDetails.d.ts.map +1 -0
  89. package/dist/NativeDetails.js +40 -0
  90. package/dist/NativeDialog.d.ts +66 -0
  91. package/dist/NativeDialog.d.ts.map +1 -0
  92. package/dist/NativeDialog.js +88 -0
  93. package/dist/NativePopover.d.ts +43 -0
  94. package/dist/NativePopover.d.ts.map +1 -0
  95. package/dist/NativePopover.js +84 -0
  96. package/dist/Popover.d.ts +240 -0
  97. package/dist/Popover.d.ts.map +1 -0
  98. package/dist/Popover.js +140 -0
  99. package/dist/RadioGroup.d.ts +330 -0
  100. package/dist/RadioGroup.d.ts.map +1 -0
  101. package/dist/RadioGroup.js +241 -0
  102. package/dist/Role.d.ts +64 -0
  103. package/dist/Role.d.ts.map +1 -0
  104. package/dist/Role.js +27 -0
  105. package/dist/Select.d.ts +418 -0
  106. package/dist/Select.d.ts.map +1 -0
  107. package/dist/Select.js +357 -0
  108. package/dist/Separator.d.ts +58 -0
  109. package/dist/Separator.d.ts.map +1 -0
  110. package/dist/Separator.js +32 -0
  111. package/dist/Slider.d.ts +141 -0
  112. package/dist/Slider.d.ts.map +1 -0
  113. package/dist/Slider.js +101 -0
  114. package/dist/SpinButton.d.ts +141 -0
  115. package/dist/SpinButton.d.ts.map +1 -0
  116. package/dist/SpinButton.js +101 -0
  117. package/dist/Storybook.d.ts +76 -0
  118. package/dist/Storybook.d.ts.map +1 -0
  119. package/dist/Storybook.js +102 -0
  120. package/dist/Switch.d.ts +148 -0
  121. package/dist/Switch.d.ts.map +1 -0
  122. package/dist/Switch.js +110 -0
  123. package/dist/Tab.d.ts +26 -0
  124. package/dist/Tab.d.ts.map +1 -0
  125. package/dist/Tab.js +25 -0
  126. package/dist/Tabs.d.ts +411 -0
  127. package/dist/Tabs.d.ts.map +1 -0
  128. package/dist/Tabs.js +262 -0
  129. package/dist/Toolbar.d.ts +248 -0
  130. package/dist/Toolbar.d.ts.map +1 -0
  131. package/dist/Toolbar.js +187 -0
  132. package/dist/Tooltip.d.ts +296 -0
  133. package/dist/Tooltip.d.ts.map +1 -0
  134. package/dist/Tooltip.js +172 -0
  135. package/dist/Tree.d.ts +405 -0
  136. package/dist/Tree.d.ts.map +1 -0
  137. package/dist/Tree.js +333 -0
  138. package/dist/TreeGrid.d.ts +426 -0
  139. package/dist/TreeGrid.d.ts.map +1 -0
  140. package/dist/TreeGrid.js +308 -0
  141. package/dist/VisuallyHidden.d.ts +68 -0
  142. package/dist/VisuallyHidden.d.ts.map +1 -0
  143. package/dist/VisuallyHidden.js +44 -0
  144. package/dist/WindowSplitter.d.ts +336 -0
  145. package/dist/WindowSplitter.d.ts.map +1 -0
  146. package/dist/WindowSplitter.js +305 -0
  147. package/dist/index.d.ts +48 -0
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +48 -0
  150. package/package.json +48 -20
  151. package/src/HttpRouter.test.ts +0 -294
  152. package/src/HttpRouter.ts +0 -168
  153. package/src/Link.test.ts +0 -84
  154. package/src/Link.ts +0 -107
  155. package/src/index.ts +0 -2
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Explicitly named collections of related content.
3
+ * Group.Label is a span; connect its ID through labelledBy rather than assuming implicit wiring.
4
+ *
5
+ * Read the [Group guide](/explore/ui-group) for a complete example.
6
+ *
7
+ * [Platform reference](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/group_role).
8
+ * @since 1.0.0
9
+ * @category Overview
10
+ * @packageDocumentation
11
+ */
12
+ import type * as Scope from "effect/Scope";
13
+ import type { Fx } from "@typed/fx/Fx";
14
+ import { type Renderable, type RenderEvent, type RenderTemplate } from "@typed/template";
15
+ import * as Dom from "./Dom.js";
16
+ import type { HostResult } from "./Dom/Types.js";
17
+ /**
18
+ * Related content with either a direct accessible label or an external label ID.
19
+ *
20
+ * @remarks
21
+ * Use labelledBy when visible text already names the group; use label when that text is absent.
22
+ * Native fieldset/legend and composite keyboard behavior are not created by these options.
23
+ * @since 1.0.0
24
+ * @category Component options
25
+ */
26
+ export interface GroupOptions extends Dom.HostOptions<HTMLDivElement> {
27
+ /**
28
+ * Renderable child content for the component host.
29
+ * @since 1.0.0
30
+ * @category Rendered content
31
+ */
32
+ readonly content: Renderable.Any;
33
+ /**
34
+ * Accessible label rendered through aria-label.
35
+ * @since 1.0.0
36
+ * @category Accessible naming
37
+ */
38
+ readonly label?: Renderable.Any<string | null | undefined>;
39
+ /**
40
+ * Id of the external element used through aria-labelledby.
41
+ * @since 1.0.0
42
+ * @category Accessible naming
43
+ */
44
+ readonly labelledBy?: Renderable.Any<string | null | undefined>;
45
+ }
46
+ declare function internalProps<const Options extends GroupOptions>({ property }: Dom.InternalPropsHelpers<Options>): {
47
+ role: string;
48
+ "aria-label": Exclude<Dom.Property<Options, "label">, Dom.Nullish> | undefined;
49
+ "aria-labelledby": Exclude<Dom.Property<Options, "labelledBy">, Dom.Nullish> | undefined;
50
+ };
51
+ type GroupInternalProps<Options extends GroupOptions> = ReturnType<typeof internalProps<Options>>;
52
+ /**
53
+ * Renders a semantic group with an explicit accessible name.
54
+ *
55
+ * @remarks
56
+ * label becomes aria-label; labelledBy references existing visible text through aria-labelledby.
57
+ * The div does not implement fieldset disabling, toolbar navigation, or child selection. Name
58
+ * each interactive child independently.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import { RefSubject } from "@typed/fx";
63
+ * import { html } from "@typed/template";
64
+ * import { Button } from "@typed/ui/Button";
65
+ * import { component } from "@typed/template";
66
+ * import * as Group from "@typed/ui/Group";
67
+ *
68
+ * export const PreviewActions = component(function* () {
69
+ * const rotation = yield* RefSubject.make(45);
70
+ * const scale = yield* RefSubject.make(150);
71
+ * return html`<section>
72
+ * <p>Rotation: ${rotation} degrees. Scale: ${scale}%.</p>
73
+ * ${Group.Label({
74
+ * content: "Preview controls",
75
+ * props: { id: "preview-control-label", class: "control-group-label" },
76
+ * })}
77
+ * ${Group.Group({
78
+ * labelledBy: "preview-control-label",
79
+ * props: { class: "preview-actions" },
80
+ * content: [
81
+ * Button({ content: "Reset rotation", onclick: RefSubject.set(rotation, 0) }),
82
+ * Button({ content: "Reset scale", onclick: RefSubject.set(scale, 100) }),
83
+ * ],
84
+ * })}
85
+ * </section>`;
86
+ * });
87
+ * ```
88
+ * @since 1.0.0
89
+ * @category Structure and naming
90
+ */
91
+ export declare function Group<const Options extends GroupOptions, const Host extends HostResult = never>(options: Options, host?: Dom.HostOverride<Dom.RenderHostProps<Options, GroupInternalProps<Options>>, Options["content"], Host>): Fx<RenderEvent, Renderable.Error<Options | Host>, Renderable.Services<Options | Host> | Scope.Scope | RenderTemplate>;
92
+ /**
93
+ * Visible span content and host props for an explicitly linked group label.
94
+ *
95
+ * @remarks
96
+ * Set props.id and reference it through Group.labelledBy. There is no generated ID or implicit
97
+ * relationship.
98
+ * @since 1.0.0
99
+ * @category Component options
100
+ */
101
+ export interface LabelOptions extends Dom.HostOptions<HTMLSpanElement> {
102
+ /**
103
+ * Renderable child content for the component host.
104
+ * @since 1.0.0
105
+ * @category Rendered content
106
+ */
107
+ readonly content: Renderable.Any;
108
+ }
109
+ /**
110
+ * Renders visible group-label text in a span.
111
+ *
112
+ * @remarks
113
+ * Pass an ID through props and reference it from Group.labelledBy to create a relationship.
114
+ * Rendering this span beside a group does not connect them automatically, and it does not create
115
+ * heading semantics.
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * import * as Group from "@typed/ui/Group";
120
+ *
121
+ * const view = Group.Label({ content: "Formatting" });
122
+ * ```
123
+ * @since 1.0.0
124
+ * @category Controls
125
+ */
126
+ export declare function Label<const Options extends LabelOptions, const Host extends HostResult = never>(options: Options, host?: Dom.HostOverride<Dom.RenderHostProps<Options, Record<never, never>>, Options["content"], Host>): Fx<RenderEvent, Renderable.Error<Options | Host>, Renderable.Services<Options | Host> | Scope.Scope | RenderTemplate>;
127
+ export {};
128
+ //# sourceMappingURL=Group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../src/Group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAQ,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC;IACnE;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAC3D;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACjE;AAED,iBAAS,aAAa,CAAC,KAAK,CAAC,OAAO,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC;IAEtG,IAAI;IACJ,YAAY;IACZ,iBAAiB;EAEpB;AAED,KAAK,kBAAkB,CAAC,OAAO,SAAS,YAAY,IAAI,UAAU,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAElG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,YAAY,EAAE,KAAK,CAAC,IAAI,SAAS,UAAU,GAAG,KAAK,EAC7F,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GAC3G,EAAE,CACH,WAAW,EACX,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAChC,UAAU,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,cAAc,CACnE,CAQA;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAa,SAAQ,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,YAAY,EAAE,KAAK,CAAC,IAAI,SAAS,UAAU,GAAG,KAAK,EAC7F,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,GACpG,EAAE,CACH,WAAW,EACX,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAChC,UAAU,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,cAAc,CACnE,CAQA"}
package/dist/Group.js ADDED
@@ -0,0 +1,71 @@
1
+ import { html } from "@typed/template";
2
+ import * as Dom from "./Dom.js";
3
+ function internalProps({ property }) {
4
+ return {
5
+ role: "group",
6
+ "aria-label": property("label", undefined),
7
+ "aria-labelledby": property("labelledBy", undefined),
8
+ };
9
+ }
10
+ /**
11
+ * Renders a semantic group with an explicit accessible name.
12
+ *
13
+ * @remarks
14
+ * label becomes aria-label; labelledBy references existing visible text through aria-labelledby.
15
+ * The div does not implement fieldset disabling, toolbar navigation, or child selection. Name
16
+ * each interactive child independently.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { RefSubject } from "@typed/fx";
21
+ * import { html } from "@typed/template";
22
+ * import { Button } from "@typed/ui/Button";
23
+ * import { component } from "@typed/template";
24
+ * import * as Group from "@typed/ui/Group";
25
+ *
26
+ * export const PreviewActions = component(function* () {
27
+ * const rotation = yield* RefSubject.make(45);
28
+ * const scale = yield* RefSubject.make(150);
29
+ * return html`<section>
30
+ * <p>Rotation: ${rotation} degrees. Scale: ${scale}%.</p>
31
+ * ${Group.Label({
32
+ * content: "Preview controls",
33
+ * props: { id: "preview-control-label", class: "control-group-label" },
34
+ * })}
35
+ * ${Group.Group({
36
+ * labelledBy: "preview-control-label",
37
+ * props: { class: "preview-actions" },
38
+ * content: [
39
+ * Button({ content: "Reset rotation", onclick: RefSubject.set(rotation, 0) }),
40
+ * Button({ content: "Reset scale", onclick: RefSubject.set(scale, 100) }),
41
+ * ],
42
+ * })}
43
+ * </section>`;
44
+ * });
45
+ * ```
46
+ * @since 1.0.0
47
+ * @category Structure and naming
48
+ */
49
+ export function Group(options, host) {
50
+ return Dom.renderHost()(options, host, internalProps, options.content, (props, content) => html `<div ...${props}>${content}</div>`);
51
+ }
52
+ /**
53
+ * Renders visible group-label text in a span.
54
+ *
55
+ * @remarks
56
+ * Pass an ID through props and reference it from Group.labelledBy to create a relationship.
57
+ * Rendering this span beside a group does not connect them automatically, and it does not create
58
+ * heading semantics.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import * as Group from "@typed/ui/Group";
63
+ *
64
+ * const view = Group.Label({ content: "Formatting" });
65
+ * ```
66
+ * @since 1.0.0
67
+ * @category Controls
68
+ */
69
+ export function Label(options, host) {
70
+ return Dom.renderHost()(options, host, () => ({}), options.content, (props, content) => html `<span ...${props}>${content}</span>`);
71
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Contextual heading semantics independent of typography.
3
+ * The default div uses role=heading and aria-level; fixed native headings remain useful.
4
+ *
5
+ * Read the [Heading guide](/explore/ui-heading) for a complete example.
6
+ *
7
+ * [Platform reference](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/heading_role).
8
+ * @since 1.0.0
9
+ * @category Overview
10
+ * @packageDocumentation
11
+ */
12
+ import type * as Scope from "effect/Scope";
13
+ import type { Fx } from "@typed/fx/Fx";
14
+ import { type Renderable, type RenderEvent, type RenderTemplate } from "@typed/template";
15
+ import * as Dom from "./Dom.js";
16
+ import type { HostResult } from "./Dom/Types.js";
17
+ /**
18
+ */
19
+ export interface HeadingOptions extends Dom.HostOptions<HTMLDivElement> {
20
+ /**
21
+ * Heading content and accessible name.
22
+ * @since 1.0.0
23
+ * @category Rendered content
24
+ */
25
+ readonly content: Renderable.Any;
26
+ /**
27
+ */
28
+ readonly level?: Renderable.Any<number | null | undefined>;
29
+ }
30
+ declare function internalProps<const Options extends HeadingOptions>({ property, }: Dom.InternalPropsHelpers<Options>): {
31
+ role: string;
32
+ "aria-level": 1 | Exclude<Dom.Property<Options, "level">, Dom.Nullish>;
33
+ };
34
+ type HeadingInternalProps<Options extends HeadingOptions> = ReturnType<typeof internalProps<Options>>;
35
+ /**
36
+ * Renders a div with heading semantics and an explicit level.
37
+ *
38
+ * @remarks
39
+ * level defaults to one and may be reactive; it does not choose font size, infer nesting, or
40
+ * validate the document outline. Use native h1–h6 markup when the level is fixed. A custom host
41
+ * must keep its native level and aria-level consistent.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import { html } from "@typed/template";
46
+ * import { Heading } from "@typed/ui/Heading";
47
+ *
48
+ * export function AccountSection(level: 2 | 3) {
49
+ * return html`<section aria-labelledby="account-section-title">
50
+ * ${Heading({
51
+ * level,
52
+ * content: "Account security",
53
+ * props: { id: "account-section-title", class: "section-title" },
54
+ * })}
55
+ * <p>Review the devices and credentials that can access this account.</p>
56
+ * </section>`;
57
+ * }
58
+ *
59
+ * export const AccountPage = html`<main>
60
+ * <h1>Account settings</h1>
61
+ * ${AccountSection(2)}
62
+ * </main>`;
63
+ * ```
64
+ * @since 1.0.0
65
+ * @category Structure and naming
66
+ */
67
+ export declare function Heading<const Options extends HeadingOptions, const Host extends HostResult = never>(options: Options, host?: Dom.HostOverride<Dom.RenderHostProps<Options, HeadingInternalProps<Options>>, Options["content"], Host>): Fx<RenderEvent, Renderable.Error<Options | Host>, Renderable.Services<Options | Host> | Scope.Scope | RenderTemplate>;
68
+ /**
69
+ * Alias for `Heading` retained for level-oriented imports.
70
+ * @remarks
71
+ * The alias names the role the component plays in a contextual heading system.
72
+ * It has exactly the same Scope and host ownership as `Heading`.
73
+ * @since 1.0.0
74
+ * @category Aliases
75
+ */
76
+ export declare const Level: typeof Heading;
77
+ /**
78
+ * Descriptive alias for `Heading`.
79
+ * @remarks
80
+ * The name remains available without duplicating an implementation contract.
81
+ * It has exactly the same Scope and host ownership as `Heading`.
82
+ * @since 1.0.0
83
+ * @category Aliases
84
+ */
85
+ export declare const HeadingLevel: typeof Heading;
86
+ export {};
87
+ //# sourceMappingURL=Heading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Heading.d.ts","sourceRoot":"","sources":["../src/Heading.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAQ,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;GACG;AACH,MAAM,WAAW,cAAe,SAAQ,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC;IACrE;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;IACjC;OACG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAC5D;AAED,iBAAS,aAAa,CAAC,KAAK,CAAC,OAAO,SAAS,cAAc,EAAE,EAC3D,QAAQ,GACT,EAAE,GAAG,CAAC,oBAAoB,CAAC,OAAO,CAAC;IACzB,IAAI;IAAa,YAAY;EACvC;AAED,KAAK,oBAAoB,CAAC,OAAO,SAAS,cAAc,IAAI,UAAU,CACpE,OAAO,aAAa,CAAC,OAAO,CAAC,CAC9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,OAAO,CACrB,KAAK,CAAC,OAAO,SAAS,cAAc,EACpC,KAAK,CAAC,IAAI,SAAS,UAAU,GAAG,KAAK,EAErC,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,GAAG,CAAC,YAAY,CACrB,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAC3D,OAAO,CAAC,SAAS,CAAC,EAClB,IAAI,CACL,GACA,EAAE,CACH,WAAW,EACX,UAAU,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAChC,UAAU,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,cAAc,CACnE,CAQA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,gBAAU,CAAC;AAC7B;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,gBAAU,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { html } from "@typed/template";
2
+ import * as Dom from "./Dom.js";
3
+ function internalProps({ property, }) {
4
+ return { role: "heading", "aria-level": property("level", 1) };
5
+ }
6
+ /**
7
+ * Renders a div with heading semantics and an explicit level.
8
+ *
9
+ * @remarks
10
+ * level defaults to one and may be reactive; it does not choose font size, infer nesting, or
11
+ * validate the document outline. Use native h1–h6 markup when the level is fixed. A custom host
12
+ * must keep its native level and aria-level consistent.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { html } from "@typed/template";
17
+ * import { Heading } from "@typed/ui/Heading";
18
+ *
19
+ * export function AccountSection(level: 2 | 3) {
20
+ * return html`<section aria-labelledby="account-section-title">
21
+ * ${Heading({
22
+ * level,
23
+ * content: "Account security",
24
+ * props: { id: "account-section-title", class: "section-title" },
25
+ * })}
26
+ * <p>Review the devices and credentials that can access this account.</p>
27
+ * </section>`;
28
+ * }
29
+ *
30
+ * export const AccountPage = html`<main>
31
+ * <h1>Account settings</h1>
32
+ * ${AccountSection(2)}
33
+ * </main>`;
34
+ * ```
35
+ * @since 1.0.0
36
+ * @category Structure and naming
37
+ */
38
+ export function Heading(options, host) {
39
+ return Dom.renderHost()(options, host, internalProps, options.content, (props, content) => html `<div ...${props}>${content}</div>`);
40
+ }
41
+ /**
42
+ * Alias for `Heading` retained for level-oriented imports.
43
+ * @remarks
44
+ * The alias names the role the component plays in a contextual heading system.
45
+ * It has exactly the same Scope and host ownership as `Heading`.
46
+ * @since 1.0.0
47
+ * @category Aliases
48
+ */
49
+ export const Level = Heading;
50
+ /**
51
+ * Descriptive alias for `Heading`.
52
+ * @remarks
53
+ * The name remains available without duplicating an implementation contract.
54
+ * It has exactly the same Scope and host ownership as `Heading`.
55
+ * @since 1.0.0
56
+ * @category Aliases
57
+ */
58
+ export const HeadingLevel = Heading;
@@ -0,0 +1,297 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type * as Scope from "effect/Scope";
3
+ import * as Schema from "effect/Schema";
4
+ import type { Fx } from "@typed/fx/Fx";
5
+ import { RefSubject } from "@typed/fx";
6
+ import { EventHandler, type Renderable, type RenderEvent, type RenderTemplate } from "@typed/template";
7
+ import * as Dom from "./Dom.js";
8
+ import type { HostResult } from "./Dom/Types.js";
9
+ /** Current hovercard identity and visibility.
10
+ * @remarks
11
+ * ## Why
12
+ * A stable id links the anchor to focusable native popover content while state
13
+ * remains renderer-independent.
14
+ * ## Ownership and lifetime
15
+ * Plain data retains no resources; RefSubject observation is Scope-owned.
16
+ * @since 1.0.0
17
+ * @category Open state
18
+ */
19
+ export interface State {
20
+ /** Stable id used by `aria-controls` and content.
21
+ * @remarks
22
+ * ## Why
23
+ * Deterministic identity preserves server/client DOM relationships.
24
+ * ## Ownership and lifetime
25
+ * Plain data acquires no resources.
26
+ * @since 1.0.0
27
+ * @category Identity and relationships
28
+ */
29
+ readonly id: string;
30
+ /** Whether the hovercard is open.
31
+ * @remarks
32
+ * ## Why
33
+ * One value coordinates delayed interactions and native popover state.
34
+ * ## Ownership and lifetime
35
+ * Plain data acquires no resources.
36
+ * @since 1.0.0
37
+ * @category Open state
38
+ */
39
+ readonly open: boolean;
40
+ }
41
+ /** Initial hovercard identity and visibility.
42
+ * @remarks
43
+ * ## Why
44
+ * Requiring an id makes the anchor/content relationship explicit.
45
+ * ## Ownership and lifetime
46
+ * Configuration is inert.
47
+ * @since 1.0.0
48
+ * @category Open state
49
+ */
50
+ export interface InitialState {
51
+ /** Stable content id.
52
+ * @remarks
53
+ * ## Why
54
+ * Explicit ids prevent hydration relationship drift.
55
+ * ## Ownership and lifetime
56
+ * Plain data retains no resources.
57
+ * @since 1.0.0
58
+ * @category Identity and relationships
59
+ */
60
+ readonly id: string;
61
+ /** Initial visibility, defaulting to false.
62
+ * @remarks
63
+ * ## Why
64
+ * Closed is deterministic before focus or hover interaction.
65
+ * ## Ownership and lifetime
66
+ * Plain data retains no resources.
67
+ * @since 1.0.0
68
+ * @category Open state
69
+ */
70
+ readonly open?: boolean;
71
+ }
72
+ /** Schema for hovercard hydration state.
73
+ * @remarks
74
+ * ## Why
75
+ * Shared identity/open encoding keeps SSR and browser state compatible.
76
+ * ## Ownership and lifetime
77
+ * The immutable schema acquires no resources.
78
+ * @since 1.0.0
79
+ * @category Open state
80
+ */
81
+ export declare const StateSchema: Schema.Struct<{
82
+ readonly id: Schema.String;
83
+ readonly open: Schema.Boolean;
84
+ }>;
85
+ /** Creates hydrated hovercard state.
86
+ * @remarks
87
+ * ## Why
88
+ * Visibility and identity can be tested without mounting UI.
89
+ * ## Ownership and lifetime
90
+ * The calling Effect Scope owns the returned RefSubject.
91
+ * @example
92
+ * ```ts
93
+ * import { Effect } from "effect"
94
+ * import * as Hovercard from "@typed/ui/Hovercard"
95
+ *
96
+ * const program = Effect.gen(function* () {
97
+ * return yield* Hovercard.makeState({ id: "author-card" })
98
+ * })
99
+ * ```
100
+ * @since 1.0.0
101
+ * @category Open state
102
+ */
103
+ export declare function makeState(initial: InitialState): Effect.Effect<RefSubject.HydratedRefSubject<{
104
+ readonly id: string;
105
+ readonly open: boolean;
106
+ }, Schema.SchemaError, never, never>, never, Scope.Scope>;
107
+ /** Sets hovercard visibility.
108
+ * @remarks
109
+ * ## Why
110
+ * Delayed focus/hover flows converge on one atomic state update.
111
+ * ## Ownership and lifetime
112
+ * The Effect uses the existing RefSubject lifetime and acquires no resource.
113
+ * @example
114
+ * ```ts
115
+ * import { Effect } from "effect"
116
+ * import * as Hovercard from "@typed/ui/Hovercard"
117
+ *
118
+ * const program = Effect.gen(function* () {
119
+ * const state = yield* Hovercard.makeState({ id: "author-card" })
120
+ * yield* Hovercard.setOpen(state, true)
121
+ * })
122
+ * ```
123
+ * @since 1.0.0
124
+ * @category Open state
125
+ */
126
+ export declare function setOpen<E, R>(state: RefSubject.RefSubject<State, E, R>, open: boolean): Effect.Effect<State, E, R>;
127
+ /** Options for a hovercard anchor host.
128
+ * @remarks
129
+ * ## Why
130
+ * Pointer entry works with the default span. Keyboard focus behavior requires
131
+ * the host itself to be focusable, for example `props: { tabindex: 0 }` or a
132
+ * focusable custom host; focus and blur on descendants do not bubble to it.
133
+ * ## Ownership and lifetime
134
+ * Options are inert; rendering owns handlers/delayed effects by Scope.
135
+ * @since 1.0.0
136
+ * @category Pointer and focus anchors
137
+ */
138
+ export interface AnchorOptions extends Dom.HostOptions<HTMLSpanElement> {
139
+ /** Hydrated state shared with hovercard content.
140
+ * @remarks
141
+ * ## Why
142
+ * Its id and open state coordinate the whole compound widget.
143
+ * ## Ownership and lifetime
144
+ * The anchor borrows state; its original Scope owns it.
145
+ * @since 1.0.0
146
+ * @category State connection
147
+ */
148
+ readonly state: RefSubject.HydratedRefSubject<State, Schema.SchemaError>;
149
+ /** Anchor content.
150
+ * @remarks
151
+ * ## Why
152
+ * The wrapper retains nested content, but focusable descendants do not
153
+ * activate the default span's non-bubbling focus and blur handlers.
154
+ * ## Ownership and lifetime
155
+ * Dynamic content follows the anchor Scope.
156
+ * @since 1.0.0
157
+ * @category Rendered content
158
+ */
159
+ readonly content: Renderable.Any;
160
+ /** Milliseconds before opening.
161
+ * @remarks
162
+ * ## Why
163
+ * Delay filters incidental pointer transit.
164
+ * ## Ownership and lifetime
165
+ * New schedules invalidate older delayed updates.
166
+ * @since 1.0.0
167
+ * @category Interaction delays
168
+ */
169
+ readonly showDelay?: number;
170
+ /** Milliseconds before closing.
171
+ * @remarks
172
+ * ## Why
173
+ * Delay gives users time to move focus or pointer toward content.
174
+ * ## Ownership and lifetime
175
+ * New schedules invalidate older delayed updates.
176
+ * @since 1.0.0
177
+ * @category Interaction delays
178
+ */
179
+ readonly hideDelay?: number;
180
+ }
181
+ declare function anchorInternalProps<const Options extends AnchorOptions>(options: Options): () => {
182
+ readonly "aria-controls": RefSubject.Computed<string, Schema.SchemaError, never>;
183
+ readonly onfocus: Effect.Effect<void, Schema.SchemaError, never>;
184
+ readonly onblur: EventHandler.EventHandler<FocusEvent, Schema.SchemaError, never>;
185
+ readonly onkeydown: EventHandler.EventHandler<KeyboardEvent, Schema.SchemaError, never>;
186
+ readonly onmouseenter: Effect.Effect<void, Schema.SchemaError, never>;
187
+ readonly onmouseleave: Effect.Effect<void, Schema.SchemaError, never>;
188
+ };
189
+ type AnchorInternalProps<Options extends AnchorOptions> = ReturnType<ReturnType<typeof anchorInternalProps<Options>>>;
190
+ /** Renders an anchor coordinating pointer and optional host-focus behavior.
191
+ * @remarks
192
+ * ## Why
193
+ * The default host is a non-focusable `<span>`, so it provides pointer behavior
194
+ * only. Give the span `tabindex`, or supply a natively focusable custom host,
195
+ * for direct focus, blur, and keydown handling. Unlike a tooltip, hovercard
196
+ * content may receive focus; host blur checks `relatedTarget` and stays open
197
+ * while focus moves inside the card. Nested-anchor focus does not bubble.
198
+ * ## Ownership and lifetime
199
+ * Running the Fx owns real DOM handlers and dynamic relationships in its Scope.
200
+ * Custom hosts must preserve `aria-controls` and all supplied handlers.
201
+ * @example
202
+ * ```ts
203
+ * import { Effect } from "effect"
204
+ * import * as Hovercard from "@typed/ui/Hovercard"
205
+ *
206
+ * const program = Effect.gen(function* () {
207
+ * const state = yield* Hovercard.makeState({ id: "author-card" })
208
+ * return Hovercard.Anchor({
209
+ * state,
210
+ * content: "Ada Lovelace",
211
+ * props: { tabindex: 0 }
212
+ * })
213
+ * })
214
+ * ```
215
+ * @since 1.0.0
216
+ * @category Pointer and focus anchors
217
+ */
218
+ export declare function Anchor<const Options extends AnchorOptions, const Host extends HostResult = never>(options: Options, host?: Dom.HostOverride<Dom.RenderHostProps<Options, AnchorInternalProps<Options>>, Options["content"], Host>): Fx<RenderEvent, Renderable.Error<Options | Host>, Renderable.Services<Options | Host> | Scope.Scope | RenderTemplate>;
219
+ interface ContentOptionsBase extends Dom.HostOptions<HTMLDivElement> {
220
+ readonly state: RefSubject.HydratedRefSubject<State, Schema.SchemaError>;
221
+ readonly content: Renderable.Any;
222
+ }
223
+ type AccessibleName = {
224
+ readonly label: Renderable.Any<string | null | undefined>;
225
+ readonly labelledBy?: never;
226
+ } | {
227
+ readonly label?: never;
228
+ readonly labelledBy: Renderable.Any<string | null | undefined>;
229
+ };
230
+ /** Hovercard content options requiring one accessible naming strategy.
231
+ * @remarks
232
+ * ## Why
233
+ * Focusable dialog-like content needs an explicit name; the type makes label
234
+ * and labelled-by mutually exclusive.
235
+ *
236
+ * ## Options
237
+ *
238
+ * `state` provides the stable content id and open state, while `content` may
239
+ * contain focusable output. `label` names the card directly; `labelledBy`
240
+ * references visible naming content. Supplying both is rejected by the type.
241
+ * ## Ownership and lifetime
242
+ * Options are inert; rendering owns content/listeners/native ref by Scope.
243
+ * @since 1.0.0
244
+ * @category Native content host
245
+ */
246
+ export type ContentOptions = ContentOptionsBase & AccessibleName;
247
+ declare function contentInternalProps<const Options extends ContentOptions>(options: Options): ({ property }: Dom.InternalPropsHelpers<Options>) => {
248
+ readonly id: RefSubject.Computed<string, Schema.SchemaError, never>;
249
+ readonly role: "dialog";
250
+ readonly "aria-label": Exclude<Dom.Property<Options, "label">, Dom.Nullish> | undefined;
251
+ readonly "aria-labelledby": Exclude<Dom.Property<Options, "labelledBy">, Dom.Nullish> | undefined;
252
+ readonly popover: "manual";
253
+ readonly onfocusin: Effect.Effect<void, Schema.SchemaError, never>;
254
+ readonly onfocusout: EventHandler.EventHandler<FocusEvent, Schema.SchemaError, never>;
255
+ readonly onmouseenter: Effect.Effect<void, Schema.SchemaError, never>;
256
+ readonly onmouseleave: EventHandler.EventHandler<MouseEvent, Schema.SchemaError, never>;
257
+ readonly onkeydown: EventHandler.EventHandler<KeyboardEvent, Schema.SchemaError, never>;
258
+ readonly ontoggle: EventHandler.EventHandler<Event, Schema.SchemaError, never>;
259
+ readonly ref: import("./Dom/Refs.js").ComposedRef<RefSubject.HydratedRefSubject<State, Schema.SchemaError, never, never>, (element: HTMLElement) => Effect.Effect<void, Schema.SchemaError, Scope.Scope>> | undefined;
260
+ };
261
+ type ContentInternalProps<Options extends ContentOptions> = ReturnType<ReturnType<typeof contentInternalProps<Options>>>;
262
+ /** Renders named, focusable hovercard content in the native top layer.
263
+ * @remarks
264
+ * ## Why
265
+ * `role="dialog"` distinguishes interactive content from a tooltip. Native
266
+ * popover placement is retained, and focus/pointer transitions prevent closing
267
+ * while interaction remains inside the card.
268
+ * ## Ownership and lifetime
269
+ * Running the Fx owns handlers and NativePopover observation in its Scope. A
270
+ * custom host must preserve id, role, accessible name, manual popover,
271
+ * lifecycle handlers, and one hydration ref owner.
272
+ * @example
273
+ * ```ts
274
+ * import { Effect } from "effect"
275
+ * import * as Hovercard from "@typed/ui/Hovercard"
276
+ *
277
+ * const program = Effect.gen(function* () {
278
+ * const state = yield* Hovercard.makeState({ id: "author-card" })
279
+ * return Hovercard.Content({ state, label: "Author", content: "Mathematician" })
280
+ * })
281
+ * ```
282
+ * @since 1.0.0
283
+ * @category Native content host
284
+ */
285
+ export declare function Content<const Options extends ContentOptions, const Host extends HostResult = never>(options: Options, host?: Dom.HostOverride<Dom.RenderHostProps<Options, ContentInternalProps<Options>>, Options["content"], Host>): Fx<RenderEvent, Renderable.Error<Options | Host>, Renderable.Services<Options | Host> | Scope.Scope | RenderTemplate>;
286
+ /** Canonical widget alias for `Content`.
287
+ * @remarks
288
+ * ## Why
289
+ * The alias provides the widget name while `Content` names compound use.
290
+ * ## Ownership and lifetime
291
+ * It has exactly the same Scope and native popover ownership as `Content`.
292
+ * @since 1.0.0
293
+ * @category Native content host
294
+ */
295
+ export declare const Hovercard: typeof Content;
296
+ export {};
297
+ //# sourceMappingURL=Hovercard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Hovercard.d.ts","sourceRoot":"","sources":["../src/Hovercard.ts"],"names":[],"mappings":"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"}