foldkit 0.100.1 → 0.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/README.md +3 -2
  2. package/dist/canvas/view.d.ts +1 -1
  3. package/dist/canvas/view.d.ts.map +1 -1
  4. package/dist/canvas/view.js +5 -5
  5. package/dist/command/index.d.ts +71 -0
  6. package/dist/command/index.d.ts.map +1 -1
  7. package/dist/command/index.js +34 -1
  8. package/dist/command/public.d.ts +1 -1
  9. package/dist/command/public.d.ts.map +1 -1
  10. package/dist/command/public.js +1 -1
  11. package/dist/devTools/overlay.d.ts.map +1 -1
  12. package/dist/devTools/overlay.js +156 -149
  13. package/dist/dom/dom.d.ts +8 -11
  14. package/dist/dom/dom.d.ts.map +1 -1
  15. package/dist/dom/dom.js +8 -11
  16. package/dist/dom/elementMovement.d.ts +1 -3
  17. package/dist/dom/elementMovement.d.ts.map +1 -1
  18. package/dist/dom/elementMovement.js +1 -3
  19. package/dist/dom/inert.d.ts +2 -4
  20. package/dist/dom/inert.d.ts.map +1 -1
  21. package/dist/dom/inert.js +2 -4
  22. package/dist/dom/scrollLock.d.ts +2 -2
  23. package/dist/dom/scrollLock.js +2 -2
  24. package/dist/dom/waitForAnimation.d.ts +1 -1
  25. package/dist/dom/waitForAnimation.js +1 -1
  26. package/dist/html/boundary.d.ts +98 -0
  27. package/dist/html/boundary.d.ts.map +1 -0
  28. package/dist/html/boundary.js +176 -0
  29. package/dist/html/childAttribute.d.ts +44 -0
  30. package/dist/html/childAttribute.d.ts.map +1 -0
  31. package/dist/html/childAttribute.js +34 -0
  32. package/dist/html/index.d.ts +70 -23
  33. package/dist/html/index.d.ts.map +1 -1
  34. package/dist/html/index.js +639 -575
  35. package/dist/html/lazy.d.ts +12 -7
  36. package/dist/html/lazy.d.ts.map +1 -1
  37. package/dist/html/lazy.js +30 -11
  38. package/dist/html/public.d.ts +2 -2
  39. package/dist/html/public.d.ts.map +1 -1
  40. package/dist/html/public.js +1 -1
  41. package/dist/html/runtimeSingleton.d.ts +72 -0
  42. package/dist/html/runtimeSingleton.d.ts.map +1 -0
  43. package/dist/html/runtimeSingleton.js +112 -0
  44. package/dist/html/submodel.d.ts +98 -0
  45. package/dist/html/submodel.d.ts.map +1 -0
  46. package/dist/html/submodel.js +190 -0
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -0
  50. package/dist/render/render.d.ts +1 -1
  51. package/dist/render/render.js +1 -1
  52. package/dist/runtime/messagePriority.d.ts +5 -1
  53. package/dist/runtime/messagePriority.d.ts.map +1 -1
  54. package/dist/runtime/messagePriority.js +25 -4
  55. package/dist/runtime/runtime.d.ts +11 -11
  56. package/dist/runtime/runtime.d.ts.map +1 -1
  57. package/dist/runtime/runtime.js +118 -63
  58. package/dist/runtime/subscription.d.ts +139 -19
  59. package/dist/runtime/subscription.d.ts.map +1 -1
  60. package/dist/runtime/subscription.js +90 -9
  61. package/dist/submodel/public.d.ts +4 -0
  62. package/dist/submodel/public.d.ts.map +1 -0
  63. package/dist/submodel/public.js +1 -0
  64. package/dist/submodel/submodel.d.ts +32 -0
  65. package/dist/submodel/submodel.d.ts.map +1 -0
  66. package/dist/submodel/submodel.js +1 -0
  67. package/dist/subscription/animationFrame.d.ts +23 -26
  68. package/dist/subscription/animationFrame.d.ts.map +1 -1
  69. package/dist/subscription/animationFrame.js +17 -18
  70. package/dist/subscription/public.d.ts +2 -2
  71. package/dist/subscription/public.d.ts.map +1 -1
  72. package/dist/subscription/public.js +1 -1
  73. package/dist/test/apps/disabledButton.d.ts +4 -5
  74. package/dist/test/apps/disabledButton.d.ts.map +1 -1
  75. package/dist/test/apps/disabledButton.js +16 -16
  76. package/dist/test/scene.d.ts +8 -8
  77. package/dist/test/scene.d.ts.map +1 -1
  78. package/dist/test/scene.js +25 -13
  79. package/dist/test/story.d.ts +15 -8
  80. package/dist/test/story.d.ts.map +1 -1
  81. package/dist/test/story.js +21 -9
  82. package/dist/ui/animation/index.d.ts +30 -14
  83. package/dist/ui/animation/index.d.ts.map +1 -1
  84. package/dist/ui/animation/index.js +9 -19
  85. package/dist/ui/animation/public.d.ts +2 -2
  86. package/dist/ui/animation/public.d.ts.map +1 -1
  87. package/dist/ui/animation/public.js +1 -1
  88. package/dist/ui/calendar/index.d.ts +199 -84
  89. package/dist/ui/calendar/index.d.ts.map +1 -1
  90. package/dist/ui/calendar/index.js +129 -140
  91. package/dist/ui/calendar/public.d.ts +2 -2
  92. package/dist/ui/calendar/public.d.ts.map +1 -1
  93. package/dist/ui/calendar/public.js +1 -1
  94. package/dist/ui/checkbox/index.d.ts +93 -21
  95. package/dist/ui/checkbox/index.d.ts.map +1 -1
  96. package/dist/ui/checkbox/index.js +62 -33
  97. package/dist/ui/checkbox/public.d.ts +2 -2
  98. package/dist/ui/checkbox/public.d.ts.map +1 -1
  99. package/dist/ui/checkbox/public.js +1 -1
  100. package/dist/ui/combobox/multi.d.ts +35 -91
  101. package/dist/ui/combobox/multi.d.ts.map +1 -1
  102. package/dist/ui/combobox/multi.js +34 -17
  103. package/dist/ui/combobox/multiPublic.d.ts +2 -2
  104. package/dist/ui/combobox/multiPublic.d.ts.map +1 -1
  105. package/dist/ui/combobox/multiPublic.js +1 -1
  106. package/dist/ui/combobox/public.d.ts +3 -3
  107. package/dist/ui/combobox/public.d.ts.map +1 -1
  108. package/dist/ui/combobox/public.js +2 -2
  109. package/dist/ui/combobox/shared.d.ts +56 -31
  110. package/dist/ui/combobox/shared.d.ts.map +1 -1
  111. package/dist/ui/combobox/shared.js +333 -322
  112. package/dist/ui/combobox/single.d.ts +46 -93
  113. package/dist/ui/combobox/single.d.ts.map +1 -1
  114. package/dist/ui/combobox/single.js +44 -17
  115. package/dist/ui/datePicker/index.d.ts +256 -48
  116. package/dist/ui/datePicker/index.d.ts.map +1 -1
  117. package/dist/ui/datePicker/index.js +149 -104
  118. package/dist/ui/datePicker/public.d.ts +2 -2
  119. package/dist/ui/datePicker/public.d.ts.map +1 -1
  120. package/dist/ui/datePicker/public.js +1 -1
  121. package/dist/ui/dialog/index.d.ts +95 -39
  122. package/dist/ui/dialog/index.d.ts.map +1 -1
  123. package/dist/ui/dialog/index.js +71 -62
  124. package/dist/ui/dialog/public.d.ts +2 -2
  125. package/dist/ui/dialog/public.d.ts.map +1 -1
  126. package/dist/ui/dialog/public.js +1 -1
  127. package/dist/ui/disclosure/index.d.ts +71 -31
  128. package/dist/ui/disclosure/index.d.ts.map +1 -1
  129. package/dist/ui/disclosure/index.js +57 -62
  130. package/dist/ui/disclosure/public.d.ts +2 -2
  131. package/dist/ui/disclosure/public.d.ts.map +1 -1
  132. package/dist/ui/disclosure/public.js +1 -1
  133. package/dist/ui/dragAndDrop/index.d.ts +385 -103
  134. package/dist/ui/dragAndDrop/index.d.ts.map +1 -1
  135. package/dist/ui/dragAndDrop/index.js +26 -31
  136. package/dist/ui/dragAndDrop/public.d.ts +1 -1
  137. package/dist/ui/dragAndDrop/public.d.ts.map +1 -1
  138. package/dist/ui/dragAndDrop/public.js +1 -1
  139. package/dist/ui/fileDrop/index.d.ts +42 -46
  140. package/dist/ui/fileDrop/index.d.ts.map +1 -1
  141. package/dist/ui/fileDrop/index.js +30 -46
  142. package/dist/ui/fileDrop/public.d.ts +2 -2
  143. package/dist/ui/fileDrop/public.d.ts.map +1 -1
  144. package/dist/ui/fileDrop/public.js +1 -1
  145. package/dist/ui/listbox/multi.d.ts +39 -84
  146. package/dist/ui/listbox/multi.d.ts.map +1 -1
  147. package/dist/ui/listbox/multi.js +38 -20
  148. package/dist/ui/listbox/multiPublic.d.ts +2 -2
  149. package/dist/ui/listbox/multiPublic.d.ts.map +1 -1
  150. package/dist/ui/listbox/multiPublic.js +1 -1
  151. package/dist/ui/listbox/public.d.ts +3 -3
  152. package/dist/ui/listbox/public.d.ts.map +1 -1
  153. package/dist/ui/listbox/public.js +2 -2
  154. package/dist/ui/listbox/shared.d.ts +71 -30
  155. package/dist/ui/listbox/shared.d.ts.map +1 -1
  156. package/dist/ui/listbox/shared.js +319 -296
  157. package/dist/ui/listbox/single.d.ts +57 -85
  158. package/dist/ui/listbox/single.d.ts.map +1 -1
  159. package/dist/ui/listbox/single.js +48 -24
  160. package/dist/ui/menu/index.d.ts +80 -36
  161. package/dist/ui/menu/index.d.ts.map +1 -1
  162. package/dist/ui/menu/index.js +117 -86
  163. package/dist/ui/menu/public.d.ts +2 -2
  164. package/dist/ui/menu/public.d.ts.map +1 -1
  165. package/dist/ui/menu/public.js +1 -1
  166. package/dist/ui/popover/index.d.ts +117 -44
  167. package/dist/ui/popover/index.d.ts.map +1 -1
  168. package/dist/ui/popover/index.js +88 -101
  169. package/dist/ui/popover/public.d.ts +2 -2
  170. package/dist/ui/popover/public.d.ts.map +1 -1
  171. package/dist/ui/popover/public.js +1 -1
  172. package/dist/ui/radioGroup/index.d.ts +122 -45
  173. package/dist/ui/radioGroup/index.d.ts.map +1 -1
  174. package/dist/ui/radioGroup/index.js +111 -72
  175. package/dist/ui/radioGroup/public.d.ts +2 -2
  176. package/dist/ui/radioGroup/public.d.ts.map +1 -1
  177. package/dist/ui/radioGroup/public.js +1 -1
  178. package/dist/ui/slider/index.d.ts +247 -103
  179. package/dist/ui/slider/index.d.ts.map +1 -1
  180. package/dist/ui/slider/index.js +52 -68
  181. package/dist/ui/slider/public.d.ts +2 -2
  182. package/dist/ui/slider/public.d.ts.map +1 -1
  183. package/dist/ui/slider/public.js +1 -1
  184. package/dist/ui/switch/index.d.ts +74 -21
  185. package/dist/ui/switch/index.d.ts.map +1 -1
  186. package/dist/ui/switch/index.js +62 -33
  187. package/dist/ui/switch/public.d.ts +2 -2
  188. package/dist/ui/switch/public.d.ts.map +1 -1
  189. package/dist/ui/switch/public.js +1 -1
  190. package/dist/ui/tabs/index.d.ts +107 -45
  191. package/dist/ui/tabs/index.d.ts.map +1 -1
  192. package/dist/ui/tabs/index.js +99 -81
  193. package/dist/ui/tabs/public.d.ts +2 -2
  194. package/dist/ui/tabs/public.d.ts.map +1 -1
  195. package/dist/ui/tabs/public.js +1 -1
  196. package/dist/ui/toast/index.d.ts +93 -109
  197. package/dist/ui/toast/index.d.ts.map +1 -1
  198. package/dist/ui/toast/index.js +16 -29
  199. package/dist/ui/toast/schema.d.ts +15 -4
  200. package/dist/ui/toast/schema.d.ts.map +1 -1
  201. package/dist/ui/toast/schema.js +11 -4
  202. package/dist/ui/toast/update.d.ts +36 -18
  203. package/dist/ui/toast/update.d.ts.map +1 -1
  204. package/dist/ui/toast/update.js +33 -14
  205. package/dist/ui/tooltip/index.d.ts +94 -42
  206. package/dist/ui/tooltip/index.d.ts.map +1 -1
  207. package/dist/ui/tooltip/index.js +64 -73
  208. package/dist/ui/tooltip/public.d.ts +2 -2
  209. package/dist/ui/tooltip/public.d.ts.map +1 -1
  210. package/dist/ui/tooltip/public.js +1 -1
  211. package/dist/ui/virtualList/index.d.ts +63 -80
  212. package/dist/ui/virtualList/index.d.ts.map +1 -1
  213. package/dist/ui/virtualList/index.js +22 -49
  214. package/dist/ui/virtualList/public.d.ts +2 -2
  215. package/dist/ui/virtualList/public.d.ts.map +1 -1
  216. package/dist/ui/virtualList/public.js +1 -1
  217. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
