foldkit 0.33.6 → 0.34.1

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 (79) hide show
  1. package/README.md +19 -19
  2. package/dist/devtools/overlay.d.ts.map +1 -1
  3. package/dist/devtools/overlay.js +76 -33
  4. package/dist/html/index.d.ts +431 -5
  5. package/dist/html/index.d.ts.map +1 -1
  6. package/dist/html/index.js +1 -0
  7. package/dist/html/public.d.ts +1 -2
  8. package/dist/html/public.d.ts.map +1 -1
  9. package/dist/html/public.js +1 -2
  10. package/dist/task/dom.d.ts +6 -6
  11. package/dist/task/dom.js +6 -6
  12. package/dist/task/inert.d.ts +2 -2
  13. package/dist/task/inert.js +2 -2
  14. package/dist/task/scrollLock.d.ts +2 -2
  15. package/dist/task/scrollLock.js +2 -2
  16. package/dist/ui/checkbox/index.d.ts +5 -9
  17. package/dist/ui/checkbox/index.d.ts.map +1 -1
  18. package/dist/ui/checkbox/index.js +7 -10
  19. package/dist/ui/checkbox/public.d.ts +1 -1
  20. package/dist/ui/checkbox/public.d.ts.map +1 -1
  21. package/dist/ui/combobox/multi.d.ts +31 -10
  22. package/dist/ui/combobox/multi.d.ts.map +1 -1
  23. package/dist/ui/combobox/multi.js +1 -1
  24. package/dist/ui/combobox/public.d.ts +1 -1
  25. package/dist/ui/combobox/public.d.ts.map +1 -1
  26. package/dist/ui/combobox/shared.d.ts +53 -14
  27. package/dist/ui/combobox/shared.d.ts.map +1 -1
  28. package/dist/ui/combobox/shared.js +72 -28
  29. package/dist/ui/combobox/single.d.ts +31 -10
  30. package/dist/ui/combobox/single.d.ts.map +1 -1
  31. package/dist/ui/combobox/single.js +1 -1
  32. package/dist/ui/dialog/index.d.ts +14 -8
  33. package/dist/ui/dialog/index.d.ts.map +1 -1
  34. package/dist/ui/dialog/index.js +21 -12
  35. package/dist/ui/dialog/public.d.ts +1 -1
  36. package/dist/ui/dialog/public.d.ts.map +1 -1
  37. package/dist/ui/dialog/public.js +1 -1
  38. package/dist/ui/disclosure/index.d.ts +11 -8
  39. package/dist/ui/disclosure/index.d.ts.map +1 -1
  40. package/dist/ui/disclosure/index.js +20 -18
  41. package/dist/ui/disclosure/public.d.ts +1 -1
  42. package/dist/ui/disclosure/public.d.ts.map +1 -1
  43. package/dist/ui/listbox/multi.d.ts +34 -9
  44. package/dist/ui/listbox/multi.d.ts.map +1 -1
  45. package/dist/ui/listbox/multi.js +1 -1
  46. package/dist/ui/listbox/public.d.ts +1 -1
  47. package/dist/ui/listbox/public.d.ts.map +1 -1
  48. package/dist/ui/listbox/shared.d.ts +57 -13
  49. package/dist/ui/listbox/shared.d.ts.map +1 -1
  50. package/dist/ui/listbox/shared.js +77 -27
  51. package/dist/ui/listbox/single.d.ts +34 -9
  52. package/dist/ui/listbox/single.d.ts.map +1 -1
  53. package/dist/ui/listbox/single.js +1 -1
  54. package/dist/ui/menu/index.d.ts +39 -11
  55. package/dist/ui/menu/index.d.ts.map +1 -1
  56. package/dist/ui/menu/index.js +81 -32
  57. package/dist/ui/menu/public.d.ts +1 -1
  58. package/dist/ui/menu/public.d.ts.map +1 -1
  59. package/dist/ui/popover/index.d.ts +28 -12
  60. package/dist/ui/popover/index.d.ts.map +1 -1
  61. package/dist/ui/popover/index.js +50 -24
  62. package/dist/ui/popover/public.d.ts +1 -1
  63. package/dist/ui/popover/public.d.ts.map +1 -1
  64. package/dist/ui/radioGroup/index.d.ts +8 -7
  65. package/dist/ui/radioGroup/index.d.ts.map +1 -1
  66. package/dist/ui/radioGroup/index.js +12 -9
  67. package/dist/ui/radioGroup/public.d.ts +1 -1
  68. package/dist/ui/radioGroup/public.d.ts.map +1 -1
  69. package/dist/ui/switch/index.d.ts +5 -9
  70. package/dist/ui/switch/index.d.ts.map +1 -1
  71. package/dist/ui/switch/index.js +7 -10
  72. package/dist/ui/switch/public.d.ts +1 -1
  73. package/dist/ui/switch/public.d.ts.map +1 -1
  74. package/dist/ui/tabs/index.d.ts +13 -9
  75. package/dist/ui/tabs/index.d.ts.map +1 -1
  76. package/dist/ui/tabs/index.js +30 -17
  77. package/dist/ui/tabs/public.d.ts +1 -1
  78. package/dist/ui/tabs/public.d.ts.map +1 -1
  79. package/package.json +3 -3
