foldkit 0.23.0 → 0.25.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 (75) hide show
  1. package/dist/fieldValidation/index.d.ts +3 -4
  2. package/dist/fieldValidation/index.d.ts.map +1 -1
  3. package/dist/fieldValidation/index.js +11 -15
  4. package/dist/html/index.d.ts +42 -0
  5. package/dist/html/index.d.ts.map +1 -1
  6. package/dist/html/index.js +15 -3
  7. package/dist/html/lazy.d.ts +12 -0
  8. package/dist/html/lazy.d.ts.map +1 -0
  9. package/dist/html/lazy.js +35 -0
  10. package/dist/html/public.d.ts +1 -0
  11. package/dist/html/public.d.ts.map +1 -1
  12. package/dist/html/public.js +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -0
  16. package/dist/managedResource/index.d.ts +38 -0
  17. package/dist/managedResource/index.d.ts.map +1 -0
  18. package/dist/managedResource/index.js +20 -0
  19. package/dist/managedResource/public.d.ts +5 -0
  20. package/dist/managedResource/public.d.ts.map +1 -0
  21. package/dist/managedResource/public.js +2 -0
  22. package/dist/runtime/managedResource.d.ts +114 -0
  23. package/dist/runtime/managedResource.d.ts.map +1 -0
  24. package/dist/runtime/managedResource.js +92 -0
  25. package/dist/runtime/public.d.ts +2 -2
  26. package/dist/runtime/public.d.ts.map +1 -1
  27. package/dist/runtime/public.js +1 -1
  28. package/dist/runtime/runtime.d.ts +79 -90
  29. package/dist/runtime/runtime.d.ts.map +1 -1
  30. package/dist/runtime/runtime.js +95 -19
  31. package/dist/runtime/subscription.d.ts +25 -0
  32. package/dist/runtime/subscription.d.ts.map +1 -0
  33. package/dist/runtime/subscription.js +7 -0
  34. package/dist/struct/index.d.ts +2 -0
  35. package/dist/struct/index.d.ts.map +1 -1
  36. package/dist/struct/index.js +4 -0
  37. package/dist/struct/public.d.ts +1 -1
  38. package/dist/struct/public.d.ts.map +1 -1
  39. package/dist/struct/public.js +1 -1
  40. package/dist/subscription/public.d.ts +3 -0
  41. package/dist/subscription/public.d.ts.map +1 -0
  42. package/dist/subscription/public.js +1 -0
  43. package/dist/ui/disclosure/index.d.ts.map +1 -1
  44. package/dist/ui/disclosure/index.js +3 -2
  45. package/dist/ui/group.d.ts +8 -0
  46. package/dist/ui/group.d.ts.map +1 -0
  47. package/dist/ui/group.js +13 -0
  48. package/dist/ui/index.d.ts +1 -0
  49. package/dist/ui/index.d.ts.map +1 -1
  50. package/dist/ui/index.js +1 -0
  51. package/dist/ui/keyboard.d.ts +2 -0
  52. package/dist/ui/keyboard.d.ts.map +1 -1
  53. package/dist/ui/keyboard.js +2 -0
  54. package/dist/ui/listbox/multi.d.ts +172 -0
  55. package/dist/ui/listbox/multi.d.ts.map +1 -0
  56. package/dist/ui/listbox/multi.js +25 -0
  57. package/dist/ui/listbox/multiPublic.d.ts +3 -0
  58. package/dist/ui/listbox/multiPublic.d.ts.map +1 -0
  59. package/dist/ui/listbox/multiPublic.js +1 -0
  60. package/dist/ui/listbox/public.d.ts +7 -0
  61. package/dist/ui/listbox/public.d.ts.map +1 -0
  62. package/dist/ui/listbox/public.js +3 -0
  63. package/dist/ui/listbox/shared.d.ts +236 -0
  64. package/dist/ui/listbox/shared.d.ts.map +1 -0
  65. package/dist/ui/listbox/shared.js +519 -0
  66. package/dist/ui/listbox/single.d.ts +172 -0
  67. package/dist/ui/listbox/single.d.ts.map +1 -0
  68. package/dist/ui/listbox/single.js +29 -0
  69. package/dist/ui/menu/index.d.ts +4 -9
  70. package/dist/ui/menu/index.d.ts.map +1 -1
  71. package/dist/ui/menu/index.js +9 -29
  72. package/dist/ui/typeahead.d.ts +4 -0
  73. package/dist/ui/typeahead.d.ts.map +1 -0
  74. package/dist/ui/typeahead.js +14 -0
  75. package/package.json +13 -1
