foldkit 0.17.0 → 0.19.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 (87) hide show
  1. package/README.md +11 -16
  2. package/dist/effectExtensions/optionExtensions.d.ts +4 -0
  3. package/dist/effectExtensions/optionExtensions.d.ts.map +1 -1
  4. package/dist/effectExtensions/optionExtensions.js +2 -1
  5. package/dist/fieldValidation/index.d.ts +8 -8
  6. package/dist/fieldValidation/index.d.ts.map +1 -1
  7. package/dist/fieldValidation/index.js +9 -8
  8. package/dist/html/index.d.ts +57 -1
  9. package/dist/html/index.d.ts.map +1 -1
  10. package/dist/html/index.js +69 -7
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/message/index.d.ts +2 -0
  15. package/dist/message/index.d.ts.map +1 -0
  16. package/dist/message/index.js +1 -0
  17. package/dist/message/public.d.ts +2 -0
  18. package/dist/message/public.d.ts.map +1 -0
  19. package/dist/message/public.js +1 -0
  20. package/dist/route/index.d.ts +1 -0
  21. package/dist/route/index.d.ts.map +1 -1
  22. package/dist/route/index.js +1 -0
  23. package/dist/route/parser.js +17 -17
  24. package/dist/route/public.d.ts +1 -1
  25. package/dist/route/public.d.ts.map +1 -1
  26. package/dist/route/public.js +1 -1
  27. package/dist/runtime/browserListeners.d.ts.map +1 -1
  28. package/dist/runtime/browserListeners.js +2 -2
  29. package/dist/runtime/runtime.d.ts +1 -1
  30. package/dist/runtime/runtime.d.ts.map +1 -1
  31. package/dist/runtime/runtime.js +8 -8
  32. package/dist/runtime/urlRequest.d.ts +4 -4
  33. package/dist/runtime/urlRequest.d.ts.map +1 -1
  34. package/dist/runtime/urlRequest.js +3 -2
  35. package/dist/schema/index.d.ts +44 -10
  36. package/dist/schema/index.d.ts.map +1 -1
  37. package/dist/schema/index.js +19 -15
  38. package/dist/schema/public.d.ts +1 -0
  39. package/dist/schema/public.d.ts.map +1 -1
  40. package/dist/task/dom.d.ts +59 -0
  41. package/dist/task/dom.d.ts.map +1 -0
  42. package/dist/task/dom.js +113 -0
  43. package/dist/task/index.d.ts +6 -85
  44. package/dist/task/index.d.ts.map +1 -1
  45. package/dist/task/index.js +6 -131
  46. package/dist/task/inert.d.ts +25 -0
  47. package/dist/task/inert.d.ts.map +1 -0
  48. package/dist/task/inert.js +88 -0
  49. package/dist/task/public.d.ts +1 -1
  50. package/dist/task/public.d.ts.map +1 -1
  51. package/dist/task/public.js +1 -1
  52. package/dist/task/random.d.ts +12 -0
  53. package/dist/task/random.d.ts.map +1 -0
  54. package/dist/task/random.js +11 -0
  55. package/dist/task/scrollLock.d.ts +24 -0
  56. package/dist/task/scrollLock.d.ts.map +1 -0
  57. package/dist/task/scrollLock.js +48 -0
  58. package/dist/task/time.d.ts +42 -0
  59. package/dist/task/time.d.ts.map +1 -0
  60. package/dist/task/time.js +54 -0
  61. package/dist/task/timing.d.ts +36 -0
  62. package/dist/task/timing.d.ts.map +1 -0
  63. package/dist/task/timing.js +55 -0
  64. package/dist/ui/dialog/index.d.ts +4 -4
  65. package/dist/ui/dialog/index.d.ts.map +1 -1
  66. package/dist/ui/dialog/index.js +8 -8
  67. package/dist/ui/disclosure/index.d.ts +4 -4
  68. package/dist/ui/disclosure/index.d.ts.map +1 -1
  69. package/dist/ui/disclosure/index.js +8 -8
  70. package/dist/ui/index.d.ts +1 -0
  71. package/dist/ui/index.d.ts.map +1 -1
  72. package/dist/ui/index.js +1 -0
  73. package/dist/ui/keyboard.d.ts +4 -0
  74. package/dist/ui/keyboard.d.ts.map +1 -0
  75. package/dist/ui/keyboard.js +7 -0
  76. package/dist/ui/menu/index.d.ts +189 -0
  77. package/dist/ui/menu/index.d.ts.map +1 -0
  78. package/dist/ui/menu/index.js +502 -0
  79. package/dist/ui/menu/public.d.ts +3 -0
  80. package/dist/ui/menu/public.d.ts.map +1 -0
  81. package/dist/ui/menu/public.js +1 -0
  82. package/dist/ui/tabs/index.d.ts +8 -10
  83. package/dist/ui/tabs/index.d.ts.map +1 -1
  84. package/dist/ui/tabs/index.js +17 -28
  85. package/dist/url/index.d.ts +1 -1
  86. package/dist/url/index.js +4 -4
  87. package/package.json +14 -1
