foldkit 0.41.0 → 0.42.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 (71) hide show
  1. package/dist/devtools/overlay.js +1 -1
  2. package/dist/runtime/runtime.d.ts +2 -0
  3. package/dist/runtime/runtime.d.ts.map +1 -1
  4. package/dist/runtime/runtime.js +5 -1
  5. package/dist/ui/checkbox/index.d.ts +3 -3
  6. package/dist/ui/checkbox/index.d.ts.map +1 -1
  7. package/dist/ui/checkbox/index.js +11 -8
  8. package/dist/ui/combobox/multi.d.ts +4 -3
  9. package/dist/ui/combobox/multi.d.ts.map +1 -1
  10. package/dist/ui/combobox/multi.js +4 -4
  11. package/dist/ui/combobox/public.d.ts +2 -2
  12. package/dist/ui/combobox/public.d.ts.map +1 -1
  13. package/dist/ui/combobox/public.js +1 -1
  14. package/dist/ui/combobox/shared.d.ts +12 -1
  15. package/dist/ui/combobox/shared.d.ts.map +1 -1
  16. package/dist/ui/combobox/shared.js +32 -19
  17. package/dist/ui/combobox/single.d.ts +4 -3
  18. package/dist/ui/combobox/single.d.ts.map +1 -1
  19. package/dist/ui/combobox/single.js +4 -4
  20. package/dist/ui/dialog/index.d.ts +11 -3
  21. package/dist/ui/dialog/index.d.ts.map +1 -1
  22. package/dist/ui/dialog/index.js +15 -7
  23. package/dist/ui/dialog/public.d.ts +1 -1
  24. package/dist/ui/dialog/public.d.ts.map +1 -1
  25. package/dist/ui/dialog/public.js +1 -1
  26. package/dist/ui/disclosure/index.d.ts +8 -3
  27. package/dist/ui/disclosure/index.d.ts.map +1 -1
  28. package/dist/ui/disclosure/index.js +12 -7
  29. package/dist/ui/disclosure/public.d.ts +2 -2
  30. package/dist/ui/disclosure/public.d.ts.map +1 -1
  31. package/dist/ui/disclosure/public.js +1 -1
  32. package/dist/ui/listbox/multi.d.ts +4 -3
  33. package/dist/ui/listbox/multi.d.ts.map +1 -1
  34. package/dist/ui/listbox/multi.js +4 -4
  35. package/dist/ui/listbox/public.d.ts +3 -3
  36. package/dist/ui/listbox/public.d.ts.map +1 -1
  37. package/dist/ui/listbox/public.js +2 -2
  38. package/dist/ui/listbox/shared.d.ts +14 -1
  39. package/dist/ui/listbox/shared.d.ts.map +1 -1
  40. package/dist/ui/listbox/shared.js +31 -16
  41. package/dist/ui/listbox/single.d.ts +10 -5
  42. package/dist/ui/listbox/single.d.ts.map +1 -1
  43. package/dist/ui/listbox/single.js +8 -5
  44. package/dist/ui/menu/index.d.ts +19 -3
  45. package/dist/ui/menu/index.d.ts.map +1 -1
  46. package/dist/ui/menu/index.js +39 -21
  47. package/dist/ui/menu/public.d.ts +2 -2
  48. package/dist/ui/menu/public.d.ts.map +1 -1
  49. package/dist/ui/menu/public.js +1 -1
  50. package/dist/ui/popover/index.d.ts +20 -3
  51. package/dist/ui/popover/index.d.ts.map +1 -1
  52. package/dist/ui/popover/index.js +31 -14
  53. package/dist/ui/popover/public.d.ts +2 -2
  54. package/dist/ui/popover/public.d.ts.map +1 -1
  55. package/dist/ui/popover/public.js +1 -1
  56. package/dist/ui/radioGroup/index.d.ts +10 -5
  57. package/dist/ui/radioGroup/index.d.ts.map +1 -1
  58. package/dist/ui/radioGroup/index.js +18 -20
  59. package/dist/ui/radioGroup/public.d.ts +2 -2
  60. package/dist/ui/radioGroup/public.d.ts.map +1 -1
  61. package/dist/ui/radioGroup/public.js +1 -1
  62. package/dist/ui/switch/index.d.ts +3 -3
  63. package/dist/ui/switch/index.d.ts.map +1 -1
  64. package/dist/ui/switch/index.js +11 -8
  65. package/dist/ui/tabs/index.d.ts +8 -3
  66. package/dist/ui/tabs/index.d.ts.map +1 -1
  67. package/dist/ui/tabs/index.js +15 -8
  68. package/dist/ui/tabs/public.d.ts +2 -2
  69. package/dist/ui/tabs/public.d.ts.map +1 -1
  70. package/dist/ui/tabs/public.js +1 -1
  71. package/package.json +1 -1