@@ -0,0 +1,172 @@
1
+ import { Option, Schema as S } from 'effect';
2
+ import { type BaseInitConfig, type BaseViewConfig } from './shared';
3
+ /** Schema for the listbox component's state, tracking open/closed status, active item, selected item, activation trigger, and typeahead search. */
4
+ export declare const Model: S.extend<S.Struct<{
5
+ id: typeof S.String;
6
+ isOpen: typeof S.Boolean;
7
+ isAnimated: typeof S.Boolean;
8
+ isModal: typeof S.Boolean;
9
+ orientation: S.Literal<["Vertical", "Horizontal"]>;
10
+ transitionState: S.Literal<["Idle", "EnterStart", "EnterAnimating", "LeaveStart", "LeaveAnimating"]>;
11
+ maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
12
+ activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
13
+ searchQuery: typeof S.String;
14
+ searchVersion: typeof S.Number;
15
+ maybeLastPointerPosition: S.OptionFromSelf<S.Struct<{
16
+ screenX: typeof S.Number;
17
+ screenY: typeof S.Number;
18
+ }>>;
19
+ maybeLastButtonPointerType: S.OptionFromSelf<typeof S.String>;
20
+ }>, S.Struct<{
21
+ maybeSelectedItem: S.OptionFromSelf<typeof S.String>;
22
+ }>>;
23
+ export type Model = typeof Model.Type;
24
+ /** Configuration for creating a single-select listbox model with `init`. `isAnimated` enables CSS transition coordination (default `false`). `isModal` locks page scroll and inerts other elements when open (default `false`). `selectedItem` sets the initial selection (default none). */
25
+ export type InitConfig = BaseInitConfig & Readonly<{
26
+ selectedItem?: string;
27
+ }>;
28
+ /** Creates an initial single-select listbox model from a config. Defaults to closed with no active item and no selection. */
29
+ export declare const init: (config: InitConfig) => Model;
30
+ /** Processes a listbox message and returns the next model and commands. Closes the listbox on selection (single-select behavior). */
31
+ export declare const update: (model: {
32
+ readonly id: string;
33
+ readonly isOpen: boolean;
34
+ readonly isAnimated: boolean;
35
+ readonly isModal: boolean;
36
+ readonly orientation: "Vertical" | "Horizontal";
37
+ readonly transitionState: "Idle" | "EnterStart" | "EnterAnimating" | "LeaveStart" | "LeaveAnimating";
38
+ readonly maybeActiveItemIndex: Option.Option<number>;
39
+ readonly activationTrigger: "Pointer" | "Keyboard";
40
+ readonly searchQuery: string;
41
+ readonly searchVersion: number;
42
+ readonly maybeLastPointerPosition: Option.Option<{
43
+ readonly screenX: number;
44
+ readonly screenY: number;
45
+ }>;
46
+ readonly maybeLastButtonPointerType: Option.Option<string>;
47
+ } & {
48
+ readonly maybeSelectedItem: Option.Option<string>;
49
+ }, message: import("./shared").Message) => [{
50
+ readonly id: string;
51
+ readonly isOpen: boolean;
52
+ readonly isAnimated: boolean;
53
+ readonly isModal: boolean;
54
+ readonly orientation: "Vertical" | "Horizontal";
55
+ readonly transitionState: "Idle" | "EnterStart" | "EnterAnimating" | "LeaveStart" | "LeaveAnimating";
56
+ readonly maybeActiveItemIndex: Option.Option<number>;
57
+ readonly activationTrigger: "Pointer" | "Keyboard";
58
+ readonly searchQuery: string;
59
+ readonly searchVersion: number;
60
+ readonly maybeLastPointerPosition: Option.Option<{
61
+ readonly screenX: number;
62
+ readonly screenY: number;
63
+ }>;
64
+ readonly maybeLastButtonPointerType: Option.Option<string>;
65
+ } & {
66
+ readonly maybeSelectedItem: Option.Option<string>;
67
+ }, readonly import("../../command").Command<{
68
+ readonly _tag: "Closed";
69
+ } | {
70
+ readonly _tag: "NoOp";
71
+ } | {
72
+ readonly _tag: "Opened";
73
+ readonly maybeActiveItemIndex: Option.Option<number>;
74
+ } | {
75
+ readonly _tag: "ClosedByTab";
76
+ } | {
77
+ readonly _tag: "ActivatedItem";
78
+ readonly activationTrigger: "Pointer" | "Keyboard";
79
+ readonly index: number;
80
+ } | {
81
+ readonly _tag: "DeactivatedItem";
82
+ } | {
83
+ readonly _tag: "SelectedItem";
84
+ readonly item: string;
85
+ } | {
86
+ readonly _tag: "MovedPointerOverItem";
87
+ readonly screenX: number;
88
+ readonly screenY: number;
89
+ readonly index: number;
90
+ } | {
91
+ readonly _tag: "RequestedItemClick";
92
+ readonly index: number;
93
+ } | {
94
+ readonly _tag: "Searched";
95
+ readonly key: string;
96
+ readonly maybeTargetIndex: Option.Option<number>;
97
+ } | {
98
+ readonly _tag: "ClearedSearch";
99
+ readonly version: number;
100
+ } | {
101
+ readonly _tag: "AdvancedTransitionFrame";
102
+ } | {
103
+ readonly _tag: "EndedTransition";
104
+ } | {
105
+ readonly _tag: "DetectedButtonMovement";
106
+ } | {
107
+ readonly _tag: "PressedPointerOnButton";
108
+ readonly button: number;
109
+ readonly pointerType: string;
110
+ }>[]];
111
+ /** Configuration for rendering a single-select listbox with `view`. */
112
+ export type ViewConfig<Message, Item> = BaseViewConfig<Message, Item, Model>;
113
+ /** Renders a headless single-select listbox with typeahead search, keyboard navigation, selection tracking, and aria-activedescendant focus management. */
114
+ export declare const view: <Message, Item>(config: Readonly<{
115
+ model: {
116
+ readonly id: string;
117
+ readonly isOpen: boolean;
118
+ readonly isAnimated: boolean;
119
+ readonly isModal: boolean;
120
+ readonly orientation: "Vertical" | "Horizontal";
121
+ readonly transitionState: "Idle" | "EnterStart" | "EnterAnimating" | "LeaveStart" | "LeaveAnimating";
122
+ readonly maybeActiveItemIndex: Option.Option<number>;
123
+ readonly activationTrigger: "Pointer" | "Keyboard";
124
+ readonly searchQuery: string;
125
+ readonly searchVersion: number;
126
+ readonly maybeLastPointerPosition: Option.Option<{
127
+ readonly screenX: number;
128
+ readonly screenY: number;
129
+ }>;
130
+ readonly maybeLastButtonPointerType: Option.Option<string>;
131
+ } & {
132
+ readonly maybeSelectedItem: Option.Option<string>;
133
+ };
134
+ toMessage: (message: import("./shared").Opened | import("./shared").Closed | import("./shared").ClosedByTab | import("./shared").ActivatedItem | import("./shared").DeactivatedItem | import("./shared").SelectedItem | import("./shared").MovedPointerOverItem | import("./shared").RequestedItemClick | import("./shared").Searched | import("./shared").PressedPointerOnButton | import("./shared").NoOp) => Message;
135
+ items: readonly Item[];
136
+ itemToConfig: (item: Item, context: Readonly<{
137
+ isActive: boolean;
138
+ isDisabled: boolean;
139
+ isSelected: boolean;
140
+ }>) => Readonly<{
141
+ className: string;
142
+ content: import("../../html").Html;
143
+ }>;
144
+ isItemDisabled?: (item: Item, index: number) => boolean;
145
+ itemToSearchText?: (item: Item, index: number) => string;
146
+ itemToValue?: (item: Item) => string;
147
+ isButtonDisabled?: boolean;
148
+ buttonContent: import("../../html").Html;
149
+ buttonClassName: string;
150
+ itemsClassName: string;
151
+ backdropClassName: string;
152
+ className?: string;
153
+ itemGroupKey?: (item: Item, index: number) => string;
154
+ groupToHeading?: (groupKey: string) => Readonly<{
155
+ content: import("../../html").Html;
156
+ className: string;
157
+ }> | undefined;
158
+ groupClassName?: string;
159
+ separatorClassName?: string;
160
+ anchor?: Readonly<{
161
+ placement?: import("@floating-ui/dom").Placement;
162
+ gap?: number;
163
+ offset?: number;
164
+ padding?: number;
165
+ portal?: boolean;
166
+ }>;
167
+ name?: string;
168
+ form?: string;
169
+ isDisabled?: boolean;
170
+ isInvalid?: boolean;
171
+ }>) => import("../../html").Html;
172
+ //# sourceMappingURL=single.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single.d.ts","sourceRoot":"","sources":["../../../src/ui/listbox/single.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,IAAI,CAAC,EAAQ,MAAM,QAAQ,CAAA;AAGzD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,UAAU,CAAA;AAIjB,mJAAmJ;AACnJ,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;GAEjB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,6RAA6R;AAC7R,MAAM,MAAM,UAAU,GAAG,cAAc,GACrC,QAAQ,CAAC;IACP,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEJ,6HAA6H;AAC7H,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAIF,qIAAqI;AACrI,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAYjB,CAAA;AAIF,uEAAuE;AACvE,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;AAE5E,2JAA2J;AAC3J,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAWf,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { Array, Option, Schema as S, pipe } from 'effect';
2
+ import { evo } from '../../struct';
3
+ import { BaseModel, baseInit, closedModel, makeUpdate, makeView, } from './shared';
4
+ // MODEL
5
+ /** Schema for the listbox component's state, tracking open/closed status, active item, selected item, activation trigger, and typeahead search. */
6
+ export const Model = BaseModel.pipe(S.extend(S.Struct({ maybeSelectedItem: S.OptionFromSelf(S.String) })));
7
+ /** Creates an initial single-select listbox model from a config. Defaults to closed with no active item and no selection. */
8
+ export const init = (config) => ({
9
+ ...baseInit(config),
10
+ maybeSelectedItem: Option.fromNullable(config.selectedItem),
11
+ });
12
+ // UPDATE
13
+ /** Processes a listbox message and returns the next model and commands. Closes the listbox on selection (single-select behavior). */
14
+ export const update = makeUpdate((model, item, context) => [
15
+ evo(closedModel(model), {
16
+ maybeSelectedItem: () => Option.some(item),
17
+ }),
18
+ pipe(Array.getSomes([
19
+ context.maybeNextFrame,
20
+ context.maybeUnlockScroll,
21
+ context.maybeRestoreInert,
22
+ ]), Array.prepend(context.focusButton)),
23
+ ]);
24
+ /** Renders a headless single-select listbox with typeahead search, keyboard navigation, selection tracking, and aria-activedescendant focus management. */
25
+ export const view = makeView({
26
+ isItemSelected: (model, itemValue) => Option.exists(model.maybeSelectedItem, selectedItem => selectedItem === itemValue),
27
+ selectedItemIndex: (model, items, itemToValue) => Option.flatMap(model.maybeSelectedItem, selectedItem => Array.findFirstIndex(items, item => itemToValue(item) === selectedItem)),
28
+ ariaMultiSelectable: false,
29
+ });
@@ -1,6 +1,8 @@
1
- import { Option, Schema as S } from 'effect';
1
+ import { Schema as S } from 'effect';
2
2
  import type { Command } from '../../command';