@@ -0,0 +1,55 @@
1
+ import { Effect } from 'effect';
2
+ /**
3
+ * Creates a command that resolves to a message after a delay.
4
+ * Useful for debouncing, such as clearing a typeahead search query.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * Task.delay(350, () => ClearedSearch({ version: model.searchVersion }))
9
+ * Task.delay(Duration.seconds(1), () => TimedOut())
10
+ * ```
11
+ */
12
+ export const delay = (duration, f) => Effect.gen(function* () {
13
+ yield* Effect.sleep(duration);
14
+ return f();
15
+ });
16
+ /**
17
+ * Creates a command that resolves to a message after two animation frames,
18
+ * ensuring the browser has painted the current state before proceeding.
19
+ * Used for CSS transition orchestration — the double-rAF guarantees the "from"
20
+ * state is visible before transitioning to the "to" state.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * Task.nextFrame(() => TransitionFrameAdvanced())
25
+ * ```
26
+ */
27
+ export const nextFrame = (f) => Effect.async(resume => {
28
+ requestAnimationFrame(() => {
29
+ requestAnimationFrame(() => {
30
+ resume(Effect.succeed(f()));
31
+ });
32
+ });
33
+ });
34
+ /**
35
+ * Creates a command that waits for all CSS transitions on the element matching the selector
36
+ * to complete, then resolves to a message. Uses the Web Animations API for reliable detection.
37
+ * Falls back to resolving immediately if the element is missing or has no active transitions.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * Task.waitForTransitions('#menu-items', () => TransitionEnded())
42
+ * ```
43
+ */
44
+ export const waitForTransitions = (selector, f) => Effect.async(resume => {
45
+ requestAnimationFrame(async () => {
46
+ const element = document.querySelector(selector);
47
+ const cssTransitions = element instanceof HTMLElement
48
+ ? element
49
+ .getAnimations()
50
+ .filter(animation => 'transitionProperty' in animation)
51
+ : [];
52
+ await Promise.allSettled(cssTransitions.map(({ finished }) => finished));
53
+ resume(Effect.succeed(f()));
54
+ });
55
+ });
@@ -8,13 +8,13 @@ export declare const Model: S.Struct<{
8
8
  }>;
9
9
  export type Model = typeof Model.Type;
10
10
  /** Sent when the dialog should open. Triggers the showModal command. */
11
- export declare const Opened: S.TaggedStruct<"Opened", {}>;
11
+ export declare const Opened: import("../../schema").CallableTaggedStruct<"Opened", {}>;
12
12
  /** Sent when the dialog should close (Escape key, backdrop click, or programmatic). Triggers the closeModal command. */
13
- export declare const Closed: S.TaggedStruct<"Closed", {}>;
13
+ export declare const Closed: import("../../schema").CallableTaggedStruct<"Closed", {}>;
14
14
  /** Placeholder message used when no action is needed, such as after a showModal or closeModal command completes. */
15
- export declare const NoOp: S.TaggedStruct<"NoOp", {}>;
15
+ export declare const NoOp: import("../../schema").CallableTaggedStruct<"NoOp", {}>;
16
16
  /** Union of all messages the dialog component can produce. */
17
- export declare const Message: S.Union<[S.TaggedStruct<"Opened", {}>, S.TaggedStruct<"Closed", {}>, S.TaggedStruct<"NoOp", {}>]>;
17
+ export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"Opened", {}>, import("../../schema").CallableTaggedStruct<"Closed", {}>, import("../../schema").CallableTaggedStruct<"NoOp", {}>]>;
18
18
  export type Opened = typeof Opened.Type;
19
19
  export type Closed = typeof Closed.Type;