- import { Schema as S } from 'effect';
1
+ import { Option, Schema as S } from 'effect';
2
2
  import type { Command } from '../../command/index.js';
3
- import { type Attribute, type Html } from '../../html/index.js';
3
+ import { type ChildAttribute, type Html } from '../../html/index.js';
4
+ import type { Reflect } from '../../submodel/submodel.js';
4
5
  /** Schema for the switch component's state, tracking the toggle's checked status. */
5
6
  export declare const Model: S.Struct<{
6
7
  readonly id: S.String;
@@ -9,10 +10,35 @@ export declare const Model: S.Struct<{
9
10
  export type Model = typeof Model.Type;
10
11
  /** Sent when the user toggles the switch via click or Space key. */
11
12
  export declare const Toggled: import("../../schema/index.js").CallableTaggedStruct<"Toggled", {}>;
13
+ /** Sent to set the checked state to a specific value. Use this for
14
+ * programmatic state assignment (e.g. a "select all" handler that forces
15
+ * all child switches to the same state) where `Toggled`'s flip semantics
16
+ * would not reliably reach the desired state. */
17
+ export declare const SetChecked: import("../../schema/index.js").CallableTaggedStruct<"SetChecked", {
18
+ isChecked: S.Boolean;
19
+ }>;
12
20
  /** Schema for all messages the switch component can produce. */
13
- export declare const Message: import("../../schema/index.js").CallableTaggedStruct<"Toggled", {}>;
21
+ export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"Toggled", {}>, import("../../schema/index.js").CallableTaggedStruct<"SetChecked", {
22
+ isChecked: S.Boolean;
23
+ }>]>;
14
24
  export type Toggled = typeof Toggled.Type;
25
+ export type SetChecked = typeof SetChecked.Type;
15
26
  export type Message = typeof Message.Type;
27
+ /** Sent to the parent each time the switch toggles. Carries the new
28
+ * checked state. Consumers pattern-match this in their `GotSwitchMessage`
29
+ * handler to lift the toggle into a domain Message (e.g., persisting the
30
+ * setting, dispatching a sync command). */
31
+ export declare const ToggledChecked: import("../../schema/index.js").CallableTaggedStruct<"ToggledChecked", {
32
+ isChecked: S.Boolean;
33
+ }>;
34
+ /** Union of out-messages the switch component can produce. Surfaced as
35
+ * the third element of `update`'s return tuple and pattern-matched by
36
+ * the parent. */
37
+ export declare const OutMessage: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ToggledChecked", {
38
+ isChecked: S.Boolean;
39
+ }>]>;
40
+ export type ToggledChecked = typeof ToggledChecked.Type;
41
+ export type OutMessage = typeof OutMessage.Type;
16
42
  /** Configuration for creating a switch model with `init`. */