3
3
  import { type Html } from '../../html';
4
+ import { groupContiguous } from '../group';
5
+ import { resolveTypeaheadMatch } from '../typeahead';
4
6
  import type { AnchorConfig } from './anchor';
5
7
  /** Schema for the activation trigger — whether the user interacted via mouse or keyboard. */
6
8
  export declare const ActivationTrigger: S.Literal<["Pointer", "Keyboard"]>;
@@ -182,14 +184,7 @@ export type ViewConfig<Message, Item extends string> = Readonly<{
182
184
  separatorClassName?: string;
183
185
  anchor?: AnchorConfig;
184
186
  }>;
185
- type Segment<A> = Readonly<{
186
- key: string;
187
- items: ReadonlyArray<A>;
188
- }>;
189
- export declare const groupContiguous: <A>(items: ReadonlyArray<A>, toKey: (item: A, index: number) => string) => ReadonlyArray<Segment<A>>;
190
- /** Finds the first enabled item whose search text starts with the query, searching forward from the active item and wrapping around. On a fresh search, starts after the active item; on a refinement, includes the active item. */
191
- export declare const resolveTypeaheadMatch: <Item extends string>(items: ReadonlyArray<Item>, query: string, maybeActiveItemIndex: Option.Option<number>, isDisabled: (index: number) => boolean, itemToSearchText: (item: Item, index: number) => string, isRefinement: boolean) => Option.Option<number>;
187
+ export { groupContiguous, resolveTypeaheadMatch };
192
188
  /** Renders a headless menu with typeahead search, keyboard navigation, and aria-activedescendant focus management. */