20
20
  export type NoOp = typeof NoOp.Type;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAGxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAOpD,8FAA8F;AAC9F,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,wEAAwE;AACxE,eAAO,MAAM,MAAM,8BAAe,CAAA;AAClC,wHAAwH;AACxH,eAAO,MAAM,MAAM,8BAAe,CAAA;AAClC,oHAAoH;AACpH,eAAO,MAAM,IAAI,4BAAa,CAAA;AAE9B,8DAA8D;AAC9D,eAAO,MAAM,OAAO,mGAAgC,CAAA;AAEpD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,yEAAyE;AACzE,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAMF,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CA4BvC,CAAA;AAIH,iGAAiG;AACjG,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,MAA6B,CAAA;AAEpE,wGAAwG;AACxG,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,MAAmC,CAAA;AAEhF,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAA;IAC9C,YAAY,EAAE,IAAI,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,sGAAsG;AACtG,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAG,IA6C3D,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAGxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAMpD,8FAA8F;AAC9F,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,wEAAwE;AACxE,eAAO,MAAM,MAAM,2DAAc,CAAA;AACjC,wHAAwH;AACxH,eAAO,MAAM,MAAM,2DAAc,CAAA;AACjC,oHAAoH;AACpH,eAAO,MAAM,IAAI,yDAAY,CAAA;AAE7B,8DAA8D;AAC9D,eAAO,MAAM,OAAO,0LAAgC,CAAA;AAEpD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,yEAAyE;AACzE,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAMF,0EAA0E;AAC1E,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CA4BvC,CAAA;AAIH,iGAAiG;AACjG,eAAO,MAAM,OAAO,GAAI,OAAO,KAAK,KAAG,MAA6B,CAAA;AAEpE,wGAAwG;AACxG,eAAO,MAAM,aAAa,GAAI,OAAO,KAAK,KAAG,MAAmC,CAAA;AAEhF,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAA;IAC9C,YAAY,EAAE,IAAI,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,sGAAsG;AACtG,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAG,IA6C3D,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Match as M, Option, Schema as S } from 'effect';
2
2
  import { html } from '../../html';
3
- import { ts } from '../../schema';
3
+ import { m } from '../../message';
4
4
  import { evo } from '../../struct';
5
5
  import * as Task from '../../task';
6
6
  // MODEL
@@ -11,11 +11,11 @@ export const Model = S.Struct({
11
11
  });
12
12
  // MESSAGE
13
13
  /** Sent when the dialog should open. Triggers the showModal command. */
14
- export const Opened = ts('Opened');
14
+ export const Opened = m('Opened');
15
15
  /** Sent when the dialog should close (Escape key, backdrop click, or programmatic). Triggers the closeModal command. */
16
- export const Closed = ts('Closed');
16
+ export const Closed = m('Closed');
17
17
  /** Placeholder message used when no action is needed, such as after a showModal or closeModal command completes. */
18
- export const NoOp = ts('NoOp');
18
+ export const NoOp = m('NoOp');
19
19
  /** Union of all messages the dialog component can produce. */
20
20
  export const Message = S.Union(Opened, Closed, NoOp);
21
21
  /** Creates an initial dialog model from a config. Defaults to closed. */
@@ -28,14 +28,14 @@ const dialogSelector = (id) => `#${id}`;
28
28
  /** Processes a dialog message and returns the next model and commands. */
29
29
  export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
30
30
  Opened: () => {
31
- const maybeShowCommand = Option.liftPredicate(Task.showModal(dialogSelector(model.id), () => NoOp.make()), () => !model.isOpen);
31
+ const maybeShowCommand = Option.liftPredicate(Task.showModal(dialogSelector(model.id), () => NoOp()), () => !model.isOpen);
32
32
  return [
33
33
  evo(model, { isOpen: () => true }),
34
34
  Option.toArray(maybeShowCommand),
35
35
  ];
36
36
  },