@@ -1,7 +1,6 @@
1
1
  import { Schema as S } from 'effect';
2
2
  import type { Command } from '../../command';
3
- import type { Attribute } from '../../html';
4
- import type { Html } from '../../html';
3
+ import { type Attribute, type Html } from '../../html';
5
4
  /** Controls the radio group layout direction and which arrow keys navigate between options. */
6
5
  export declare const Orientation: S.Literal<["Horizontal", "Vertical"]>;
7
6
  export type Orientation = typeof Orientation.Type;
@@ -17,15 +16,15 @@ export declare const SelectedOption: import("../../schema").CallableTaggedStruct
17
16
  value: typeof S.String;
18
17
  index: typeof S.Number;
19
18
  }>;
20
- /** Placeholder message used when no action is needed. */
21
- export declare const NoOp: import("../../schema").CallableTaggedStruct<"NoOp", {}>;
19
+ /** Sent when the focus-option command completes. */
20
+ export declare const CompletedOptionFocus: import("../../schema").CallableTaggedStruct<"CompletedOptionFocus", {}>;
22
21
  /** Union of all messages the radio group component can produce. */
23
22
  export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"SelectedOption", {
24
23
  value: typeof S.String;
25
24
  index: typeof S.Number;
26
- }>, import("../../schema").CallableTaggedStruct<"NoOp", {}>]>;
25
+ }>, import("../../schema").CallableTaggedStruct<"CompletedOptionFocus", {}>]>;
27
26
  export type SelectedOption = typeof SelectedOption.Type;
28
- export type NoOp = typeof NoOp.Type;
27
+ export type CompletedOptionFocus = typeof CompletedOptionFocus.Type;
29
28
  export type Message = typeof Message.Type;
30
29
  /** Configuration for creating a radio group model with `init`. */