@@ -32,6 +32,7 @@ export const init = (config) => ({
32
32
  });
33
33
  // UPDATE
34
34
  const optionId = (id, index) => `${id}-option-${index}`;
35
+ /** Moves focus to the radio option at the given index. */
35
36
  export const FocusOption = Command.define('FocusOption', CompletedFocusOption);
36
37
  /** Processes a radio group message and returns the next model and commands. */
37
38
  export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
@@ -46,12 +47,21 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
46
47
  },
47
48
  CompletedFocusOption: () => [model, []],
48
49
  }));
50
+ /** Programmatically selects a value in the radio group, updating the model and returning
51
+ * focus commands. Use this in domain-event handlers when the radio group uses `onSelected`. */
52
+ export const select = (model, value, options) => pipe(options, Array.findFirstIndex(option => option === value), Option.match({
53
+ onNone: () => [model, []],
54
+ onSome: index => update(model, SelectedOption({ value, index })),
55
+ }));
49
56
  const labelId = (id, index) => `${id}-option-${index}-label`;
50
57
  const descriptionId = (id, index) => `${id}-option-${index}-description`;
51
58
  /** Renders an accessible radio group by building ARIA attribute groups and delegating layout to the consumer's `optionToConfig` callback. */
52
59
  export const view = (config) => {
53
60
  const { div, input, AriaChecked, AriaDescribedBy, AriaDisabled, AriaLabel, AriaLabelledBy, AriaOrientation, Class, DataAttribute, Id, Name, OnClick, OnKeyDownPreventDefault, Role, Tabindex, Type, Value, } = html();
54
- const { model, model: { id, selectedValue }, toMessage, options, optionToConfig, isOptionDisabled: isOptionDisabledFn, orientation = model.orientation, ariaLabel, className, attributes = [], name, isDisabled: isGroupDisabled = false, } = config;
61
+ const { model, model: { id, selectedValue }, toParentMessage, onSelected, options, optionToConfig, isOptionDisabled: isOptionDisabledFn, orientation = model.orientation, ariaLabel, className, attributes = [], name, isDisabled: isGroupDisabled = false, } = config;
62
+ const dispatchSelected = (value, index) => onSelected
63
+ ? onSelected(value, index)
64
+ : toParentMessage({ _tag: 'SelectedOption', value, index });
55
65
  const isDisabled = (index) => {
56
66
  if (isGroupDisabled) {
57
67
  return true;
@@ -82,16 +92,8 @@ export const view = (config) => {
82
92
  const resolveKeyIndex = keyToIndex(nextKey, previousKey, options.length, focusedIndex, isDisabled);
83
93
  const handleKeyDown = (currentIndex) => (key) => M.value(key).pipe(M.whenOr(nextKey, previousKey, 'Home', 'End', 'PageUp', 'PageDown', () => {
84
94
  const nextIndex = resolveKeyIndex(key);
85
- return pipe(optionValues, Array.get(nextIndex), Option.map(value => toMessage({
86
- _tag: 'SelectedOption',
87
- value,
88
- index: nextIndex,
89
- })));
90
- }), M.when(' ', () => pipe(optionValues, Array.get(currentIndex), Option.map(value => toMessage({
91
- _tag: 'SelectedOption',
92
- value,
93
- index: currentIndex,
94
- })))), M.orElse(() => Option.none()));
95
+ return pipe(optionValues, Array.get(nextIndex), Option.map(value => dispatchSelected(value, nextIndex)));
96
+ }), M.when(' ', () => pipe(optionValues, Array.get(currentIndex), Option.map(value => dispatchSelected(value, currentIndex)))), M.orElse(() => Option.none()));
95
97
  const renderedOptions = Array.map(options, (option, index) => {
96
98
  const isSelected = Option.exists(selectedIndex, selectedIdx => selectedIdx === index);
97
99
  const isFocusable = index === focusedIndex;
@@ -119,11 +121,7 @@ export const view = (config) => {
119
121
  ...(isOptionDisabled
120
122
  ? []
121
123
  : [
122
- OnClick(toMessage({
123
- _tag: 'SelectedOption',
124
- value: optionConfig.value,
125
- index,
126
- })),
124
+ OnClick(dispatchSelected(optionConfig.value, index)),
127
125
  OnKeyDownPreventDefault(handleKeyDown(index)),
128
126
  ]),
129
127
  ];
@@ -153,12 +151,12 @@ export const view = (config) => {
153
151
  return div(groupAttributes, [...renderedOptions, ...hiddenInputs]);
154
152
  };
155
153
  /** Creates a memoized radio group view. Static config is captured in a closure;
156
- * only `model` and `toMessage` are compared per render via `createLazy`. */
154
+ * only `model` and `toParentMessage` are compared per render via `createLazy`. */
157
155
  export const lazy = (staticConfig) => {
158
156
  const lazyView = createLazy();
159
- return (model, toMessage) => lazyView((currentModel, currentToMessage) => view({
157
+ return (model, toParentMessage) => lazyView((currentModel, currentToMessage) => view({
160
158
  ...staticConfig,
161
159
  model: currentModel,
162
- toMessage: currentToMessage,
163
- }), [model, toMessage]);
160
+ toParentMessage: currentToMessage,
161
+ }), [model, toParentMessage]);
164
162
  };
@@ -1,3 +1,3 @@
1
- export { init, update, view, lazy, Model, Message } from './index';
2
- export type { SelectedOption, NarrowedSelectedOption, Orientation, InitConfig, ViewConfig, OptionAttributes, OptionConfig, } from './index';
1
+ export { init, update, select, view, lazy, Model, Message, SelectedOption, CompletedFocusOption, FocusOption, } from './index';
2
+ export type { NarrowedSelectedOption, Orientation, InitConfig, ViewConfig, OptionAttributes, OptionConfig, } from './index';
3
3
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/radioGroup/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAElE,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/radioGroup/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,WAAW,GACZ,MAAM,SAAS,CAAA;AAEhB,YAAY,EACV,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAA"}
@@ -1 +1 @@
1
- export { init, update, view, lazy, Model, Message } from './index';
1
+ export { init, update, select, view, lazy, Model, Message, SelectedOption, CompletedFocusOption, FocusOption, } from './index';
@@ -32,7 +32,7 @@ export type SwitchAttributes<Message> = Readonly<{
32
32
  /** Configuration for rendering a switch with `view`. */
33
33
  export type ViewConfig<Message> = Readonly<{
34
34
  model: Model;
35
- toMessage: (message: Toggled) => Message;
35
+ toParentMessage: (message: Toggled) => Message;
36
36
  toView: (attributes: SwitchAttributes<Message>) => Html;
37
37
  isDisabled?: boolean;
38
38
  name?: string;
@@ -41,6 +41,6 @@ export type ViewConfig<Message> = Readonly<{
41
41
  /** Renders an accessible switch toggle by building ARIA attribute groups and delegating layout to the consumer's `toView` callback. */
42
42
  export declare const view: <Message>(config: ViewConfig<Message>) => Html;
43
43
  /** Creates a memoized switch view. Static config is captured in a closure;
44
- * only `model` and `toMessage` are compared per render via `createLazy`. */
45
- export declare const lazy: <Message>(staticConfig: Omit<ViewConfig<Message>, "model" | "toMessage">) => ((model: Model, toMessage: ViewConfig<Message>["toMessage"]) => Html);
44
+ * only `model` and `toParentMessage` are compared per render via `createLazy`. */
45
+ export declare const lazy: <Message>(staticConfig: Omit<ViewConfig<Message>, "model" | "toParentMessage">) => ((model: Model, toParentMessage: ViewConfig<Message>["toParentMessage"]) => Html);
46
46
  //# 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,eAAe,CAAA;AAC5C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI,EAAoB,MAAM,YAAY,CAAA;AAMxE,qFAAqF;AACrF,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,oEAAoE;AACpE,eAAO,MAAM,OAAO,4DAAe,CAAA;AAEnC,gEAAgE;AAChE,eAAO,MAAM,OAAO,4DAAU,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,OAAO,IAAI,QAAQ,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACzC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACxC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9C,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;CAC/C,CAAC,CAAA;AAEF,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IACxC,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IACvD,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,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAG,IAmE3D,CAAA;AAED;6EAC6E;AAC7E,eAAO,MAAM,IAAI,GAAI,OAAO,EAC1B,cAAc,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,KAC7D,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAgBtE,CAAA"}
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,eAAe,CAAA;AAC5C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI,EAAoB,MAAM,YAAY,CAAA;AAMxE,qFAAqF;AACrF,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,oEAAoE;AACpE,eAAO,MAAM,OAAO,4DAAe,CAAA;AAEnC,gEAAgE;AAChE,eAAO,MAAM,OAAO,4DAAU,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,OAAO,IAAI,QAAQ,CAAC;IAC/C,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACzC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACxC,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9C,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;CAC/C,CAAC,CAAA;AAEF,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,EAAE,KAAK,CAAA;IACZ,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IAC9C,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IACvD,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,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAG,IAsE3D,CAAA;AAED;mFACmF;AACnF,eAAO,MAAM,IAAI,GAAI,OAAO,EAC1B,cAAc,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC,KACnE,CAAC,CACF,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,KACpD,IAAI,CAgBR,CAAA"}
@@ -29,8 +29,8 @@ const descriptionId = (id) => `${id}-description`;
29
29
  /** Renders an accessible switch toggle by building ARIA attribute groups and delegating layout to the consumer's `toView` callback. */
30
30
  export const view = (config) => {
31
31
  const { AriaChecked, AriaDescribedBy, AriaDisabled, AriaLabelledBy, DataAttribute, Id, Name, OnClick, OnKeyUpPreventDefault, Role, Tabindex, Type, Value, } = html();
32
- const { model: { id, isChecked }, toMessage, isDisabled = false, name, value: formValue = 'on', } = config;
33
- const handleKeyUp = (key) => M.value(key).pipe(M.when(' ', () => Option.some(toMessage(Toggled()))), M.orElse(() => Option.none()));
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()));
34
34
  const checkedAttributes = isChecked ? [DataAttribute('checked', '')] : [];
35
35
  const disabledAttributes = isDisabled
36
36
  ? [AriaDisabled(true), DataAttribute('disabled', '')]
@@ -45,11 +45,14 @@ export const view = (config) => {
45
45
  ...disabledAttributes,
46
46
  ...(isDisabled
47
47
  ? []
48
- : [OnClick(toMessage(Toggled())), OnKeyUpPreventDefault(handleKeyUp)]),
48
+ : [
49
+ OnClick(toParentMessage(Toggled())),
50
+ OnKeyUpPreventDefault(handleKeyUp),
51
+ ]),
49
52
  ];
50
53
  const labelAttributes = [
51
54
  Id(labelId(id)),
52
- ...(isDisabled ? [] : [OnClick(toMessage(Toggled()))]),
55
+ ...(isDisabled ? [] : [OnClick(toParentMessage(Toggled()))]),
53
56
  ];
54
57
  const descriptionAttributes = [Id(descriptionId(id))];
55
58
  const hiddenInputAttributes = name
@@ -63,12 +66,12 @@ export const view = (config) => {
63
66
  });
64
67
  };
65
68
  /** Creates a memoized switch view. Static config is captured in a closure;
66
- * only `model` and `toMessage` are compared per render via `createLazy`. */
69
+ * only `model` and `toParentMessage` are compared per render via `createLazy`. */
67
70
  export const lazy = (staticConfig) => {
68
71
  const lazyView = createLazy();
69
- return (model, toMessage) => lazyView((currentModel, currentToMessage) => view({
72
+ return (model, toParentMessage) => lazyView((currentModel, currentToMessage) => view({
70
73
  ...staticConfig,
71
74
  model: currentModel,
72
- toMessage: currentToMessage,
73
- }), [model, toMessage]);
75
+ toParentMessage: currentToMessage,
76
+ }), [model, toParentMessage]);
74
77
  };
@@ -43,6 +43,7 @@ export type InitConfig = Readonly<{
43
43
  }>;
44
44
  /** Creates an initial tabs model from a config. Defaults to first tab and automatic activation. */
45
45
  export declare const init: (config: InitConfig) => Model;
46
+ /** Moves focus to the tab at the given index. */
46
47
  export declare const FocusTab: Command.CommandDefinition<"FocusTab", {
47
48
  readonly _tag: "CompletedFocusTab";
48
49
  }>;
@@ -60,7 +61,8 @@ export type TabConfig<Message = unknown> = Readonly<{
60
61
  /** Configuration for rendering a tab group with `view`. */
61
62
  export type ViewConfig<Message, Tab extends string> = Readonly<{
62
63
  model: Model;
63
- toMessage: (message: TabSelected | TabFocused) => Message;
64
+ toParentMessage: (message: TabSelected | TabFocused) => Message;
65
+ onTabSelected?: (index: number) => Message;
64
66
  tabs: ReadonlyArray<Tab>;
65
67
  tabToConfig: (tab: Tab, context: {
66
68
  isActive: boolean;
@@ -77,9 +79,12 @@ export type ViewConfig<Message, Tab extends string> = Readonly<{
77
79
  tabListAttributes?: ReadonlyArray<Attribute<Message>>;
78
80
  tabListAriaLabel: string;
79
81
  }>;
82
+ /** Programmatically selects a tab at the given index, updating the model and returning
83
+ * focus commands. Use this in domain-event handlers when the tab group uses `onTabSelected`. */
84
+ export declare const selectTab: (model: Model, index: number) => readonly [Model, ReadonlyArray<Command.Command<Message>>];
80
85
  /** Renders a headless tab group with accessible ARIA roles, roving tabindex, and keyboard navigation. */
81
86
  export declare const view: <Message, Tab extends string>(config: ViewConfig<Message, Tab>) => Html;
82
87
  /** Creates a memoized tabs view. Static config is captured in a closure;
83
- * only `model` and `toMessage` are compared per render via `createLazy`. */
84
- export declare const lazy: <Message, Tab extends string>(staticConfig: Omit<ViewConfig<Message, Tab>, "model" | "toMessage">) => ((model: Model, toMessage: ViewConfig<Message, Tab>["toMessage"]) => Html);
88
+ * only `model` and `toParentMessage` are compared per render via `createLazy`. */
89
+ export declare const lazy: <Message, Tab extends string>(staticConfig: Omit<ViewConfig<Message, Tab>, "model" | "toParentMessage" | "onTabSelected">) => ((model: Model, toParentMessage: ViewConfig<Message, Tab>["toParentMessage"]) => Html);
85
90
  //# 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":"AAAA,OAAO,EAKL,MAAM,IAAI,CAAC,EAGZ,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AACxC,OAAO,EACL,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,OAAO,EAGb,MAAM,YAAY,CAAA;AAMnB,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI1E,yFAAyF;AACzF,eAAO,MAAM,WAAW,uCAAsC,CAAA;AAC9D,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAEjD,yGAAyG;AACzG,eAAO,MAAM,cAAc,oCAAmC,CAAA;AAC9D,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;AAEvD,kGAAkG;AAClG,eAAO,MAAM,KAAK;;;;;EAKhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,sGAAsG;AACtG,eAAO,MAAM,WAAW;;EAAwC,CAAA;AAChE,wFAAwF;AACxF,eAAO,MAAM,UAAU;;EAAuC,CAAA;AAC9D,iDAAiD;AACjD,eAAO,MAAM,iBAAiB,sEAAyB,CAAA;AAEvD,4DAA4D;AAC5D,eAAO,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,CAC3B;IAAC,OAAO,WAAW;IAAE,OAAO,UAAU;IAAE,OAAO,iBAAiB;CAAC,CACZ,CAAA;AAEvD,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AACjD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,2DAA2D;AAC3D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAC,CAAA;AAEF,mGAAmG;AACnG,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KASzC,CAAA;AAID,iDAAiD;AACjD,eAAO,MAAM,QAAQ;;EAAgD,CAAA;AAErE,wEAAwE;AACxE,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAyCxD,CAAA;AAIH,sEAAsE;AACtE,MAAM,MAAM,SAAS,CAAC,OAAO,GAAG,OAAO,IAAI,QAAQ,CAAC;IAClD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACpD,aAAa,EAAE,IAAI,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,eAAe,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACnD,YAAY,EAAE,IAAI,CAAA;CACnB,CAAC,CAAA;AAEF,2DAA2D;AAC3D,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,SAAS,MAAM,IAAI,QAAQ,CAAC;IAC7D,KAAK,EAAE,KAAK,CAAA;IACZ,eAAe,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,KAAK,OAAO,CAAA;IAC/D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IAC1C,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;IACxB,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KAAK,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7E,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACpD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACrD,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAC,CAAA;AAMF;iGACiG;AACjG,eAAO,MAAM,SAAS,GACpB,OAAO,KAAK,EACZ,OAAO,MAAM,KACZ,SAAS,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CACpB,CAAA;AAEvC,yGAAyG;AACzG,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,GAAG,SAAS,MAAM,EAC9C,QAAQ,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,KAC/B,IA8MF,CAAA;AAED;mFACmF;AACnF,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,GAAG,SAAS,MAAM,EAC9C,cAAc,IAAI,CAChB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,EACxB,OAAO,GAAG,iBAAiB,GAAG,eAAe,CAC9C,KACA,CAAC,CACF,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,KACzD,IAAI,CAgBR,CAAA"}
@@ -38,6 +38,7 @@ export const init = (config) => {
38
38
  };
39
39
  };
40
40
  // UPDATE
41
+ /** Moves focus to the tab at the given index. */
41
42
  export const FocusTab = Command.define('FocusTab', CompletedFocusTab);
42
43
  /** Processes a tabs message and returns the next model and commands. */
43
44
  export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
@@ -66,10 +67,16 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
66
67
  }));
67
68
  const tabPanelId = (id, index) => `${id}-panel-${index}`;
68
69
  const tabId = (id, index) => `${id}-tab-${index}`;
70
+ /** Programmatically selects a tab at the given index, updating the model and returning
71
+ * focus commands. Use this in domain-event handlers when the tab group uses `onTabSelected`. */
72
+ export const selectTab = (model, index) => update(model, TabSelected({ index }));
69
73
  /** Renders a headless tab group with accessible ARIA roles, roving tabindex, and keyboard navigation. */
70
74
  export const view = (config) => {
71
75
  const { div, empty, AriaControls, AriaDisabled, AriaLabel, AriaLabelledBy, AriaOrientation, AriaSelected, Class, DataAttribute, Disabled, Hidden, Id, OnClick, OnKeyDownPreventDefault, Role, Tabindex, Type, keyed, } = html();
72
- const { model, model: { id, activationMode, focusedIndex }, toMessage, tabs, tabToConfig, isTabDisabled, persistPanels, orientation = 'Horizontal', tabListElement = 'div', tabElement = 'button', panelElement = 'div', className, attributes = [], tabListClassName, tabListAttributes = [], tabListAriaLabel, } = config;
76
+ const { model, model: { id, activationMode, focusedIndex }, toParentMessage, onTabSelected, tabs, tabToConfig, isTabDisabled, persistPanels, orientation = 'Horizontal', tabListElement = 'div', tabElement = 'button', panelElement = 'div', className, attributes = [], tabListClassName, tabListAttributes = [], tabListAriaLabel, } = config;
77
+ const dispatchTabSelected = (index) => onTabSelected
78
+ ? onTabSelected(index)
79
+ : toParentMessage(TabSelected({ index }));
73
80
  const isDisabled = (index) => !!isTabDisabled &&
74
81
  pipe(tabs, Array.get(index), Option.exists(tab => isTabDisabled(tab, index)));
75
82
  const { nextKey, previousKey } = M.value(orientation).pipe(M.when('Horizontal', () => ({
@@ -80,8 +87,8 @@ export const view = (config) => {
80
87
  previousKey: 'ArrowUp',
81
88
  })), M.exhaustive);
82
89
  const resolveKeyIndex = keyToIndex(nextKey, previousKey, tabs.length, focusedIndex, isDisabled);
83
- const handleAutomaticKeyDown = (key) => M.value(key).pipe(M.whenOr(nextKey, previousKey, 'Home', 'End', 'PageUp', 'PageDown', () => Option.some(toMessage(TabSelected({ index: resolveKeyIndex(key) })))), M.whenOr('Enter', ' ', () => Option.some(toMessage(TabSelected({ index: focusedIndex })))), M.orElse(() => Option.none()));
84
- const handleManualKeyDown = (key) => M.value(key).pipe(M.whenOr(nextKey, previousKey, 'Home', 'End', 'PageUp', 'PageDown', () => Option.some(toMessage(TabFocused({ index: resolveKeyIndex(key) })))), M.whenOr('Enter', ' ', () => Option.some(toMessage(TabSelected({ index: focusedIndex })))), M.orElse(() => Option.none()));
90
+ const handleAutomaticKeyDown = (key) => M.value(key).pipe(M.whenOr(nextKey, previousKey, 'Home', 'End', 'PageUp', 'PageDown', () => Option.some(dispatchTabSelected(resolveKeyIndex(key)))), M.whenOr('Enter', ' ', () => Option.some(dispatchTabSelected(focusedIndex))), M.orElse(() => Option.none()));
91
+ const handleManualKeyDown = (key) => M.value(key).pipe(M.whenOr(nextKey, previousKey, 'Home', 'End', 'PageUp', 'PageDown', () => Option.some(toParentMessage(TabFocused({ index: resolveKeyIndex(key) })))), M.whenOr('Enter', ' ', () => Option.some(dispatchTabSelected(focusedIndex))), M.orElse(() => Option.none()));
85
92
  const handleKeyDown = (key) => M.value(activationMode).pipe(M.when('Automatic', () => handleAutomaticKeyDown(key)), M.when('Manual', () => handleManualKeyDown(key)), M.exhaustive);
86
93
  const tabButtons = Array.map(tabs, (tab, index) => {
87
94
  const isActive = index === model.activeIndex;
@@ -98,7 +105,7 @@ export const view = (config) => {
98
105
  ...(isActive ? [DataAttribute('selected', '')] : []),
99
106
  ...(isTabDisabledAtIndex
100
107
  ? [Disabled(true), AriaDisabled(true), DataAttribute('disabled', '')]
101
- : [OnClick(toMessage(TabSelected({ index })))]),
108
+ : [OnClick(dispatchTabSelected(index))]),
102
109
  OnKeyDownPreventDefault(handleKeyDown),
103
110
  ...(tabConfig.buttonClassName
104
111
  ? [Class(tabConfig.buttonClassName)]
@@ -153,12 +160,12 @@ export const view = (config) => {
153
160
  ]);
154
161
  };
155
162
  /** Creates a memoized tabs view. Static config is captured in a closure;
156
- * only `model` and `toMessage` are compared per render via `createLazy`. */
163
+ * only `model` and `toParentMessage` are compared per render via `createLazy`. */
157
164
  export const lazy = (staticConfig) => {
158
165
  const lazyView = createLazy();
159
- return (model, toMessage) => lazyView((currentModel, currentToMessage) => view({
166
+ return (model, toParentMessage) => lazyView((currentModel, currentToMessage) => view({
160
167
  ...staticConfig,
161
168
  model: currentModel,
162
- toMessage: currentToMessage,
163
- }), [model, toMessage]);
169
+ toParentMessage: currentToMessage,
170
+ }), [model, toParentMessage]);
164
171
  };
@@ -1,3 +1,3 @@
1
- export { init, update, view, lazy, Model, Message } from './index';
2
- export type { Orientation, ActivationMode, TabSelected, TabFocused, InitConfig, ViewConfig, TabConfig, } from './index';
1
+ export { init, update, selectTab, view, lazy, Model, Message, TabSelected, TabFocused, CompletedFocusTab, FocusTab, } from './index';
2
+ export type { Orientation, ActivationMode, InitConfig, ViewConfig, TabConfig, } from './index';
3
3
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/tabs/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAElE,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/tabs/public.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,MAAM,EACN,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,QAAQ,GACT,MAAM,SAAS,CAAA;AAEhB,YAAY,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAA"}
@@ -1 +1 @@
1
- export { init, update, view, lazy, Model, Message } from './index';
1
+ export { init, update, selectTab, view, lazy, Model, Message, TabSelected, TabFocused, CompletedFocusTab, FocusTab, } from './index';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.41.0",
3
+ "version": "0.42.0",
4
4
  "description": "A frontend framework for TypeScript, built on Effect, using The Elm Architecture",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",