37
37
  Closed: () => {
38
- const maybeCloseCommand = Option.liftPredicate(Task.closeModal(dialogSelector(model.id), () => NoOp.make()), () => model.isOpen);
38
+ const maybeCloseCommand = Option.liftPredicate(Task.closeModal(dialogSelector(model.id), () => NoOp()), () => model.isOpen);
39
39
  return [
40
40
  evo(model, { isOpen: () => false }),
41
41
  Option.toArray(maybeCloseCommand),
@@ -56,11 +56,11 @@ export const view = (config) => {
56
56
  Id(id),
57
57
  AriaLabelledBy(`${id}-title`),
58
58
  AriaDescribedBy(`${id}-description`),
59
- OnCancel(toMessage(Closed.make())),
59
+ OnCancel(toMessage(Closed())),
60
60
  ...(isOpen ? [DataAttribute('open', '')] : []),
61
61
  ...(className ? [Class(className)] : []),
62
62
  ];
63
- const backdrop = keyed('div')(`${id}-backdrop`, [Class(backdropClassName), OnClick(toMessage(Closed.make()))], []);
63
+ const backdrop = keyed('div')(`${id}-backdrop`, [Class(backdropClassName), OnClick(toMessage(Closed()))], []);
64
64
  const panel = keyed('div')(`${id}-panel`, [Class(panelClassName)], [panelContent]);
65
65
  const content = isOpen ? [backdrop, panel] : [];
66
66
  return keyed('dialog')(id, dialogAttributes, content);
@@ -8,13 +8,13 @@ export declare const Model: S.Struct<{
8
8
  }>;
9
9
  export type Model = typeof Model.Type;
10
10
  /** Sent when the disclosure button is clicked. Toggles the open/closed state. */
11
- export declare const Toggled: S.TaggedStruct<"Toggled", {}>;
11
+ export declare const Toggled: import("../../schema").CallableTaggedStruct<"Toggled", {}>;
12
12
  /** Sent to explicitly close the disclosure, regardless of its current state. */
13
- export declare const Closed: S.TaggedStruct<"Closed", {}>;
13
+ export declare const Closed: import("../../schema").CallableTaggedStruct<"Closed", {}>;
14
14
  /** Placeholder message used when no action is needed, such as after a focus command completes. */
15
- export declare const NoOp: S.TaggedStruct<"NoOp", {}>;
15
+ export declare const NoOp: import("../../schema").CallableTaggedStruct<"NoOp", {}>;
16
16
  /** Union of all messages the disclosure component can produce. */
17
- export declare const Message: S.Union<[S.TaggedStruct<"Toggled", {}>, S.TaggedStruct<"Closed", {}>, S.TaggedStruct<"NoOp", {}>]>;
17
+ export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"Toggled", {}>, import("../../schema").CallableTaggedStruct<"Closed", {}>, import("../../schema").CallableTaggedStruct<"NoOp", {}>]>;
18
18
  export type Toggled = typeof Toggled.Type;
19
19
  export type Closed = typeof Closed.Type;
20
20
  export type NoOp = typeof NoOp.Type;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/disclosure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAGxD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAOpD,kGAAkG;AAClG,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,iFAAiF;AACjF,eAAO,MAAM,OAAO,+BAAgB,CAAA;AACpC,gFAAgF;AAChF,eAAO,MAAM,MAAM,8BAAe,CAAA;AAClC,kGAAkG;AAClG,eAAO,MAAM,IAAI,4BAAa,CAAA;AAE9B,kEAAkE;AAClE,eAAO,MAAM,OAAO,oGAAiC,CAAA;AAErD,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AACzC,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,6EAA6E;AAC7E,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAQF,8EAA8E;AAC9E,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CA4BvC,CAAA;AAIH,4DAA4D;AAC5D,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,KAAK,OAAO,CAAA;IACxD,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,IAAI,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,IAAI,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,oGAAoG;AACpG,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAG,IAyF3D,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/disclosure/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAGxD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAMpD,kGAAkG;AAClG,eAAO,MAAM,KAAK;;;EAGhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,iFAAiF;AACjF,eAAO,MAAM,OAAO,4DAAe,CAAA;AACnC,gFAAgF;AAChF,eAAO,MAAM,MAAM,2DAAc,CAAA;AACjC,kGAAkG;AAClG,eAAO,MAAM,IAAI,yDAAY,CAAA;AAE7B,kEAAkE;AAClE,eAAO,MAAM,OAAO,2LAAiC,CAAA;AAErD,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AACzC,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AACvC,MAAM,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAC,CAAA;AAEF,6EAA6E;AAC7E,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAQF,8EAA8E;AAC9E,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CA4BvC,CAAA;AAIH,4DAA4D;AAC5D,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,KAAK,EAAE,KAAK,CAAA;IACZ,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,KAAK,OAAO,CAAA;IACxD,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,IAAI,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,IAAI,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAC,CAAA;AAEF,oGAAoG;AACpG,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,CAAC,KAAG,IAyF3D,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Match as M, Option, Schema as S } from 'effect';
2
2
  import { html } from '../../html';
3
- import { ts } from '../../schema';
3
+ import { m } from '../../message';
4
4
  import { evo } from '../../struct';
5
5
  import * as Task from '../../task';