17
43
  export type InitConfig = Readonly<{
18
44
  id: string;
@@ -20,27 +46,54 @@ export type InitConfig = Readonly<{
20
46
  }>;
21
47
  /** Creates an initial switch model from a config. Defaults to unchecked. */
22
48
  export declare const init: (config: InitConfig) => Model;
23
- /** Processes a switch message and returns the next model and commands. */
24
- export declare const update: (model: Model, _message: Message) => readonly [Model, ReadonlyArray<Command<Message>>];
25
- /** Attribute groups the switch component provides to the consumer's `toView` callback. */
26
- export type SwitchAttributes<ParentMessage> = Readonly<{
27
- button: ReadonlyArray<Attribute<ParentMessage>>;
28
- label: ReadonlyArray<Attribute<ParentMessage>>;
29
- description: ReadonlyArray<Attribute<ParentMessage>>;
30
- hiddenInput: ReadonlyArray<Attribute<ParentMessage>>;
49
+ /** Processes a switch message and returns the next model, commands, and
50
+ * a `ToggledChecked` OutMessage carrying the new checked state. */
51
+ export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<Command<Message>>, Option.Option<OutMessage>];
52
+ /** Programmatically sets the checked state. Emits a `ToggledChecked`
53
+ * OutMessage just like a user-initiated toggle. Use this in domain-event
54
+ * handlers where you need to force a specific state. */
55
+ export declare const setChecked: (model: Model, isChecked: boolean) => readonly [Model, ReadonlyArray<Command<Message>>, Option.Option<OutMessage>];
56
+ /** Reflects an externally-sourced checked state onto the model without
57
+ * emitting an OutMessage. Use this to mirror external truth (saved
58
+ * settings, a server value) onto the switch without triggering the
59
+ * downstream reaction a user toggle would cause. Contrast with
60
+ * `setChecked`, which emits `ToggledChecked` so the parent reacts to a
61
+ * programmatic assignment the same way it reacts to a user toggle. Returns
62
+ * the model directly because it produces no commands and no OutMessage. */
63
+ export declare const reflectChecked: Reflect<Model, boolean>;
64
+ /** Attribute groups the switch component provides to the consumer's
65
+ * `toView` callback. Each group is a `ReadonlyArray<ChildAttribute>`
66
+ * whose event handlers dispatch through the Switch's boundary at
67
+ * event-fire time. See {@link Checkbox.CheckboxAttributes} for the full
68
+ * routing model. */
69
+ export type SwitchAttributes = Readonly<{
70
+ button: ReadonlyArray<ChildAttribute>;
71
+ label: ReadonlyArray<ChildAttribute>;
72
+ description: ReadonlyArray<ChildAttribute>;
73
+ hiddenInput: ReadonlyArray<ChildAttribute>;
31
74
  }>;
32
- /** Configuration for rendering a switch with `view`. */
33
- export type ViewConfig<ParentMessage> = Readonly<{
34
- model: Model;
35
- toParentMessage: (message: Toggled) => ParentMessage;
36
- toView: (attributes: SwitchAttributes<ParentMessage>) => Html;
75
+ /** Per-render view inputs passed to `view` via `h.submodel`'s `viewInputs` field. */
76
+ export type ViewInputs = Readonly<{
77
+ toView: (attributes: SwitchAttributes) => Html;
37
78
  isDisabled?: boolean;
38
79
  name?: string;
39
80
  value?: string;
40
81
  }>;
41
- /** Renders an accessible switch toggle by building ARIA attribute groups and delegating layout to the consumer's `toView` callback. */
42
- export declare const view: <ParentMessage>(config: ViewConfig<ParentMessage>) => Html;
43
- /** Creates a memoized switch view. Static config is captured in a closure;
44
- * only `model` and `toParentMessage` are compared per render via `createLazy`. */
45
- export declare const lazy: <ParentMessage>(staticConfig: Omit<ViewConfig<ParentMessage>, "model" | "toParentMessage">) => ((model: Model, toParentMessage: ViewConfig<ParentMessage>["toParentMessage"]) => Html);
82
+ /** Renders an accessible switch toggle by building ARIA attribute groups
83
+ * and delegating layout to the consumer's `toView` callback. Designed
84
+ * to be embedded via `h.submodel`. */
85
+ export declare const view: import("../../html/submodel.js").SubmodelView<{
86
+ readonly id: string;
87
+ readonly isChecked: boolean;
88
+ }, {
89
+ readonly _tag: "Toggled";
90
+ } | {
91
+ readonly _tag: "SetChecked";
92
+ readonly isChecked: boolean;
93
+ }, Readonly<{
94
+ toView: (attributes: SwitchAttributes) => Html;
95
+ isDisabled?: boolean;
96
+ name?: string;
97
+ value?: string;
98
+ }>>;
46
99
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/switch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EACL,KAAK,SAAS,EACd,KAAK,IAAI,EAGV,MAAM,qBAAqB,CAAA;AAM5B,qFAAqF;AACrF,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,oEAAoE;AACpE,eAAO,MAAM,OAAO,qEAAe,CAAA;AAEnC,gEAAgE;AAChE,eAAO,MAAM,OAAO,qEAAU,CAAA;AAE9B,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAC,CAAA;AAEF,4EAA4E;AAC5E,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAIF,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,UAAU,OAAO,KAChB,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAGlD,CAAA;AAID,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,CAAC,aAAa,IAAI,QAAQ,CAAC;IACrD,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/C,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;IAC9C,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;IACpD,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;CACrD,CAAC,CAAA;AAEF,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,aAAa,IAAI,QAAQ,CAAC;IAC/C,KAAK,EAAE,KAAK,CAAA;IACZ,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,aAAa,CAAA;IACpD,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,aAAa,CAAC,KAAK,IAAI,CAAA;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAAA;AAKF,uIAAuI;AACvI,eAAO,MAAM,IAAI,GAAI,aAAa,EAChC,QAAQ,UAAU,CAAC,aAAa,CAAC,KAChC,IAwDF,CAAA;AAED;mFACmF;AACnF,eAAO,MAAM,IAAI,GAAI,aAAa,EAChC,cAAc,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC,KACzE,CAAC,CACF,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,KAC1D,IAAI,CAgBR,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/switch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,IAAI,EAIV,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAIzD,qFAAqF;AACrF,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,oEAAoE;AACpE,eAAO,MAAM,OAAO,qEAAe,CAAA;AAEnC;;;kDAGkD;AAClD,eAAO,MAAM,UAAU;;EAA4C,CAAA;AAEnE,gEAAgE;AAChE,eAAO,MAAM,OAAO;;IAAiC,CAAA;AAErD,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC;;;4CAG4C;AAC5C,eAAO,MAAM,cAAc;;EAAgD,CAAA;AAE3E;;kBAEkB;AAClB,eAAO,MAAM,UAAU;;IAA4B,CAAA;AAEnD,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AACvD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAI/C,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAC,CAAA;AAEF,4EAA4E;AAC5E,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAIF;oEACoE;AACpE,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CACV,KAAK,EACL,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAC/B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAyBxB,CAAA;AAEH;;yDAEyD;AACzD,eAAO,MAAM,UAAU,GACrB,OAAO,KAAK,EACZ,WAAW,OAAO,KACjB,SAAS,CACV,KAAK,EACL,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAC/B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CACkB,CAAA;AAE7C;;;;;;4EAM4E;AAC5E,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAIlD,CAAA;AAID;;;;qBAIqB;AACrB,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IACrC,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IACpC,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAC1C,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;CAC3C,CAAC,CAAA;AAEF,qFAAqF;AACrF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC,CAAA;AAKF;;uCAEuC;AACvC,eAAO,MAAM,IAAI;;;;;;;;;YAZP,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI;iBACjC,OAAO;WACb,MAAM;YACL,MAAM;GA2Df,CAAA"}
@@ -1,5 +1,5 @@
1
- import { Match as M, Option, Schema as S } from 'effect';
2
- import { createLazy, html, } from '../../html/index.js';
1
+ import { Function, Match as M, Option, Schema as S } from 'effect';
2
+ import { childAttributes, defineView, html, } from '../../html/index.js';
3
3
  import { m } from '../../message/index.js';
4
4
  import { evo } from '../../struct/index.js';
5
5
  // MODEL
@@ -11,26 +11,68 @@ export const Model = S.Struct({
11
11
  // MESSAGE
12
12
  /** Sent when the user toggles the switch via click or Space key. */
13
13
  export const Toggled = m('Toggled');
14
+ /** Sent to set the checked state to a specific value. Use this for
15
+ * programmatic state assignment (e.g. a "select all" handler that forces
16
+ * all child switches to the same state) where `Toggled`'s flip semantics
17
+ * would not reliably reach the desired state. */
18
+ export const SetChecked = m('SetChecked', { isChecked: S.Boolean });
14
19
  /** Schema for all messages the switch component can produce. */
15
- export const Message = Toggled;
20
+ export const Message = S.Union([Toggled, SetChecked]);
21
+ // OUT MESSAGE
22
+ /** Sent to the parent each time the switch toggles. Carries the new
23
+ * checked state. Consumers pattern-match this in their `GotSwitchMessage`
24
+ * handler to lift the toggle into a domain Message (e.g., persisting the
25
+ * setting, dispatching a sync command). */
26
+ export const ToggledChecked = m('ToggledChecked', { isChecked: S.Boolean });
27
+ /** Union of out-messages the switch component can produce. Surfaced as
28
+ * the third element of `update`'s return tuple and pattern-matched by
29
+ * the parent. */
30
+ export const OutMessage = S.Union([ToggledChecked]);
16
31
  /** Creates an initial switch model from a config. Defaults to unchecked. */
17
32
  export const init = (config) => ({
18
33
  id: config.id,
19
34
  isChecked: config.isChecked ?? false,
20
35
  });
21
36
  // UPDATE
22
- /** Processes a switch message and returns the next model and commands. */
23
- export const update = (model, _message) => [
24
- evo(model, { isChecked: isChecked => !isChecked }),
25
- [],
26
- ];
37
+ /** Processes a switch message and returns the next model, commands, and
38
+ * a `ToggledChecked` OutMessage carrying the new checked state. */
39
+ export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
40
+ Toggled: () => {
41
+ const nextIsChecked = !model.isChecked;
42
+ return [
43
+ evo(model, { isChecked: () => nextIsChecked }),
44
+ [],
45
+ Option.some(ToggledChecked({ isChecked: nextIsChecked })),
46
+ ];
47
+ },
48
+ SetChecked: ({ isChecked }) => [
49
+ evo(model, { isChecked: () => isChecked }),
50
+ [],
51
+ Option.some(ToggledChecked({ isChecked })),
52
+ ],
53
+ }));
54
+ /** Programmatically sets the checked state. Emits a `ToggledChecked`
55
+ * OutMessage just like a user-initiated toggle. Use this in domain-event
56
+ * handlers where you need to force a specific state. */
57
+ export const setChecked = (model, isChecked) => update(model, SetChecked({ isChecked }));
58
+ /** Reflects an externally-sourced checked state onto the model without
59
+ * emitting an OutMessage. Use this to mirror external truth (saved
60
+ * settings, a server value) onto the switch without triggering the
61
+ * downstream reaction a user toggle would cause. Contrast with
62
+ * `setChecked`, which emits `ToggledChecked` so the parent reacts to a
63
+ * programmatic assignment the same way it reacts to a user toggle. Returns
64
+ * the model directly because it produces no commands and no OutMessage. */
65
+ export const reflectChecked = Function.dual(2, (model, isChecked) => evo(model, { isChecked: () => isChecked }));
27
66
  const labelId = (id) => `${id}-label`;
28
67
  const descriptionId = (id) => `${id}-description`;
29
- /** Renders an accessible switch toggle by building ARIA attribute groups and delegating layout to the consumer's `toView` callback. */
30
- export const view = (config) => {
68
+ /** Renders an accessible switch toggle by building ARIA attribute groups
69
+ * and delegating layout to the consumer's `toView` callback. Designed
70
+ * to be embedded via `h.submodel`. */
71
+ export const view = defineView((model, viewInputs) => {
31
72
  const h = html();
32
- const { model: { id, isChecked }, toParentMessage, isDisabled = false, name, value: formValue = 'on', } = config;
33
- const handleKeyUp = (key) => M.value(key).pipe(M.when(' ', () => Option.some(toParentMessage(Toggled()))), M.orElse(() => Option.none()));
73
+ const { id, isChecked } = model;
74
+ const { isDisabled = false, name, value: formValue = 'on' } = viewInputs;
75
+ const handleKeyUp = (key) => M.value(key).pipe(M.when(' ', () => Option.some(Toggled())), M.orElse(() => Option.none()));
34
76
  const checkedAttributes = isChecked ? [h.DataAttribute('checked', '')] : [];
35
77
  const disabledAttributes = isDisabled
36
78
  ? [h.AriaDisabled(true), h.DataAttribute('disabled', '')]
@@ -45,33 +87,20 @@ export const view = (config) => {
45
87
  ...disabledAttributes,
46
88
  ...(isDisabled
47
89
  ? []
48
- : [
49
- h.OnClick(toParentMessage(Toggled())),
50
- h.OnKeyUpPreventDefault(handleKeyUp),
51
- ]),
90
+ : [h.OnClick(Toggled()), h.OnKeyUpPreventDefault(handleKeyUp)]),
52
91
  ];
53
92
  const labelAttributes = [
54
93
  h.Id(labelId(id)),
55
- ...(isDisabled ? [] : [h.OnClick(toParentMessage(Toggled()))]),
94
+ ...(isDisabled ? [] : [h.OnClick(Toggled())]),
56
95
  ];
57
96
  const descriptionAttributes = [h.Id(descriptionId(id))];
58
97
  const hiddenInputAttributes = name
59
98
  ? [h.Type('hidden'), h.Name(name), h.Value(isChecked ? formValue : '')]
60
99
  : [];
61
- return config.toView({
62
- button: buttonAttributes,
63
- label: labelAttributes,
64
- description: descriptionAttributes,
65
- hiddenInput: hiddenInputAttributes,
100
+ return viewInputs.toView({
101
+ button: childAttributes(buttonAttributes),
102
+ label: childAttributes(labelAttributes),
103
+ description: childAttributes(descriptionAttributes),
104
+ hiddenInput: childAttributes(hiddenInputAttributes),
66
105
  });
67
- };
68
- /** Creates a memoized switch view. Static config is captured in a closure;
69
- * only `model` and `toParentMessage` are compared per render via `createLazy`. */
70
- export const lazy = (staticConfig) => {
71
- const lazyView = createLazy();
72
- return (model, toParentMessage) => lazyView((currentModel, currentToParentMessage) => view({
73
- ...staticConfig,
74
- model: currentModel,
75
- toParentMessage: currentToParentMessage,
76
- }), [model, toParentMessage]);
77
- };
106
+ });
@@ -1,3 +1,3 @@
1
- export { init, update, view, lazy, Model, Message } from './index.js';
2
- export type { Toggled, InitConfig, ViewConfig, SwitchAttributes, } from './index.js';
1
+ export { init, update, setChecked, reflectChecked, view, Model, Message, OutMessage, SetChecked, ToggledChecked, } from './index.js';
2
+ export type { Toggled, InitConfig, ViewInputs, SwitchAttributes, } from './index.js';
3
3
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/switch/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAErE,YAAY,EACV,OAAO,EACP,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/switch/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,UAAU,EACV,cAAc,EACd,IAAI,EACJ,KAAK,EACL,OAAO,EACP,UAAU,EACV,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,OAAO,EACP,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAA"}
@@ -1 +1 @@
1
- export { init, update, view, lazy, Model, Message } from './index.js';
1
+ export { init, update, setChecked, reflectChecked, view, Model, Message, OutMessage, SetChecked, ToggledChecked, } from './index.js';
@@ -1,6 +1,7 @@
1
- import { Effect, Schema as S } from 'effect';
1
+ import { Effect, Option, Schema as S } from 'effect';
2
2
  import * as Command from '../../command/index.js';
3
- import { type Attribute, type Html, type TagName } from '../../html/index.js';
3
+ import { type ChildAttribute, type Html, type SubmodelView } from '../../html/index.js';
4
+ import type { Reflect2 } from '../../submodel/submodel.js';
4
5
  export { wrapIndex, findFirstEnabledIndex, keyToIndex } from '../keyboard.js';
5
6
  /** Controls the tab list layout direction and which arrow keys navigate between tabs. */
6
7
  export declare const Orientation: S.Literals<readonly ["Horizontal", "Vertical"]>;
@@ -17,24 +18,44 @@ export declare const Model: S.Struct<{
17
18
  }>;
18
19
  export type Model = typeof Model.Type;
19
20
  /** Sent when a tab is selected via click or keyboard. Updates both the active and focused indices. */
20
- export declare const TabSelected: import("../../schema/index.js").CallableTaggedStruct<"TabSelected", {
21
+ export declare const SelectedTab: import("../../schema/index.js").CallableTaggedStruct<"SelectedTab", {
21
22
  index: S.Number;
23
+ value: S.String;
22
24
  }>;
23
25
  /** Sent when a tab receives keyboard focus in `Manual` mode without being activated. */
24
- export declare const TabFocused: import("../../schema/index.js").CallableTaggedStruct<"TabFocused", {
26
+ export declare const FocusedTab: import("../../schema/index.js").CallableTaggedStruct<"FocusedTab", {
25
27
  index: S.Number;
26
28
  }>;
27
29
  /** Sent when the focus-tab command completes. */
28
30
  export declare const CompletedFocusTab: import("../../schema/index.js").CallableTaggedStruct<"CompletedFocusTab", {}>;
29
31
  /** Union of all messages the tabs component can produce. */
30
32
  export declare const Message: S.Union<[
31
- typeof TabSelected,
32
- typeof TabFocused,
33
+ typeof SelectedTab,
34
+ typeof FocusedTab,
33
35
  typeof CompletedFocusTab
34
36
  ]>;
35
- export type TabSelected = typeof TabSelected.Type;
36
- export type TabFocused = typeof TabFocused.Type;
37
+ export type SelectedTab = typeof SelectedTab.Type;
38
+ export type FocusedTab = typeof FocusedTab.Type;
37
39
  export type Message = typeof Message.Type;
40
+ /** Sent to the parent when a tab is committed via click or keyboard. Carries both the tab's value (typed as `Value` via `Ui.Tabs.create<Value>()`) and its index. Generic at the type level; the schema stores `value: string` and the factory's fenced cast types it as `Value`. */
41
+ export declare const Selected: import("../../schema/index.js").CallableTaggedStruct<"Selected", {
42
+ value: S.String;
43
+ index: S.Number;
44
+ }>;
45
+ export type Selected<Value extends string = string> = Readonly<{
46
+ readonly _tag: 'Selected';
47
+ readonly value: Value;
48
+ readonly index: number;
49
+ }>;
50
+ /** Union of out-messages the tabs component can produce. Surfaced as the third element of `update`'s return tuple and pattern-matched by the parent. */
51
+ export declare const OutMessage: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"Selected", {
52
+ value: S.String;
53
+ index: S.Number;
54
+ }>]>;
55
+ /** Generic over `Value extends string` so consumers using
56
+ * `Ui.Tabs.create<MyUnion>()` receive `value: MyUnion` in the
57
+ * `Selected` OutMessage. Defaults to `string`. */
58
+ export type OutMessage<Value extends string = string> = Selected<Value>;
38
59
  /** Configuration for creating a tabs model with `init`. */
39
60
  export type InitConfig = Readonly<{
40
61
  id: string;
@@ -50,44 +71,85 @@ export declare const FocusTab: Command.CommandDefinitionWithArgs<"FocusTab", {
50
71
  }, Effect.Effect<{
51
72
  readonly _tag: "CompletedFocusTab";
52
73
  }, never, never>>;
53
- /** Processes a tabs message and returns the next model and commands. */
54
- export declare const update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<Command.Command<Message>>];
55
- /** Configuration for an individual tab's button and panel content. */
56
- export type TabConfig<ParentMessage = unknown> = Readonly<{
57
- buttonClassName?: string;
58
- buttonAttributes?: ReadonlyArray<Attribute<ParentMessage>>;
59
- buttonContent: Html;
60
- panelClassName?: string;
61
- panelAttributes?: ReadonlyArray<Attribute<ParentMessage>>;
62
- panelContent: Html;
74
+ type UpdateReturn = readonly [
75
+ Model,
76
+ ReadonlyArray<Command.Command<Message>>,
77
+ Option.Option<OutMessage>
78
+ ];
79
+ /** Processes a tabs message and returns the next model, commands, and an optional OutMessage. `Selected` fires when a tab is committed via click or keyboard. */
80
+ export declare const update: (model: Model, message: Message) => UpdateReturn;
81
+ /** Programmatically selects a tab. Emits a `Selected` OutMessage. */
82
+ export declare const selectTab: (model: Model, value: string, index: number) => UpdateReturn;
83
+ /** Reflects an externally-sourced active tab onto the model without
84
+ * emitting an OutMessage or running the focus command. Use this to mirror
85
+ * external truth (a deep link, restored storage) onto the active tab.
86
+ * Contrast with `selectTab`, which represents a user or programmatic
87
+ * *choice*: it focuses the tab and emits `Selected`. Takes the tab `value`
88
+ * plus the `options` list (mirroring `RadioGroup.select`) because Tabs
89
+ * stores the active *index* internally, so the value is resolved to an
90
+ * index. A value not present in `options` is a no-op. Returns the model
91
+ * directly because it produces no commands and no OutMessage. */
92
+ export declare const reflectSelectedTab: Reflect2<Model, string, ReadonlyArray<string>>;
93
+ /** Per-tab render info passed to the consumer's `toView`. Generic over
94
+ * `Value extends string`: when `Ui.Tabs.create<MyUnion>()` is declared,
95
+ * `tab.value` is typed `MyUnion` so the consumer can switch on it without
96
+ * casting. */
97
+ export type TabInfo<Value extends string = string> = Readonly<{
98
+ value: Value;
99
+ index: number;
100
+ isActive: boolean;
101
+ isFocused: boolean;
102
+ isDisabled: boolean;
103
+ tab: ReadonlyArray<ChildAttribute>;
104
+ panel: ReadonlyArray<ChildAttribute>;
105
+ }>;
106
+ /** Render-time payload published to the consumer's `toView`.
107
+ *
108
+ * - `tablist`: ARIA + role attributes for the wrapping tablist element.
109
+ * - `tabs`: one entry per tab in `viewInputs.tabs`, in the same order, with
110
+ * the tab button's attribute bundle, the panel's attribute bundle,
111
+ * and derived state.
112
+ * - `activeIndex`: the currently-active tab index, convenient when the
113
+ * consumer wants to render only the active panel (vs all panels with
114
+ * `Hidden` for transitions). */
115
+ export type RenderInfo<Value extends string = string> = Readonly<{
116
+ tablist: ReadonlyArray<ChildAttribute>;
117
+ tabs: ReadonlyArray<TabInfo<Value>>;
118
+ activeIndex: number;
63
119
  }>;
64
- /** Configuration for rendering a tab group with `view`. */
65
- export type ViewConfig<ParentMessage, Tab extends string> = Readonly<{
66
- model: Model;
67
- toParentMessage: (message: TabSelected | TabFocused) => ParentMessage;
68
- onTabSelected?: (index: number) => ParentMessage;
69
- tabs: ReadonlyArray<Tab>;
70
- tabToConfig: (tab: Tab, context: {
71
- isActive: boolean;
72
- }) => TabConfig<ParentMessage>;
73
- isTabDisabled?: (tab: Tab, index: number) => boolean;
74
- persistPanels?: boolean;
120
+ /** Per-render view inputs passed to `view` via `h.submodel`'s `viewInputs` field.
121
+ * Generic over `Value extends string` so consumers using
122
+ * `Ui.Tabs.create<MyUnion>()` receive `tab.value: MyUnion` in `toView`
123
+ * and `(value: MyUnion, index) => boolean` in `isTabDisabled`, without
124
+ * casting. */
125
+ export type ViewInputs<Value extends string = string> = Readonly<{
126
+ tabs: ReadonlyArray<Value>;
127
+ ariaLabel: string;
128
+ toView: (render: RenderInfo<Value>) => Html;
129
+ isTabDisabled?: (value: Value, index: number) => boolean;
75
130
  orientation?: Orientation;
76
- tabListElement?: TagName;
77
- tabElement?: TagName;
78
- panelElement?: TagName;
79
- className?: string;
80
- attributes?: ReadonlyArray<Attribute<ParentMessage>>;
81
- tabListClassName?: string;
82
- tabListAttributes?: ReadonlyArray<Attribute<ParentMessage>>;
83
- tabListAriaLabel: string;
84
131
  }>;
85
- /** Programmatically selects a tab at the given index, updating the model and returning
86
- * focus commands. Use this in domain-event handlers when the tab group uses `onTabSelected`. */
87
- export declare const selectTab: (model: Model, index: number) => readonly [Model, ReadonlyArray<Command.Command<Message>>];
88
- /** Renders a headless tab group with accessible ARIA roles, roving tabindex, and keyboard navigation. */
89
- export declare const view: <ParentMessage, Tab extends string>(config: ViewConfig<ParentMessage, Tab>) => Html;
90
- /** Creates a memoized tabs view. Static config is captured in a closure;
91
- * only `model` and `toParentMessage` are compared per render via `createLazy`. */
92
- export declare const lazy: <ParentMessage, Tab extends string>(staticConfig: Omit<ViewConfig<ParentMessage, Tab>, "model" | "toParentMessage" | "onTabSelected">) => ((model: Model, toParentMessage: ViewConfig<ParentMessage, Tab>["toParentMessage"]) => Html);
132
+ /** Pairs the tabs `view`, `update`, and `selectTab` behind a single
133
+ * Value-typed entry point. Declare once at module scope so consumers
134
+ * receive `tab.value: Value` in `toView` without an `as` cast:
135
+ *
136
+ * ```ts
137
+ * const DemoTabs = Ui.Tabs.create<DemoTab>()
138
+ *
139
+ * // In view:
140
+ * h.submodel({ view: DemoTabs.view, ... })
141
+ *
142
+ * // In update:
143
+ * const [next, commands] = DemoTabs.update(model, message)
144
+ * ```
145
+ *
146
+ * The internal view stays typed `ReadonlyArray<string>`; consumers can
147
+ * pass a `ReadonlyArray<MyUnion>` (assignable) and the fenced cast inside
148
+ * `create` types `TabInfo.value` as `MyUnion`. */
149
+ export declare const create: <Value extends string = string>() => Readonly<{
150
+ view: SubmodelView<Model, Message, ViewInputs<Value>>;
151
+ update: (model: Model, message: Message) => readonly [Model, ReadonlyArray<Command.Command<Message>>, Option.Option<OutMessage<Value>>];
152
+ selectTab: (model: Model, value: Value, index: number) => readonly [Model, ReadonlyArray<Command.Command<Message>>, Option.Option<OutMessage<Value>>];
153
+ reflectSelectedTab: Reflect2<Model, Value, ReadonlyArray<Value>>;
154
+ }>;
93
155
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/tabs/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/tabs/index.ts"],"names":[],"mappings":"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"}