193
189
  export declare const view: <Message, Item extends string>(config: ViewConfig<Message, Item>) => Html;
194
- export {};
195
190
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/menu/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/menu/index.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
- import { Array, Effect, Match as M, Option, Schema as S, String as Str, pipe, } from 'effect';
1
+ import { Array, Effect, Match as M, Option, Predicate, Schema as S, String as Str, pipe, } from 'effect';
2
2
  import { OptionExt } from '../../effectExtensions';
3
3
  import { html } from '../../html';
4
4
  import { m } from '../../message';
5
5
  import { evo } from '../../struct';
6
6
  import * as Task from '../../task';
7
- import { findFirstEnabledIndex, keyToIndex, wrapIndex } from '../keyboard';
7
+ import { groupContiguous } from '../group';
8
+ import { findFirstEnabledIndex, isPrintableKey, keyToIndex } from '../keyboard';
9
+ import { resolveTypeaheadMatch } from '../typeahead';
8
10
  import { anchorHooks } from './anchor';
9
11
  // MODEL
10
12
  /** Schema for the activation trigger — whether the user interacted via mouse or keyboard. */
@@ -92,6 +94,7 @@ export const ReleasedPointerOnItems = m('ReleasedPointerOnItems', {
92
94
  export const Message = S.Union(Opened, Closed, ClosedByTab, ActivatedItem, DeactivatedItem, SelectedItem, MovedPointerOverItem, RequestedItemClick, Searched, ClearedSearch, NoOp, AdvancedTransitionFrame, EndedTransition, DetectedButtonMovement, PressedPointerOnButton, ReleasedPointerOnItems);
93
95
  // INIT
94
96
  const SEARCH_DEBOUNCE_MILLISECONDS = 350;
97
+ const LEFT_MOUSE_BUTTON = 0;
95
98
  const POINTER_HOLD_THRESHOLD_MILLISECONDS = 200;
96
99
  const POINTER_MOVEMENT_THRESHOLD_PIXELS = 5;
97
100
  /** Creates an initial menu model from a config. Defaults to closed with no active item. */
@@ -251,7 +254,7 @@ export const update = (model, message) => {
251
254
  const withPointerType = evo(model, {
252
255
  maybeLastButtonPointerType: () => Option.some(pointerType),
253
256
  });
254
- if (pointerType !== 'mouse' || button !== 0) {
257
+ if (pointerType !== 'mouse' || button !== LEFT_MOUSE_BUTTON) {
255
258
  return [withPointerType, []];
256
259
  }
257
260
  if (model.isOpen) {
@@ -303,30 +306,8 @@ export const update = (model, message) => {
303
306
  NoOp: () => [model, []],
304
307
  }));
305
308
  };
306
- export const groupContiguous = (items, toKey) => {
307
- const tagged = Array.map(items, (item, index) => ({
308
- key: toKey(item, index),
309
- item,
310
- }));
311
- return Array.chop(tagged, nonEmpty => {
312
- const key = Array.headNonEmpty(nonEmpty).key;
313
- const [matching, rest] = Array.span(nonEmpty, tagged => tagged.key === key);
314
- return [{ key, items: Array.map(matching, ({ item }) => item) }, rest];
315
- });
316
- };
309
+ export { groupContiguous, resolveTypeaheadMatch };
317
310
  const itemId = (id, index) => `${id}-item-${index}`;
318
- /** Finds the first enabled item whose search text starts with the query, searching forward from the active item and wrapping around. On a fresh search, starts after the active item; on a refinement, includes the active item. */
319
- export const resolveTypeaheadMatch = (items, query, maybeActiveItemIndex, isDisabled, itemToSearchText, isRefinement) => {
320
- const lowerQuery = Str.toLowerCase(query);
321
- const offset = isRefinement ? 0 : 1;
322
- const startIndex = Option.match(maybeActiveItemIndex, {
323
- onNone: () => 0,
324
- onSome: index => index + offset,
325
- });
326
- const isEnabledMatch = (index) => !isDisabled(index) &&
327
- pipe(items, Array.get(index), Option.exists(item => pipe(itemToSearchText(item, index), Str.toLowerCase, Str.startsWith(lowerQuery))));
328
- return pipe(items.length, Array.makeBy(step => wrapIndex(startIndex + step, items.length)), Array.findFirst(isEnabledMatch));
329
- };
330
311
  /** Renders a headless menu with typeahead search, keyboard navigation, and aria-activedescendant focus management. */
331
312
  export const view = (config) => {
332
313
  const { div, AriaActiveDescendant, AriaControls, AriaDisabled, AriaExpanded, AriaHasPopup, AriaLabelledBy, Class, DataAttribute, Id, OnBlur, OnClick, OnDestroy, OnInsert, OnKeyDownPreventDefault, OnKeyUpPreventDefault, OnPointerDown, OnPointerLeave, OnPointerMove, OnPointerUp, Role, Style, Tabindex, Type, keyed, } = html();
@@ -348,7 +329,7 @@ export const view = (config) => {
348
329
  DataAttribute('leave', ''),
349
330
  DataAttribute('transition', ''),
350
331
  ]), M.orElse(() => []));
351
- const isDisabled = (index) => !!isItemDisabled &&
332
+ const isDisabled = (index) => Predicate.isNotUndefined(isItemDisabled) &&
352
333
  pipe(items, Array.get(index), Option.exists(item => isItemDisabled(item, index)));
353
334
  const firstEnabledIndex = findFirstEnabledIndex(items.length, 0, isDisabled)(0, 1);
354
335
  const lastEnabledIndex = findFirstEnabledIndex(items.length, 0, isDisabled)(items.length - 1, -1);
@@ -388,7 +369,7 @@ export const view = (config) => {
388
369
  : Option.map(maybeActiveItemIndex, index => toMessage(RequestedItemClick({ index })))), M.whenOr('ArrowDown', 'ArrowUp', 'Home', 'End', 'PageUp', 'PageDown', () => Option.some(toMessage(ActivatedItem({
389
370
  index: resolveActiveIndex(key),
390
371
  activationTrigger: 'Keyboard',
391
- })))), M.when(key => key.length === 1, () => searchForKey(key)), M.orElse(() => Option.none()));
372
+ })))), M.when(isPrintableKey, () => searchForKey(key)), M.orElse(() => Option.none()));
392
373
  const handleItemsPointerUp = (screenX, screenY, pointerType, timeStamp) => OptionExt.when(pointerType === 'mouse', toMessage(ReleasedPointerOnItems({ screenX, screenY, timeStamp })));