6
6
  // MODEL
@@ -11,11 +11,11 @@ export const Model = S.Struct({
11
11
  });
12
12
  // MESSAGE
13
13
  /** Sent when the disclosure button is clicked. Toggles the open/closed state. */
14
- export const Toggled = ts('Toggled');
14
+ export const Toggled = m('Toggled');
15
15
  /** Sent to explicitly close the disclosure, regardless of its current state. */
16
- export const Closed = ts('Closed');
16
+ export const Closed = m('Closed');
17
17
  /** Placeholder message used when no action is needed, such as after a focus command completes. */
18
- export const NoOp = ts('NoOp');
18
+ export const NoOp = m('NoOp');
19
19
  /** Union of all messages the disclosure component can produce. */
20
20
  export const Message = S.Union(Toggled, Closed, NoOp);
21
21
  /** Creates an initial disclosure model from a config. Defaults to closed. */
@@ -29,14 +29,14 @@ const panelId = (id) => `${id}-panel`;
29
29
  /** Processes a disclosure message and returns the next model and commands. */
30
30
  export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
31
31
  Toggled: () => {
32
- const maybeFocusCommand = Option.liftPredicate(Task.focus(`#${buttonId(model.id)}`, () => NoOp.make()), () => model.isOpen);
32
+ const maybeFocusCommand = Option.liftPredicate(Task.focus(`#${buttonId(model.id)}`, () => NoOp()), () => model.isOpen);
33
33
  return [
34
34
  evo(model, { isOpen: () => !model.isOpen }),
35
35
  Option.toArray(maybeFocusCommand),
36
36
  ];
37
37
  },