31
30
  export type InitConfig = Readonly<{
@@ -51,7 +50,7 @@ export type OptionConfig<Message> = Readonly<{
51
50
  /** Configuration for rendering a radio group with `view`. */
52
51
  export type ViewConfig<Message, Option extends string> = Readonly<{
53
52
  model: Model;
54
- toMessage: (message: SelectedOption | NoOp) => Message;
53
+ toMessage: (message: SelectedOption | CompletedOptionFocus) => Message;
55
54
  options: ReadonlyArray<Option>;
56
55
  optionToConfig: (option: Option, context: Readonly<{
57
56
  isSelected: boolean;
@@ -60,7 +59,9 @@ export type ViewConfig<Message, Option extends string> = Readonly<{
60
59
  }>) => OptionConfig<Message>;
61
60
  isOptionDisabled?: (option: Option, index: number) => boolean;
62
61
  orientation?: Orientation;
62
+ ariaLabel: string;
63
63
  className?: string;
64
+ attributes?: ReadonlyArray<Attribute<Message>>;
64
65
  name?: string;
65
66
  isDisabled?: boolean;
66
67
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/radioGroup/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/radioGroup/index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { Array, Effect, Match as M, Option, Predicate, Schema as S, String, pipe, } from 'effect';
2
- import { html } from '../../html';
3
- import { createLazy } from '../../html/lazy';
2
+ import { createLazy, html } from '../../html';
4
3
  import { m } from '../../message';
5
4
  import { evo } from '../../struct';
6
5
  import * as Task from '../../task';
@@ -20,10 +19,10 @@ export const SelectedOption = m('SelectedOption', {
20
19
  value: S.String,
21
20
  index: S.Number,
22
21
  });
23
- /** Placeholder message used when no action is needed. */
24
- export const NoOp = m('NoOp');
22
+ /** Sent when the focus-option command completes. */
23
+ export const CompletedOptionFocus = m('CompletedOptionFocus');
25
24
  /** Union of all messages the radio group component can produce. */
26
- export const Message = S.Union(SelectedOption, NoOp);
25
+ export const Message = S.Union(SelectedOption, CompletedOptionFocus);
27
26
  /** Creates an initial radio group model from a config. Defaults to no selection and vertical orientation. */
28
27
  export const init = (config) => ({
29
28
  id: config.id,
@@ -38,17 +37,19 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
38
37
  const selector = `#${optionId(model.id, index)}`;
39
38
  return [
40
39
  evo(model, { selectedValue: () => Option.some(value) }),
41
- [Task.focus(selector).pipe(Effect.ignore, Effect.as(NoOp()))],
40
+ [
41
+ Task.focus(selector).pipe(Effect.ignore, Effect.as(CompletedOptionFocus())),
42
+ ],
42
43
  ];
43
44
  },
44
- NoOp: () => [model, []],
45
+ CompletedOptionFocus: () => [model, []],
45
46
  }));
46
47
  const labelId = (id, index) => `${id}-option-${index}-label`;
47
48
  const descriptionId = (id, index) => `${id}-option-${index}-description`;
48
49
  /** Renders an accessible radio group by building ARIA attribute groups and delegating layout to the consumer's `optionToConfig` callback. */
49
50
  export const view = (config) => {
50
- const { div, input, AriaChecked, AriaDescribedBy, AriaDisabled, AriaLabelledBy, AriaOrientation, Class, DataAttribute, Id, Name, OnClick, OnKeyDownPreventDefault, Role, Tabindex, Type, Value, } = html();
51
- const { model, model: { id, selectedValue }, toMessage, options, optionToConfig, isOptionDisabled: isOptionDisabledFn, orientation = model.orientation, className, name, isDisabled: isGroupDisabled = false, } = config;
51
+ const { div, input, AriaChecked, AriaDescribedBy, AriaDisabled, AriaLabel, AriaLabelledBy, AriaOrientation, Class, DataAttribute, Id, Name, OnClick, OnKeyDownPreventDefault, Role, Tabindex, Type, Value, } = html();
52
+ const { model, model: { id, selectedValue }, toMessage, options, optionToConfig, isOptionDisabled: isOptionDisabledFn, orientation = model.orientation, ariaLabel, className, attributes = [], name, isDisabled: isGroupDisabled = false, } = config;
52
53
  const isDisabled = (index) => {
53
54
  if (isGroupDisabled) {
54
55
  return true;
@@ -131,7 +132,9 @@ export const view = (config) => {
131
132
  const groupAttributes = [
132
133
  Role('radiogroup'),
133
134
  AriaOrientation(String.toLowerCase(orientation)),
135
+ AriaLabel(ariaLabel),
134
136
  ...(className ? [Class(className)] : []),
137
+ ...attributes,
135
138
  ];
136
139
  return div(groupAttributes, [...renderedOptions, ...hiddenInputs]);
137
140
  };
@@ -1,3 +1,3 @@
1
1
  export { init, update, view, lazy, Model, Message } from './index';
2
- export type { SelectedOption, NoOp, Orientation, InitConfig, ViewConfig, OptionAttributes, OptionConfig, } from './index';
2
+ export type { SelectedOption, 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,IAAI,EACJ,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,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAElE,YAAY,EACV,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,GACb,MAAM,SAAS,CAAA"}
@@ -1,7 +1,6 @@
1
1
  import { Schema as S } from 'effect';
2
2
  import type { Command } from '../../command';
3
- import type { Attribute } from '../../html';
4
- import type { Html } from '../../html';
3
+ import { type Attribute, type Html } from '../../html';
5
4
  /** Schema for the switch component's state, tracking the toggle's checked status. */
6
5
  export declare const Model: S.Struct<{
7
6
  id: typeof S.String;
@@ -10,12 +9,9 @@ export declare const Model: S.Struct<{
10
9
  export type Model = typeof Model.Type;
11
10
  /** Sent when the user toggles the switch via click or Space key. */
12
11
  export declare const Toggled: import("../../schema").CallableTaggedStruct<"Toggled", {}>;
13
- /** Placeholder message used when no action is needed. */
14
- export declare const NoOp: import("../../schema").CallableTaggedStruct<"NoOp", {}>;
15
- /** Union of all messages the switch component can produce. */
16
- export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"Toggled", {}>, import("../../schema").CallableTaggedStruct<"NoOp", {}>]>;
12
+ /** Schema for all messages the switch component can produce. */
13
+ export declare const Message: import("../../schema").CallableTaggedStruct<"Toggled", {}>;
17
14
  export type Toggled = typeof Toggled.Type;
18
- export type NoOp = typeof NoOp.Type;
19
15
  export type Message = typeof Message.Type;
20
16
  /** Configuration for creating a switch model with `init`. */
21
17
  export type InitConfig = Readonly<{
@@ -25,7 +21,7 @@ export type InitConfig = Readonly<{
25
21
  /** Creates an initial switch model from a config. Defaults to unchecked. */
26
22
  export declare const init: (config: InitConfig) => Model;
27
23
  /** Processes a switch message and returns the next model and commands. */
28
- export declare const update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
24
+ export declare const update: (model: Model, _message: Message) => [Model, ReadonlyArray<Command<Message>>];
29
25
  /** Attribute groups the switch component provides to the consumer's `toView` callback. */
30
26
  export type SwitchAttributes<Message> = Readonly<{
31
27
  button: ReadonlyArray<Attribute<Message>>;
@@ -36,7 +32,7 @@ export type SwitchAttributes<Message> = Readonly<{
36
32
  /** Configuration for rendering a switch with `view`. */
37
33
  export type ViewConfig<Message> = Readonly<{
38
34
  model: Model;
39
- toMessage: (message: Toggled | NoOp) => Message;
35
+ toMessage: (message: Toggled) => Message;
40
36
  toView: (attributes: SwitchAttributes<Message>) => Html;
41
37
  isDisabled?: boolean;
42
38
  name?: string;
@@ -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,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAOtC,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;AACnC,yDAAyD;AACzD,eAAO,MAAM,IAAI,yDAAY,CAAA;AAE7B,8DAA8D;AAC9D,eAAO,MAAM,OAAO,gIAAyB,CAAA;AAE7C,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AACzC,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,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,SAAS,OAAO,KACf,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAOvC,CAAA;AAIH,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,GAAG,IAAI,KAAK,OAAO,CAAA;IAC/C,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,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAGzC,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,6 +1,5 @@
1
1
  import { Match as M, Option, Schema as S } from 'effect';
2
- import { html } from '../../html';
3
- import { createLazy } from '../../html/lazy';
2
+ import { createLazy, html } from '../../html';
4
3
  import { m } from '../../message';
5
4
  import { evo } from '../../struct';
6
5
  // MODEL
@@ -12,10 +11,8 @@ export const Model = S.Struct({
12
11
  // MESSAGE
13
12
  /** Sent when the user toggles the switch via click or Space key. */
14
13
  export const Toggled = m('Toggled');
15
- /** Placeholder message used when no action is needed. */
16
- export const NoOp = m('NoOp');
17
- /** Union of all messages the switch component can produce. */
18
- export const Message = S.Union(Toggled, NoOp);
14
+ /** Schema for all messages the switch component can produce. */
15
+ export const Message = Toggled;
19
16
  /** Creates an initial switch model from a config. Defaults to unchecked. */
20
17
  export const init = (config) => ({
21
18
  id: config.id,
@@ -23,10 +20,10 @@ export const init = (config) => ({
23
20
  });
24
21
  // UPDATE
25
22
  /** Processes a switch message and returns the next model and commands. */
26
- export const update = (model, message) => M.value(message).pipe(M.withReturnType(), M.tagsExhaustive({
27
- Toggled: () => [evo(model, { isChecked: isChecked => !isChecked }), []],
28
- NoOp: () => [model, []],
29
- }));
23
+ export const update = (model, _message) => [
24
+ evo(model, { isChecked: isChecked => !isChecked }),
25
+ [],
26
+ ];
30
27
  const labelId = (id) => `${id}-label`;
31
28
  const descriptionId = (id) => `${id}-description`;
32
29
  /** Renders an accessible switch toggle by building ARIA attribute groups and delegating layout to the consumer's `toView` callback. */
@@ -1,3 +1,3 @@
1
1
  export { init, update, view, lazy, Model, Message } from './index';
2
- export type { Toggled, NoOp, InitConfig, ViewConfig, SwitchAttributes, } from './index';
2
+ export type { Toggled, InitConfig, ViewConfig, SwitchAttributes } from './index';
3
3
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/switch/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAElE,YAAY,EACV,OAAO,EACP,IAAI,EACJ,UAAU,EACV,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/ui/switch/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAElE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Schema as S } from 'effect';
2
2
  import type { Command } from '../../command';
3
- import type { Html, TagName } from '../../html';
3
+ import { type Attribute, type Html, type TagName } from '../../html';
4
4
  export { wrapIndex, findFirstEnabledIndex, keyToIndex } from '../keyboard';
5
5
  /** Controls the tab list layout direction and which arrow keys navigate between tabs. */
6
6
  export declare const Orientation: S.Literal<["Horizontal", "Vertical"]>;
@@ -24,17 +24,16 @@ export declare const TabSelected: import("../../schema").CallableTaggedStruct<"T
24
24
  export declare const TabFocused: import("../../schema").CallableTaggedStruct<"TabFocused", {
25
25
  index: typeof S.Number;
26
26
  }>;
27
- /** Placeholder message used when no action is needed, such as after a focus command completes. */
28
- export declare const NoOp: import("../../schema").CallableTaggedStruct<"NoOp", {}>;
27
+ /** Sent when the focus-tab command completes. */
28
+ export declare const CompletedTabFocus: import("../../schema").CallableTaggedStruct<"CompletedTabFocus", {}>;
29
29
  /** Union of all messages the tabs component can produce. */
30
30
  export declare const Message: S.Union<[import("../../schema").CallableTaggedStruct<"TabSelected", {
31
31
  index: typeof S.Number;
32
32
  }>, import("../../schema").CallableTaggedStruct<"TabFocused", {
33
33
  index: typeof S.Number;
34
- }>, import("../../schema").CallableTaggedStruct<"NoOp", {}>]>;
34
+ }>, import("../../schema").CallableTaggedStruct<"CompletedTabFocus", {}>]>;
35
35
  export type TabSelected = typeof TabSelected.Type;
36
36
  export type TabFocused = typeof TabFocused.Type;
37
- export type NoOp = typeof NoOp.Type;
38
37
  export type Message = typeof Message.Type;
39
38
  /** Configuration for creating a tabs model with `init`. */
40
39
  export type InitConfig = Readonly<{
@@ -47,10 +46,12 @@ export declare const init: (config: InitConfig) => Model;
47
46
  /** Processes a tabs message and returns the next model and commands. */
48
47
  export declare const update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
49
48
  /** Configuration for an individual tab's button and panel content. */
50
- export type TabConfig = Readonly<{
51
- buttonClassName: string;
49
+ export type TabConfig<Message = unknown> = Readonly<{
50
+ buttonClassName?: string;
51
+ buttonAttributes?: ReadonlyArray<Attribute<Message>>;
52
52
  buttonContent: Html;
53
- panelClassName: string;
53
+ panelClassName?: string;
54
+ panelAttributes?: ReadonlyArray<Attribute<Message>>;
54
55
  panelContent: Html;
55
56
  }>;
56
57
  /** Configuration for rendering a tab group with `view`. */
@@ -60,7 +61,7 @@ export type ViewConfig<Message, Tab extends string> = Readonly<{
60
61
  tabs: ReadonlyArray<Tab>;
61
62
  tabToConfig: (tab: Tab, context: {
62
63
  isActive: boolean;
63
- }) => TabConfig;
64
+ }) => TabConfig<Message>;
64
65
  isTabDisabled?: (tab: Tab, index: number) => boolean;
65
66
  persistPanels?: boolean;
66
67
  orientation?: Orientation;
@@ -68,7 +69,10 @@ export type ViewConfig<Message, Tab extends string> = Readonly<{
68
69
  tabElement?: TagName;
69
70
  panelElement?: TagName;
70
71
  className?: string;
72
+ attributes?: ReadonlyArray<Attribute<Message>>;
71
73
  tabListClassName?: string;
74
+ tabListAttributes?: ReadonlyArray<Attribute<Message>>;
75
+ tabListAriaLabel: string;
72
76
  }>;
73
77
  /** Renders a headless tab group with accessible ARIA roles, roving tabindex, and keyboard navigation. */
74
78
  export declare const view: <Message, Tab extends string>(config: ViewConfig<Message, Tab>) => Html;
@@ -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,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5C,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;;;;0EAAsD,CAAA;AAE1E,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,wEAAwE;AACxE,eAAO,MAAM,MAAM,GACjB,OAAO,KAAK,EACZ,SAAS,OAAO,KACf,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAmCvC,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,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,KAAK,OAAO,CAAA;IACzD,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,yGAAyG;AACzG,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,GAAG,SAAS,MAAM,EAC9C,QAAQ,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,KAC/B,IAsMF,CAAA;AAED;6EAC6E;AAC7E,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,GAAG,SAAS,MAAM,EAC9C,cAAc,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,KAClE,CAAC,CACF,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,KAC7C,IAAI,CAgBR,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import { Array, Effect, Match as M, Option, Schema as S, String, pipe, } from 'effect';
2
- import { html } from '../../html';
3
- import { createLazy } from '../../html/lazy';
2
+ import { createLazy, html, } from '../../html';
4
3
  import { m } from '../../message';
5
4
  import { evo } from '../../struct';
6
5
  import * as Task from '../../task';
@@ -23,10 +22,10 @@ export const Model = S.Struct({
23
22
  export const TabSelected = m('TabSelected', { index: S.Number });
24
23
  /** Sent when a tab receives keyboard focus in `Manual` mode without being activated. */
25
24
  export const TabFocused = m('TabFocused', { index: S.Number });
26
- /** Placeholder message used when no action is needed, such as after a focus command completes. */
27
- export const NoOp = m('NoOp');
25
+ /** Sent when the focus-tab command completes. */
26
+ export const CompletedTabFocus = m('CompletedTabFocus');
28
27
  /** Union of all messages the tabs component can produce. */
29
- export const Message = S.Union(TabSelected, TabFocused, NoOp);
28
+ export const Message = S.Union(TabSelected, TabFocused, CompletedTabFocus);
30
29
  /** Creates an initial tabs model from a config. Defaults to first tab and automatic activation. */
31
30
  export const init = (config) => {
32
31
  const activeIndex = config.activeIndex ?? 0;
@@ -47,24 +46,28 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
47
46
  activeIndex: () => index,
48
47
  focusedIndex: () => index,
49
48
  }),
50
- [Task.focus(tabSelector).pipe(Effect.ignore, Effect.as(NoOp()))],
49
+ [
50
+ Task.focus(tabSelector).pipe(Effect.ignore, Effect.as(CompletedTabFocus())),
51
+ ],
51
52
  ];
52
53
  },
53
54
  TabFocused: ({ index }) => {
54
55
  const tabSelector = `#${tabId(model.id, index)}`;
55
56
  return [
56
57
  evo(model, { focusedIndex: () => index }),
57
- [Task.focus(tabSelector).pipe(Effect.ignore, Effect.as(NoOp()))],
58
+ [
59
+ Task.focus(tabSelector).pipe(Effect.ignore, Effect.as(CompletedTabFocus())),
60
+ ],
58
61
  ];
59
62
  },
60
- NoOp: () => [model, []],
63
+ CompletedTabFocus: () => [model, []],
61
64
  }));
62
65
  const tabPanelId = (id, index) => `${id}-panel-${index}`;
63
66
  const tabId = (id, index) => `${id}-tab-${index}`;
64
67
  /** Renders a headless tab group with accessible ARIA roles, roving tabindex, and keyboard navigation. */
65
68
  export const view = (config) => {
66
- const { div, empty, AriaControls, AriaDisabled, AriaLabelledBy, AriaOrientation, AriaSelected, Class, DataAttribute, Disabled, Hidden, Id, OnClick, OnKeyDownPreventDefault, Role, Tabindex, Type, keyed, } = html();
67
- const { model, model: { id, activationMode, focusedIndex }, toMessage, tabs, tabToConfig, isTabDisabled, persistPanels, orientation = 'Horizontal', tabListElement = 'div', tabElement = 'button', panelElement = 'div', className, tabListClassName, } = config;
69
+ const { div, empty, AriaControls, AriaDisabled, AriaLabel, AriaLabelledBy, AriaOrientation, AriaSelected, Class, DataAttribute, Disabled, Hidden, Id, OnClick, OnKeyDownPreventDefault, Role, Tabindex, Type, keyed, } = html();
70
+ 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;
68
71
  const isDisabled = (index) => !!isTabDisabled &&
69
72
  pipe(tabs, Array.get(index), Option.exists(tab => isTabDisabled(tab, index)));
70
73
  const { nextKey, previousKey } = M.value(orientation).pipe(M.when('Horizontal', () => ({
@@ -84,7 +87,6 @@ export const view = (config) => {
84
87
  const isTabDisabledAtIndex = isDisabled(index);
85
88
  const tabConfig = tabToConfig(tab, { isActive });
86
89
  return keyed(tabElement)(tabId(id, index), [
87
- Class(tabConfig.buttonClassName),
88
90
  Id(tabId(id, index)),
89
91
  Role('tab'),
90
92
  Type('button'),
@@ -96,19 +98,26 @@ export const view = (config) => {
96
98
  ? [Disabled(true), AriaDisabled(true), DataAttribute('disabled', '')]
97
99
  : [OnClick(toMessage(TabSelected({ index })))]),
98
100
  OnKeyDownPreventDefault(handleKeyDown),
101
+ ...(tabConfig.buttonClassName
102
+ ? [Class(tabConfig.buttonClassName)]
103
+ : []),
104
+ ...(tabConfig.buttonAttributes ?? []),
99
105
  ], [tabConfig.buttonContent]);
100
106
  });
101
107
  const allPanels = Array.map(tabs, (tab, index) => {
102
108
  const isActive = index === model.activeIndex;
103
109
  const panelConfig = tabToConfig(tab, { isActive });
104
110
  return keyed(panelElement)(tabPanelId(id, index), [
105
- Class(panelConfig.panelClassName),
106
111
  Id(tabPanelId(id, index)),
107
112
  Role('tabpanel'),
108
113
  AriaLabelledBy(tabId(id, index)),
109
114
  Tabindex(isActive ? 0 : -1),
110
115
  Hidden(!isActive),
111
116
  ...(isActive ? [DataAttribute('selected', '')] : []),
117
+ ...(panelConfig.panelClassName
118
+ ? [Class(panelConfig.panelClassName)]
119
+ : []),
120
+ ...(panelConfig.panelAttributes ?? []),
112
121
  ], [panelConfig.panelContent]);
113
122
  });
114
123
  const activePanelOnly = pipe(tabs, Array.get(model.activeIndex), Option.match({
@@ -116,24 +125,28 @@ export const view = (config) => {
116
125
  onSome: tab => {
117
126
  const activeConfig = tabToConfig(tab, { isActive: true });
118
127
  return keyed(panelElement)(tabPanelId(id, model.activeIndex), [
119
- Class(activeConfig.panelClassName),
120
128
  Id(tabPanelId(id, model.activeIndex)),
121
129
  Role('tabpanel'),
122
130
  AriaLabelledBy(tabId(id, model.activeIndex)),
123
131
  Tabindex(0),
124
132
  DataAttribute('selected', ''),
133
+ ...(activeConfig.panelClassName
134
+ ? [Class(activeConfig.panelClassName)]
135
+ : []),
136
+ ...(activeConfig.panelAttributes ?? []),
125
137
  ], [activeConfig.panelContent]);
126
138
  },
127
139
  }));
128
140
  const tabPanels = persistPanels ? allPanels : [activePanelOnly];
129
- const tabListAttributes = [
141
+ const resolvedTabListAttributes = [
130
142
  Role('tablist'),
131
143
  AriaOrientation(String.toLowerCase(orientation)),
144
+ AriaLabel(tabListAriaLabel),
132
145
  ...(tabListClassName ? [Class(tabListClassName)] : []),
146
+ ...tabListAttributes,
133
147
  ];
134
- const wrapperAttributes = className ? [Class(className)] : [];
135
- return div(wrapperAttributes, [
136
- keyed(tabListElement)(`${id}-tablist`, tabListAttributes, tabButtons),
148
+ return div([...(className ? [Class(className)] : []), ...attributes], [
149
+ keyed(tabListElement)(`${id}-tablist`, resolvedTabListAttributes, tabButtons),
137
150
  ...tabPanels,
138
151
  ]);
139
152
  };
@@ -1,3 +1,3 @@
1
1
  export { init, update, view, lazy, Model, Message } from './index';
2
- export type { Orientation, ActivationMode, TabSelected, TabFocused, NoOp, InitConfig, ViewConfig, TabConfig, } from './index';
2
+ export type { Orientation, ActivationMode, TabSelected, TabFocused, 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,IAAI,EACJ,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,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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.33.6",
4
- "description": "Elm-inspired UI framework powered by Effect",
3
+ "version": "0.34.1",
4
+ "description": "A frontend framework for TypeScript, built on Effect, using The Elm Architecture",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -154,7 +154,7 @@
154
154
  "license": "MIT",
155
155
  "repository": {
156
156
  "type": "git",
157
- "url": "https://github.com/devinjameson/foldkit.git",
157
+ "url": "https://github.com/foldkit/foldkit.git",
158
158
  "directory": "packages/foldkit"
159
159
  },
160
160
  "dependencies": {