393
374
  const buttonAttributes = [
394
375
  Id(`${id}-button`),
@@ -450,7 +431,6 @@ export const view = (config) => {
450
431
  return keyed('div')(itemId(id, index), [
451
432
  Id(itemId(id, index)),
452
433
  Role('menuitem'),
453
- Tabindex(-1),
454
434
  Class(itemConfig.className),
455
435
  ...(isActiveItem ? [DataAttribute('active', '')] : []),
456
436
  ...(isDisabledItem
@@ -0,0 +1,4 @@
1
+ import { Option } from 'effect';
2
+ /** Finds the first enabled item whose search text starts with the query, searching forward from the active item and wrapping around. On a fresh search, starts after the active item; on a refinement, includes the active item. */
3
+ export declare const resolveTypeaheadMatch: <Item>(items: ReadonlyArray<Item>, query: string, maybeActiveItemIndex: Option.Option<number>, isDisabled: (index: number) => boolean, itemToSearchText: (item: Item, index: number) => string, isRefinement: boolean) => Option.Option<number>;
4
+ //# sourceMappingURL=typeahead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeahead.d.ts","sourceRoot":"","sources":["../../src/ui/typeahead.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAuB,MAAM,QAAQ,CAAA;AAI3D,oOAAoO;AACpO,eAAO,MAAM,qBAAqB,GAAI,IAAI,EACxC,OAAO,aAAa,CAAC,IAAI,CAAC,EAC1B,OAAO,MAAM,EACb,sBAAsB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAC3C,YAAY,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EACtC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,EACvD,cAAc,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CA4BtB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Array, Option, String as Str, pipe } from 'effect';
2
+ import { wrapIndex } from './keyboard';
3
+ /** Finds the first enabled item whose search text starts with the query, searching forward from the active item and wrapping around. On a fresh search, starts after the active item; on a refinement, includes the active item. */
4
+ export const resolveTypeaheadMatch = (items, query, maybeActiveItemIndex, isDisabled, itemToSearchText, isRefinement) => {
5
+ const lowerQuery = Str.toLowerCase(query);
6
+ const offset = isRefinement ? 0 : 1;
7
+ const startIndex = Option.match(maybeActiveItemIndex, {
8
+ onNone: () => 0,
9
+ onSome: index => index + offset,
10
+ });
11
+ const isEnabledMatch = (index) => !isDisabled(index) &&
12
+ pipe(items, Array.get(index), Option.exists(item => pipe(itemToSearchText(item, index), Str.toLowerCase, Str.startsWith(lowerQuery))));
13
+ return pipe(items, Array.length, Array.makeBy(step => wrapIndex(startIndex + step, items.length)), Array.findFirst(isEnabledMatch));
14
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "description": "Elm-inspired UI framework powered by Effect",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,6 +19,10 @@
19
19
  "types": "./dist/html/public.d.ts",
20
20
  "import": "./dist/html/public.js"
21
21
  },
22
+ "./managedResource": {
23
+ "types": "./dist/managedResource/public.d.ts",
24
+ "import": "./dist/managedResource/public.js"
25
+ },
22
26
  "./message": {
23
27
  "types": "./dist/message/public.d.ts",
24
28
  "import": "./dist/message/public.js"
@@ -47,6 +51,10 @@
47
51
  "types": "./dist/struct/public.d.ts",
48
52
  "import": "./dist/struct/public.js"
49
53
  },
54
+ "./subscription": {
55
+ "types": "./dist/subscription/public.d.ts",
56
+ "import": "./dist/subscription/public.js"
57
+ },
50
58
  "./task": {
51
59
  "types": "./dist/task/public.d.ts",
52
60
  "import": "./dist/task/public.js"
@@ -63,6 +71,10 @@
63
71
  "types": "./dist/ui/disclosure/public.d.ts",
64
72
  "import": "./dist/ui/disclosure/public.js"
65
73
  },
74
+ "./ui/listbox": {
75
+ "types": "./dist/ui/listbox/public.d.ts",
76
+ "import": "./dist/ui/listbox/public.js"
77
+ },
66
78
  "./ui/menu": {
67
79
  "types": "./dist/ui/menu/public.d.ts",
68
80
  "import": "./dist/ui/menu/public.js"