38
38
  Closed: () => {
39
- const maybeFocusCommand = Option.liftPredicate(Task.focus(`#${buttonId(model.id)}`, () => NoOp.make()), () => model.isOpen);
39
+ const maybeFocusCommand = Option.liftPredicate(Task.focus(`#${buttonId(model.id)}`, () => NoOp()), () => model.isOpen);
40
40
  return [
41
41
  evo(model, { isOpen: () => false }),
42
42
  Option.toArray(maybeFocusCommand),
@@ -51,7 +51,7 @@ export const view = (config) => {
51
51
  const isNativeButton = buttonElement === 'button';
52
52
  const handleKeyDown = (key) =>
53
53
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
54
- M.value(key).pipe(M.whenOr('Enter', ' ', () => toMessage(Toggled.make())), M.orElse(() => toMessage(NoOp.make())));
54
+ M.value(key).pipe(M.whenOr('Enter', ' ', () => toMessage(Toggled())), M.orElse(() => toMessage(NoOp())));
55
55
  const disabledAttributes = [
56
56
  Disabled(true),
57
57
  AriaDisabled(true),
@@ -60,7 +60,7 @@ export const view = (config) => {
60
60
  const interactionAttributes = isDisabled
61
61
  ? disabledAttributes
62
62
  : [
63
- OnClick(toMessage(Toggled.make())),
63
+ OnClick(toMessage(Toggled())),
64
64
  ...(!isNativeButton ? [OnKeyDown(handleKeyDown)] : []),
65
65
  ];
66
66
  const buttonAttributes = [
@@ -1,4 +1,5 @@
1
1
  export * as Dialog from './dialog/public';
2
2
  export * as Disclosure from './disclosure/public';
3
+ export * as Menu from './menu/public';
3
4
  export * as Tabs from './tabs/public';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAA"}
package/dist/ui/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * as Dialog from './dialog/public';
2
2
  export * as Disclosure from './disclosure/public';
3
+ export * as Menu from './menu/public';
3
4
  export * as Tabs from './tabs/public';
@@ -0,0 +1,4 @@
1
+ export declare const wrapIndex: (index: number, length: number) => number;
2
+ export declare const findFirstEnabledIndex: (itemCount: number, focusedIndex: number, isDisabled: (index: number) => boolean) => (startIndex: number, direction: 1 | -1) => number;
3
+ export declare const keyToIndex: (nextKey: string, previousKey: string, itemCount: number, focusedIndex: number, isDisabled: (index: number) => boolean) => ((key: string) => number);
4
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/ui/keyboard.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAG,MACpB,CAAA;AAEtC,eAAO,MAAM,qBAAqB,GAE9B,WAAW,MAAM,EACjB,cAAc,MAAM,EACpB,YAAY,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,MAEvC,YAAY,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,KAAG,MAMtC,CAAA;AAEL,eAAO,MAAM,UAAU,GACrB,SAAS,MAAM,EACf,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,cAAc,MAAM,EACpB,YAAY,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,KACrC,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAW1B,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { Array, Match as M, Option, Predicate, pipe } from 'effect';
2
+ export const wrapIndex = (index, length) => ((index % length) + length) % length;
3
+ export const findFirstEnabledIndex = (itemCount, focusedIndex, isDisabled) => (startIndex, direction) => pipe(itemCount, Array.makeBy(step => wrapIndex(startIndex + step * direction, itemCount)), Array.findFirst(Predicate.not(isDisabled)), Option.getOrElse(() => focusedIndex));
4
+ export const keyToIndex = (nextKey, previousKey, itemCount, focusedIndex, isDisabled) => {
5
+ const find = findFirstEnabledIndex(itemCount, focusedIndex, isDisabled);
6
+ return (key) => M.value(key).pipe(M.when(nextKey, () => find(focusedIndex + 1, 1)), M.when(previousKey, () => find(focusedIndex - 1, -1)), M.whenOr('Home', 'PageUp', () => find(0, 1)), M.whenOr('End', 'PageDown', () => find(itemCount - 1, -1)), M.orElse(() => focusedIndex));
7
+ };
@@ -0,0 +1,189 @@
1
+ import { Option, Schema as S } from 'effect';
2
+ import type { Html } from '../../html';
3
+ import type { Command } from '../../runtime/runtime';
4
+ /** Schema for the activation trigger — whether the user interacted via mouse or keyboard. */
5
+ export declare const ActivationTrigger: S.Literal<["Pointer", "Keyboard"]>;
6
+ export type ActivationTrigger = typeof ActivationTrigger.Type;
7
+ /** Schema for the transition animation state, tracking enter/leave phases for CSS transition coordination. */
8
+ export declare const TransitionState: S.Literal<["Idle", "EnterStart", "EnterAnimating", "LeaveStart", "LeaveAnimating"]>;
9
+ export type TransitionState = typeof TransitionState.Type;
10
+ /** Schema for the menu component's state, tracking open/closed status, active item, activation trigger, and typeahead search. */
11
+ export declare const Model: S.Struct<{
12
+ id: typeof S.String;
13
+ isOpen: typeof S.Boolean;
14
+ isAnimated: typeof S.Boolean;
15
+ isModal: typeof S.Boolean;
16
+ transitionState: S.Literal<["Idle", "EnterStart", "EnterAnimating", "LeaveStart", "LeaveAnimating"]>;
17
+ maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
18
+ activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
19
+ searchQuery: typeof S.String;
20
+ searchVersion: typeof S.Number;
21
+ maybeLastPointerPosition: S.OptionFromSelf<S.Struct<{
22
+ screenX: typeof S.Number;
23
+ screenY: typeof S.Number;
24
+ }>>;
25
+ maybeLastButtonPointerType: S.OptionFromSelf<typeof S.String>;
26
+ maybePointerOrigin: S.OptionFromSelf<S.Struct<{
27
+ screenX: typeof S.Number;
28
+ screenY: typeof S.Number;
29
+ timeStamp: typeof S.Number;
30
+ }>>;
31
+ }>;
32
+ export type Model = typeof Model.Type;
33
+ /** Sent when the menu opens via button click or keyboard. Contains an optional initial active item index — None for pointer, Some for keyboard. */
34
+ export declare const Opened: import("../../schema").CallableTaggedStruct<"Opened", {
35
+ maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
36
+ }>;
37
+ /** Sent when the menu closes via Escape key or backdrop click. */
38
+ export declare const Closed: import("../../schema").CallableTaggedStruct<"Closed", {}>;
39
+ /** Sent when focus leaves the menu items container via Tab key. */
40
+ export declare const ClosedByTab: import("../../schema").CallableTaggedStruct<"ClosedByTab", {}>;
41
+ /** Sent when an item is highlighted via arrow keys or mouse hover. Includes activation trigger. */
42
+ export declare const ActivatedItem: import("../../schema").CallableTaggedStruct<"ActivatedItem", {
43
+ index: typeof S.Number;
44
+ activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
45
+ }>;
46
+ /** Sent when the mouse leaves an enabled item. */
47
+ export declare const DeactivatedItem: import("../../schema").CallableTaggedStruct<"DeactivatedItem", {}>;
48
+ /** Sent when an item is selected via Enter, Space, or click. */
49
+ export declare const SelectedItem: import("../../schema").CallableTaggedStruct<"SelectedItem", {
50
+ index: typeof S.Number;
51
+ }>;
52
+ /** Sent when Enter or Space is pressed on the active item, triggering a programmatic click on the DOM element. */
53
+ export declare const RequestedItemClick: import("../../schema").CallableTaggedStruct<"RequestedItemClick", {
54
+ index: typeof S.Number;
55
+ }>;
56
+ /** Sent when a printable character is typed for typeahead search. */
57
+ export declare const Searched: import("../../schema").CallableTaggedStruct<"Searched", {
58
+ key: typeof S.String;
59
+ maybeTargetIndex: S.OptionFromSelf<typeof S.Number>;
60
+ }>;
61
+ /** Sent after the search debounce period to clear the accumulated query. */
62
+ export declare const ClearedSearch: import("../../schema").CallableTaggedStruct<"ClearedSearch", {
63
+ version: typeof S.Number;
64
+ }>;
65
+ /** Sent when the pointer moves over a menu item, carrying screen coordinates for tracked-pointer comparison. */
66
+ export declare const MovedPointerOverItem: import("../../schema").CallableTaggedStruct<"MovedPointerOverItem", {
67
+ index: typeof S.Number;
68
+ screenX: typeof S.Number;
69
+ screenY: typeof S.Number;
70
+ }>;
71
+ /** Placeholder message used when no action is needed. */
72
+ export declare const NoOp: import("../../schema").CallableTaggedStruct<"NoOp", {}>;
73
+ /** Sent internally when a double-rAF completes, advancing the transition to its animating phase. */
74
+ export declare const AdvancedTransitionFrame: import("../../schema").CallableTaggedStruct<"AdvancedTransitionFrame", {}>;
75
+ /** Sent internally when all CSS transitions on the menu items container have completed. */
76
+ export declare const EndedTransition: import("../../schema").CallableTaggedStruct<"EndedTransition", {}>;
77
+ /** Sent when the user presses a pointer device on the menu button. Records pointer type and toggles for mouse. */
78
+ export declare const PressedPointerOnButton: import("../../schema").CallableTaggedStruct<"PressedPointerOnButton", {
79
+ pointerType: typeof S.String;
80
+ button: typeof S.Number;
81
+ screenX: typeof S.Number;
82
+ screenY: typeof S.Number;
83
+ timeStamp: typeof S.Number;
84
+ }>;
85
+ /** Sent when the user releases a pointer on the items container, enabling drag-to-select for mouse. */
86
+ export declare const ReleasedPointerOnItems: import("../../schema").CallableTaggedStruct<"ReleasedPointerOnItems", {
87
+ screenX: typeof S.Number;
88
+ screenY: typeof S.Number;
89
+ timeStamp: typeof S.Number;
90
+ }>;
91
+ /** Union of all messages the menu component can produce. */
92
+ export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"Opened", {
93
+ maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
94
+ }>, import("../../schema").CallableTaggedStruct<"Closed", {}>, import("../../schema").CallableTaggedStruct<"ClosedByTab", {}>, import("../../schema").CallableTaggedStruct<"ActivatedItem", {
95
+ index: typeof S.Number;
96
+ activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
97
+ }>, import("../../schema").CallableTaggedStruct<"DeactivatedItem", {}>, import("../../schema").CallableTaggedStruct<"SelectedItem", {
98
+ index: typeof S.Number;
99
+ }>, import("../../schema").CallableTaggedStruct<"MovedPointerOverItem", {
100
+ index: typeof S.Number;
101
+ screenX: typeof S.Number;
102
+ screenY: typeof S.Number;
103
+ }>, import("../../schema").CallableTaggedStruct<"RequestedItemClick", {
104
+ index: typeof S.Number;
105
+ }>, import("../../schema").CallableTaggedStruct<"Searched", {
106
+ key: typeof S.String;
107
+ maybeTargetIndex: S.OptionFromSelf<typeof S.Number>;
108
+ }>, import("../../schema").CallableTaggedStruct<"ClearedSearch", {
109
+ version: typeof S.Number;
110
+ }>, import("../../schema").CallableTaggedStruct<"NoOp", {}>, import("../../schema").CallableTaggedStruct<"AdvancedTransitionFrame", {}>, import("../../schema").CallableTaggedStruct<"EndedTransition", {}>, import("../../schema").CallableTaggedStruct<"PressedPointerOnButton", {
111
+ pointerType: typeof S.String;
112
+ button: typeof S.Number;
113
+ screenX: typeof S.Number;
114
+ screenY: typeof S.Number;
115
+ timeStamp: typeof S.Number;
116
+ }>, import("../../schema").CallableTaggedStruct<"ReleasedPointerOnItems", {
117
+ screenX: typeof S.Number;
118
+ screenY: typeof S.Number;
119
+ timeStamp: typeof S.Number;
120
+ }>]>;
121
+ export type Opened = typeof Opened.Type;
122
+ export type Closed = typeof Closed.Type;
123
+ export type ClosedByTab = typeof ClosedByTab.Type;
124
+ export type ActivatedItem = typeof ActivatedItem.Type;
125
+ export type DeactivatedItem = typeof DeactivatedItem.Type;
126
+ export type SelectedItem = typeof SelectedItem.Type;
127
+ export type MovedPointerOverItem = typeof MovedPointerOverItem.Type;
128
+ export type RequestedItemClick = typeof RequestedItemClick.Type;
129
+ export type Searched = typeof Searched.Type;
130
+ export type ClearedSearch = typeof ClearedSearch.Type;
131
+ export type NoOp = typeof NoOp.Type;
132
+ export type AdvancedTransitionFrame = typeof AdvancedTransitionFrame.Type;
133
+ export type EndedTransition = typeof EndedTransition.Type;
134
+ export type PressedPointerOnButton = typeof PressedPointerOnButton.Type;
135
+ export type ReleasedPointerOnItems = typeof ReleasedPointerOnItems.Type;
136
+ export type Message = typeof Message.Type;
137
+ /** Configuration for creating a menu model with `init`. `isAnimated` enables CSS transition coordination (default `false`). `isModal` locks page scroll and inerts other elements when open (default `true`). */
138
+ export type InitConfig = Readonly<{
139
+ id: string;
140
+ isAnimated?: boolean;
141
+ isModal?: boolean;
142
+ }>;
143
+ /** Creates an initial menu model from a config. Defaults to closed with no active item. */
144
+ export declare const init: (config: InitConfig) => Model;
145
+ /** Processes a menu message and returns the next model and commands. */
146
+ export declare const update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
147
+ /** Configuration for an individual menu item's appearance. */
148
+ export type ItemConfig = Readonly<{
149
+ className: string;
150
+ content: Html;
151
+ }>;
152
+ /** Configuration for a group heading rendered above a group of items. */
153
+ export type GroupHeading = Readonly<{
154
+ content: Html;
155
+ className: string;
156
+ }>;
157
+ /** Configuration for rendering a menu with `view`. */
158
+ export type ViewConfig<Message, Item extends string> = Readonly<{
159
+ model: Model;
160
+ toMessage: (message: Opened | Closed | ClosedByTab | ActivatedItem | DeactivatedItem | SelectedItem | MovedPointerOverItem | RequestedItemClick | Searched | PressedPointerOnButton | ReleasedPointerOnItems | NoOp) => Message;
161
+ items: ReadonlyArray<Item>;
162
+ itemToConfig: (item: Item, context: Readonly<{
163
+ isActive: boolean;
164
+ isDisabled: boolean;
165
+ }>) => ItemConfig;
166
+ isItemDisabled?: (item: Item, index: number) => boolean;
167
+ itemToSearchText?: (item: Item, index: number) => string;
168
+ isButtonDisabled?: boolean;
169
+ buttonContent: Html;
170
+ buttonClassName: string;
171
+ itemsClassName: string;
172
+ backdropClassName: string;
173
+ className?: string;
174
+ itemGroupKey?: (item: Item, index: number) => string;
175
+ groupToHeading?: (groupKey: string) => GroupHeading | undefined;
176
+ groupClassName?: string;
177
+ separatorClassName?: string;
178
+ }>;
179
+ type Segment<A> = Readonly<{
180
+ key: string;
181
+ items: ReadonlyArray<A>;
182
+ }>;
183
+ export declare const groupContiguous: <A>(items: ReadonlyArray<A>, toKey: (item: A, index: number) => string) => ReadonlyArray<Segment<A>>;
184
+ /** 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. */
185
+ 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>;
186
+ /** Renders a headless menu with typeahead search, keyboard navigation, and aria-activedescendant focus management. */
187
+ export declare const view: <Message, Item extends string>(config: ViewConfig<Message, Item>) => Html;
188
+ export {};
189
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/menu/index.ts"],"names":[],"mappings":"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"}