@ark-ui/solid 2.1.0 → 2.2.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 (76) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/cjs/index.js +254 -49
  3. package/cjs/index.js.map +1 -1
  4. package/esm/index.js +240 -50
  5. package/esm/index.js.map +1 -1
  6. package/package.json +53 -52
  7. package/source/accordion/accordion-item.jsx +4 -3
  8. package/source/accordion/accordion-root.jsx +4 -4
  9. package/source/clipboard/clipboard-context.js +5 -0
  10. package/source/clipboard/clipboard-control.jsx +8 -0
  11. package/source/clipboard/clipboard-indicator.jsx +16 -0
  12. package/source/clipboard/clipboard-input.jsx +8 -0
  13. package/source/clipboard/clipboard-label.jsx +8 -0
  14. package/source/clipboard/clipboard-root.jsx +22 -0
  15. package/source/clipboard/clipboard-trigger.jsx +8 -0
  16. package/source/clipboard/clipboard.jsx +7 -0
  17. package/source/clipboard/index.js +9 -0
  18. package/source/clipboard/use-clipboard.jsx +10 -0
  19. package/source/collapsible/collapsible-content.jsx +11 -0
  20. package/source/collapsible/collapsible-context.js +5 -0
  21. package/source/collapsible/collapsible-root.jsx +24 -0
  22. package/source/collapsible/collapsible-trigger.jsx +8 -0
  23. package/source/collapsible/collapsible.jsx +4 -0
  24. package/source/collapsible/index.js +6 -0
  25. package/source/collapsible/use-collapsible.js +23 -0
  26. package/source/color-picker/use-color-picker.js +0 -1
  27. package/source/date-picker/use-date-picker.js +0 -1
  28. package/source/dialog/dialog-backdrop.jsx +4 -3
  29. package/source/dialog/dialog-root.jsx +5 -3
  30. package/source/dialog/use-dialog.js +1 -1
  31. package/source/hover-card/use-hover-card.js +1 -1
  32. package/source/index.jsx +3 -0
  33. package/source/locale/index.js +2 -0
  34. package/source/locale/locale-context.jsx +7 -0
  35. package/source/locale/locale.jsx +24 -0
  36. package/source/menu/use-menu.js +1 -1
  37. package/source/popover/use-popover.js +1 -1
  38. package/source/presence/index.js +1 -2
  39. package/source/presence/split-presence-props.js +6 -8
  40. package/source/presence/use-presence.js +8 -7
  41. package/source/render-strategy.js +7 -0
  42. package/source/select/use-select.js +0 -1
  43. package/source/splitter/splitter-root.jsx +0 -1
  44. package/source/tabs/tab-content.jsx +4 -3
  45. package/source/tabs/tabs-root.jsx +4 -4
  46. package/source/tooltip/use-tooltip.js +1 -1
  47. package/source/tree-view/tree-view-branch-indicator.jsx +1 -4
  48. package/types/clipboard/clipboard-context.d.ts +4 -0
  49. package/types/clipboard/clipboard-control.d.ts +4 -0
  50. package/types/clipboard/clipboard-indicator.d.ts +10 -0
  51. package/types/clipboard/clipboard-input.d.ts +4 -0
  52. package/types/clipboard/clipboard-label.d.ts +4 -0
  53. package/types/clipboard/clipboard-root.d.ts +11 -0
  54. package/types/clipboard/clipboard-trigger.d.ts +4 -0
  55. package/types/clipboard/clipboard.d.ts +7 -0
  56. package/types/clipboard/index.d.ts +11 -0
  57. package/types/clipboard/use-clipboard.d.ts +9 -0
  58. package/types/collapsible/collapsible-content.d.ts +4 -0
  59. package/types/collapsible/collapsible-context.d.ts +4 -0
  60. package/types/collapsible/collapsible-root.d.ts +6 -0
  61. package/types/collapsible/collapsible-trigger.d.ts +4 -0
  62. package/types/collapsible/collapsible.d.ts +4 -0
  63. package/types/collapsible/index.d.ts +8 -0
  64. package/types/collapsible/use-collapsible.d.ts +15 -0
  65. package/types/index.d.ts +3 -0
  66. package/types/locale/index.d.ts +2 -0
  67. package/types/locale/locale-context.d.ts +5 -0
  68. package/types/locale/locale.d.ts +9 -0
  69. package/types/menu/menu-item-group.d.ts +3 -5
  70. package/types/presence/index.d.ts +2 -3
  71. package/types/presence/split-presence-props.d.ts +1 -1
  72. package/types/presence/use-presence.d.ts +2 -11
  73. package/types/render-strategy.d.ts +14 -0
  74. package/types/tabs/tabs-root.d.ts +2 -2
  75. package/source/presence/presence-props-context.js +0 -5
  76. package/types/presence/presence-props-context.d.ts +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ark-ui/solid",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "A collection of unstyled, accessible UI components for Solid, utilizing state machines for seamless interaction.",
5
5
  "keywords": [
6
6
  "accordion",
@@ -8,6 +8,7 @@
8
8
  "carousel",
9
9
  "checkbox",
10
10
  "clipboard",
11
+ "collapsible",
11
12
  "color picker",
12
13
  "combobox",
13
14
  "date picker",
@@ -84,78 +85,78 @@
84
85
  "release-it": "release-it --config ../../../release-it.json"
85
86
  },
86
87
  "dependencies": {
87
- "@ark-ui/anatomy": "2.2.0",
88
- "@zag-js/accordion": "0.36.2",
89
- "@zag-js/avatar": "0.36.2",
90
- "@zag-js/carousel": "0.36.2",
91
- "@zag-js/checkbox": "0.36.2",
92
- "@zag-js/clipboard": "0.36.2",
93
- "@zag-js/collapsible": "0.36.2",
94
- "@zag-js/color-picker": "0.36.2",
95
- "@zag-js/combobox": "0.36.2",
96
- "@zag-js/date-picker": "0.36.2",
97
- "@zag-js/dialog": "0.36.2",
98
- "@zag-js/editable": "0.36.2",
99
- "@zag-js/file-upload": "0.36.2",
100
- "@zag-js/hover-card": "0.36.2",
101
- "@zag-js/i18n-utils": "0.36.2",
102
- "@zag-js/menu": "0.36.2",
103
- "@zag-js/number-input": "0.36.2",
104
- "@zag-js/pagination": "0.36.2",
105
- "@zag-js/pin-input": "0.36.2",
106
- "@zag-js/popover": "0.36.2",
107
- "@zag-js/presence": "0.36.2",
108
- "@zag-js/progress": "0.36.2",
109
- "@zag-js/radio-group": "0.36.2",
110
- "@zag-js/rating-group": "0.36.2",
111
- "@zag-js/select": "0.36.2",
112
- "@zag-js/slider": "0.36.2",
113
- "@zag-js/solid": "0.36.2",
114
- "@zag-js/splitter": "0.36.2",
115
- "@zag-js/switch": "0.36.2",
116
- "@zag-js/tabs": "0.36.2",
117
- "@zag-js/tags-input": "0.36.2",
118
- "@zag-js/toast": "0.36.2",
119
- "@zag-js/toggle-group": "0.36.2",
120
- "@zag-js/tooltip": "0.36.2",
121
- "@zag-js/tree-view": "0.36.2",
122
- "@zag-js/types": "0.36.2"
88
+ "@ark-ui/anatomy": "2.3.1",
89
+ "@zag-js/accordion": "0.38.0",
90
+ "@zag-js/avatar": "0.38.0",
91
+ "@zag-js/carousel": "0.38.0",
92
+ "@zag-js/checkbox": "0.38.0",
93
+ "@zag-js/clipboard": "0.38.0",
94
+ "@zag-js/collapsible": "0.38.0",
95
+ "@zag-js/color-picker": "0.38.0",
96
+ "@zag-js/combobox": "0.38.0",
97
+ "@zag-js/date-picker": "0.38.0",
98
+ "@zag-js/dialog": "0.38.0",
99
+ "@zag-js/editable": "0.38.0",
100
+ "@zag-js/file-upload": "0.38.0",
101
+ "@zag-js/hover-card": "0.38.0",
102
+ "@zag-js/i18n-utils": "0.38.0",
103
+ "@zag-js/menu": "0.38.0",
104
+ "@zag-js/number-input": "0.38.0",
105
+ "@zag-js/pagination": "0.38.0",
106
+ "@zag-js/pin-input": "0.38.0",
107
+ "@zag-js/popover": "0.38.0",
108
+ "@zag-js/presence": "0.38.0",
109
+ "@zag-js/progress": "0.38.0",
110
+ "@zag-js/radio-group": "0.38.0",
111
+ "@zag-js/rating-group": "0.38.0",
112
+ "@zag-js/select": "0.38.0",
113
+ "@zag-js/slider": "0.38.0",
114
+ "@zag-js/solid": "0.38.0",
115
+ "@zag-js/splitter": "0.38.0",
116
+ "@zag-js/switch": "0.38.0",
117
+ "@zag-js/tabs": "0.38.0",
118
+ "@zag-js/tags-input": "0.38.0",
119
+ "@zag-js/toast": "0.38.0",
120
+ "@zag-js/toggle-group": "0.38.0",
121
+ "@zag-js/tooltip": "0.38.0",
122
+ "@zag-js/tree-view": "0.38.0",
123
+ "@zag-js/types": "0.38.0"
123
124
  },
124
125
  "devDependencies": {
125
126
  "@release-it/keep-a-changelog": "5.0.0",
126
127
  "@solidjs/testing-library": "0.8.6",
127
- "@storybook/addon-essentials": "7.6.14",
128
- "@storybook/addon-interactions": "7.6.14",
129
- "@storybook/addon-links": "7.6.14",
130
- "@storybook/blocks": "7.6.14",
128
+ "@storybook/addon-essentials": "7.6.17",
129
+ "@storybook/addon-interactions": "7.6.17",
130
+ "@storybook/addon-links": "7.6.17",
131
+ "@storybook/blocks": "7.6.17",
131
132
  "@storybook/testing-library": "0.2.2",
132
133
  "@testing-library/dom": "9.3.4",
133
134
  "@testing-library/jest-dom": "6.4.2",
134
135
  "@testing-library/user-event": "14.5.2",
135
136
  "@types/jsdom": "21.1.6",
136
137
  "@types/testing-library__jest-dom": "5.14.9",
137
- "@typescript-eslint/eslint-plugin": "6.21.0",
138
- "@typescript-eslint/parser": "6.21.0",
139
- "@vitest/coverage-v8": "1.2.2",
140
- "eslint": "8.56.0",
138
+ "@typescript-eslint/eslint-plugin": "7.0.2",
139
+ "@typescript-eslint/parser": "7.0.2",
140
+ "@vitest/coverage-v8": "1.3.1",
141
+ "eslint": "8.57.0",
141
142
  "eslint-plugin-jest-dom": "5.1.0",
142
143
  "eslint-plugin-testing-library": "6.2.0",
143
144
  "globby": "14.0.1",
144
145
  "jsdom": "24.0.0",
145
146
  "react": "18.2.0",
146
147
  "react-dom": "18.2.0",
147
- "release-it": "17.0.3",
148
+ "release-it": "17.1.1",
148
149
  "resize-observer-polyfill": "1.5.1",
149
- "rollup": "4.10.0",
150
+ "rollup": "4.12.0",
150
151
  "rollup-preset-solid": "2.0.1",
151
- "solid-js": "1.8.14",
152
- "storybook": "7.6.14",
152
+ "solid-js": "1.8.15",
153
+ "storybook": "7.6.17",
153
154
  "storybook-solidjs": "1.0.0-beta.2",
154
155
  "storybook-solidjs-vite": "1.0.0-beta.2",
155
156
  "typescript": "5.3.3",
156
- "vite": "5.1.1",
157
- "vite-plugin-solid": "2.9.1",
158
- "vitest": "1.2.2"
157
+ "vite": "5.1.4",
158
+ "vite-plugin-solid": "2.10.1",
159
+ "vitest": "1.3.1"
159
160
  },
160
161
  "peerDependencies": {
161
162
  "solid-js": ">=1.6.0"
@@ -1,15 +1,16 @@
1
1
  import { mergeProps } from '@zag-js/solid';
2
2
  import { createSplitProps } from '../create-split-props';
3
3
  import { ark } from '../factory';
4
- import { PresenceProvider, usePresence, usePresencePropsContext } from '../presence';
4
+ import { PresenceProvider, usePresence } from '../presence';
5
+ import { useRenderStrategyContext } from '../render-strategy';
5
6
  import { runIfFn } from '../run-if-fn';
6
7
  import { useAccordionContext } from './accordion-context';
7
8
  import { AccordionItemProvider } from './accordion-item-context';
8
9
  export const AccordionItem = (props) => {
9
10
  const [itemProps, localProps] = createSplitProps()(props, ['value', 'disabled']);
10
11
  const api = useAccordionContext();
11
- const presenceProps = usePresencePropsContext();
12
- const presenceApi = usePresence(mergeProps(presenceProps, () => ({ present: api().getItemState(itemProps).isOpen })));
12
+ const renderStrategyProps = useRenderStrategyContext();
13
+ const presenceApi = usePresence(mergeProps(renderStrategyProps, () => ({ present: api().getItemState(itemProps).isOpen })));
13
14
  const mergedProps = mergeProps(() => api().getItemProps(itemProps), localProps);
14
15
  const getChildren = () => runIfFn(localProps.children, () => api().getItemState(itemProps));
15
16
  return (<AccordionItemProvider value={itemProps}>
@@ -1,11 +1,11 @@
1
1
  import { mergeProps } from '@zag-js/solid';
2
2
  import { createSplitProps } from '../create-split-props';
3
3
  import { ark } from '../factory';
4
- import { PresencePropsProvider, splitPresenceProps } from '../presence';
4
+ import { RenderStrategyProvider, splitRenderStrategyProps } from '../render-strategy';
5
5
  import { AccordionProvider } from './accordion-context';
6
6
  import { useAccordion } from './use-accordion';
7
7
  export const AccordionRoot = (props) => {
8
- const [presenceProps, accordionProps] = splitPresenceProps(props);
8
+ const [renderStrategyProps, accordionProps] = splitRenderStrategyProps(props);
9
9
  const [useAccordionProps, localProps] = createSplitProps()(accordionProps, [
10
10
  'collapsible',
11
11
  'dir',
@@ -22,8 +22,8 @@ export const AccordionRoot = (props) => {
22
22
  const api = useAccordion(useAccordionProps);
23
23
  const mergedProps = mergeProps(() => api().rootProps, localProps);
24
24
  return (<AccordionProvider value={api}>
25
- <PresencePropsProvider value={presenceProps}>
25
+ <RenderStrategyProvider value={renderStrategyProps}>
26
26
  <ark.div {...mergedProps}/>
27
- </PresencePropsProvider>
27
+ </RenderStrategyProvider>
28
28
  </AccordionProvider>);
29
29
  };
@@ -0,0 +1,5 @@
1
+ import { createContext } from '../create-context';
2
+ export const [ClipboardProvider, useClipboardContext] = createContext({
3
+ hookName: 'useClipboardContext',
4
+ providerName: '<ClipboardProvider />',
5
+ });
@@ -0,0 +1,8 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { ark } from '../factory';
3
+ import { useClipboardContext } from './clipboard-context';
4
+ export const ClipboardControl = (props) => {
5
+ const api = useClipboardContext();
6
+ const mergedProps = mergeProps(() => api().controlProps, props);
7
+ return <ark.div {...mergedProps}/>;
8
+ };
@@ -0,0 +1,16 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { Show, children } from 'solid-js';
3
+ import { createSplitProps } from '../create-split-props';
4
+ import { ark } from '../factory';
5
+ import { useClipboardContext } from './clipboard-context';
6
+ export const ClipboardIndicator = (props) => {
7
+ const [indicatorProps, localProps] = createSplitProps()(props, ['copied']);
8
+ const api = useClipboardContext();
9
+ const mergedProps = mergeProps(api().getIndicatorProps({ copied: api().isCopied }), localProps);
10
+ const getChildren = children(() => localProps.children);
11
+ return (<ark.div {...mergedProps}>
12
+ <Show when={api().isCopied} fallback={getChildren()}>
13
+ {indicatorProps.copied}
14
+ </Show>
15
+ </ark.div>);
16
+ };
@@ -0,0 +1,8 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { ark } from '../factory';
3
+ import { useClipboardContext } from './clipboard-context';
4
+ export const ClipboardInput = (props) => {
5
+ const api = useClipboardContext();
6
+ const mergedProps = mergeProps(() => api().inputProps, props);
7
+ return <ark.input {...mergedProps}/>;
8
+ };
@@ -0,0 +1,8 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { ark } from '../factory';
3
+ import { useClipboardContext } from './clipboard-context';
4
+ export const ClipboardLabel = (props) => {
5
+ const api = useClipboardContext();
6
+ const mergedProps = mergeProps(() => api().labelProps, props);
7
+ return <ark.label {...mergedProps}/>;
8
+ };
@@ -0,0 +1,22 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { createSplitProps } from '../create-split-props';
3
+ import { ark } from '../factory';
4
+ import { runIfFn } from '../run-if-fn';
5
+ import { ClipboardProvider } from './clipboard-context';
6
+ import { useClipboard } from './use-clipboard';
7
+ export const ClipboardRoot = (props) => {
8
+ const [useClipboardProps, localProps] = createSplitProps()(props, [
9
+ 'getRootNode',
10
+ 'id',
11
+ 'ids',
12
+ 'value',
13
+ 'timeout',
14
+ 'onCopyStatusChange',
15
+ ]);
16
+ const api = useClipboard(useClipboardProps);
17
+ const mergedProps = mergeProps(() => api().rootProps, localProps);
18
+ const getChildren = () => runIfFn(localProps.children, api);
19
+ return (<ClipboardProvider value={api}>
20
+ <ark.div {...mergedProps}>{getChildren()}</ark.div>
21
+ </ClipboardProvider>);
22
+ };
@@ -0,0 +1,8 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { ark } from '../factory';
3
+ import { useClipboardContext } from './clipboard-context';
4
+ export const ClipboardTrigger = (props) => {
5
+ const api = useClipboardContext();
6
+ const mergedProps = mergeProps(() => api().triggerProps, props);
7
+ return <ark.button {...mergedProps}/>;
8
+ };
@@ -0,0 +1,7 @@
1
+ import { ClipboardControl as Control } from './clipboard-control';
2
+ import { ClipboardIndicator as Indicator } from './clipboard-indicator';
3
+ import { ClipboardInput as Input } from './clipboard-input';
4
+ import { ClipboardLabel as Label } from './clipboard-label';
5
+ import { ClipboardRoot as Root } from './clipboard-root';
6
+ import { ClipboardTrigger as Trigger } from './clipboard-trigger';
7
+ export { Control, Indicator, Input, Label, Root, Trigger };
@@ -0,0 +1,9 @@
1
+ import { useClipboardContext } from './clipboard-context';
2
+ import { ClipboardControl } from './clipboard-control';
3
+ import { ClipboardIndicator } from './clipboard-indicator';
4
+ import { ClipboardInput } from './clipboard-input';
5
+ import { ClipboardLabel } from './clipboard-label';
6
+ import { ClipboardRoot } from './clipboard-root';
7
+ import { ClipboardTrigger } from './clipboard-trigger';
8
+ export * as Clipboard from './clipboard';
9
+ export { ClipboardControl, ClipboardIndicator, ClipboardInput, ClipboardLabel, ClipboardRoot, ClipboardTrigger, useClipboardContext, };
@@ -0,0 +1,10 @@
1
+ import * as clipboard from '@zag-js/clipboard';
2
+ import { mergeProps, normalizeProps, useMachine } from '@zag-js/solid';
3
+ import { createMemo, createUniqueId } from 'solid-js';
4
+ import { useEnvironmentContext } from '../environment';
5
+ export const useClipboard = (props) => {
6
+ const getRootNode = useEnvironmentContext();
7
+ const context = mergeProps({ id: createUniqueId(), getRootNode }, props);
8
+ const [state, send] = useMachine(clipboard.machine(context), { context });
9
+ return createMemo(() => clipboard.connect(state, send, normalizeProps));
10
+ };
@@ -0,0 +1,11 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { Show } from 'solid-js';
3
+ import { ark } from '../factory';
4
+ import { useCollapsibleContext } from './collapsible-context';
5
+ export const CollapsibleContent = (props) => {
6
+ const api = useCollapsibleContext();
7
+ const mergedProps = mergeProps(() => api().contentProps, props);
8
+ return (<Show when={!api().isUnmounted}>
9
+ <ark.div {...mergedProps}/>
10
+ </Show>);
11
+ };
@@ -0,0 +1,5 @@
1
+ import { createContext } from '../create-context';
2
+ export const [CollapsibleProvider, useCollapsibleContext] = createContext({
3
+ hookName: 'useCollapsibleContext',
4
+ providerName: '<CollapsibleProvider />',
5
+ });
@@ -0,0 +1,24 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { createSplitProps } from '../create-split-props';
3
+ import { ark } from '../factory';
4
+ import { CollapsibleProvider } from './collapsible-context';
5
+ import { useCollapsible } from './use-collapsible';
6
+ export const CollapsibleRoot = (props) => {
7
+ const [params, localProps] = createSplitProps()(props, [
8
+ 'dir',
9
+ 'disabled',
10
+ 'getRootNode',
11
+ 'id',
12
+ 'ids',
13
+ 'lazyMount',
14
+ 'onExitComplete',
15
+ 'onOpenChange',
16
+ 'open',
17
+ 'unmountOnExit',
18
+ ]);
19
+ const api = useCollapsible(params);
20
+ const mergedProps = mergeProps(() => api().rootProps, localProps);
21
+ return (<CollapsibleProvider value={api}>
22
+ <ark.div {...mergedProps}/>
23
+ </CollapsibleProvider>);
24
+ };
@@ -0,0 +1,8 @@
1
+ import { mergeProps } from '@zag-js/solid';
2
+ import { ark } from '../factory';
3
+ import { useCollapsibleContext } from './collapsible-context';
4
+ export const CollapsibleTrigger = (props) => {
5
+ const api = useCollapsibleContext();
6
+ const mergedProps = () => mergeProps(api().triggerProps, props);
7
+ return <ark.button {...mergedProps}>{props.children}</ark.button>;
8
+ };
@@ -0,0 +1,4 @@
1
+ import { CollapsibleContent as Content } from './collapsible-content';
2
+ import { CollapsibleRoot as Root } from './collapsible-root';
3
+ import { CollapsibleTrigger as Trigger } from './collapsible-trigger';
4
+ export { Content, Root, Trigger };
@@ -0,0 +1,6 @@
1
+ import { CollapsibleContent } from './collapsible-content';
2
+ import { useCollapsibleContext } from './collapsible-context';
3
+ import { CollapsibleRoot } from './collapsible-root';
4
+ import { CollapsibleTrigger } from './collapsible-trigger';
5
+ export * as Collapsible from './collapsible';
6
+ export { CollapsibleContent, CollapsibleRoot, CollapsibleTrigger, useCollapsibleContext };
@@ -0,0 +1,23 @@
1
+ import * as collapsible from '@zag-js/collapsible';
2
+ import { mergeProps, normalizeProps, useMachine } from '@zag-js/solid';
3
+ import { createEffect, createMemo, createSignal, createUniqueId } from 'solid-js';
4
+ import { useEnvironmentContext } from '../environment';
5
+ import { splitRenderStrategyProps } from '../render-strategy';
6
+ export const useCollapsible = (props) => {
7
+ const getRootNode = useEnvironmentContext();
8
+ const [renderStrategyProps, collapsibleProps] = splitRenderStrategyProps(props);
9
+ const context = mergeProps({ id: createUniqueId(), getRootNode }, collapsibleProps);
10
+ const [state, send] = useMachine(collapsible.machine(context), { context });
11
+ const [wasVisible, setWasVisible] = createSignal(false);
12
+ createEffect(() => {
13
+ const isPresent = api().isVisible;
14
+ if (isPresent)
15
+ setWasVisible(true);
16
+ });
17
+ const api = createMemo(() => collapsible.connect(state, send, normalizeProps));
18
+ return createMemo(() => ({
19
+ ...api(),
20
+ isUnmounted: (!api().isVisible && !wasVisible() && renderStrategyProps.lazyMount) ||
21
+ (renderStrategyProps.unmountOnExit && !api().isVisible && wasVisible()),
22
+ }));
23
+ };
@@ -9,7 +9,6 @@ export const useColorPicker = (props) => {
9
9
  id: createUniqueId(),
10
10
  getRootNode,
11
11
  value: local.value ? colorPicker.parse(local.value) : undefined,
12
- 'open.controlled': props.open !== undefined,
13
12
  }), rest);
14
13
  const [state, send] = useMachine(colorPicker.machine(context), { context });
15
14
  return createMemo(() => colorPicker.connect(state, send, normalizeProps));
@@ -10,7 +10,6 @@ export const useDatePicker = (props) => {
10
10
  getRootNode,
11
11
  focusedValue: local.focusedValue ? datePicker.parse(local.focusedValue) : undefined,
12
12
  value: local.value ? datePicker.parse(local.value) : undefined,
13
- 'open.controlled': props.open !== undefined,
14
13
  }), rest);
15
14
  const [state, send] = useMachine(datePicker.machine(context), { context });
16
15
  return createMemo(() => datePicker.connect(state, send, normalizeProps));
@@ -1,12 +1,13 @@
1
1
  import { mergeProps } from '@zag-js/solid';
2
2
  import { Show } from 'solid-js';
3
3
  import { ark } from '../factory';
4
- import { usePresence, usePresencePropsContext } from '../presence';
4
+ import { usePresence } from '../presence';
5
+ import { useRenderStrategyContext } from '../render-strategy';
5
6
  import { useDialogContext } from './dialog-context';
6
7
  export const DialogBackdrop = (props) => {
7
8
  const api = useDialogContext();
8
- const presenceProps = usePresencePropsContext();
9
- const presenceApi = usePresence(mergeProps(presenceProps, () => ({ present: api().isOpen })));
9
+ const renderStrategyProps = useRenderStrategyContext();
10
+ const presenceApi = usePresence(mergeProps(renderStrategyProps, () => ({ present: api().isOpen })));
10
11
  const mergedProps = mergeProps(() => api().backdropProps, () => presenceApi().presenceProps, props);
11
12
  return (<Show when={!presenceApi().isUnmounted}>
12
13
  <ark.div {...mergedProps}/>
@@ -1,11 +1,13 @@
1
1
  import { mergeProps } from '@zag-js/solid';
2
2
  import { createSplitProps } from '../create-split-props';
3
- import { PresencePropsProvider, PresenceProvider, splitPresenceProps, usePresence, } from '../presence';
3
+ import { PresenceProvider, splitPresenceProps, usePresence, } from '../presence';
4
+ import { RenderStrategyProvider, splitRenderStrategyProps } from '../render-strategy';
4
5
  import { runIfFn } from '../run-if-fn';
5
6
  import { DialogProvider } from './dialog-context';
6
7
  import { useDialog } from './use-dialog';
7
8
  export const DialogRoot = (props) => {
8
9
  const [presenceProps, dialogProps] = splitPresenceProps(props);
10
+ const [renderStrategyProps] = splitRenderStrategyProps(presenceProps);
9
11
  const [useDialogProps, localProps] = createSplitProps()(dialogProps, [
10
12
  'aria-label',
11
13
  'closeOnEscapeKeyDown',
@@ -32,8 +34,8 @@ export const DialogRoot = (props) => {
32
34
  const apiPresence = usePresence(mergeProps(presenceProps, () => ({ present: api().isOpen })));
33
35
  const getChildren = () => runIfFn(localProps.children, api);
34
36
  return (<DialogProvider value={api}>
35
- <PresencePropsProvider value={presenceProps}>
37
+ <RenderStrategyProvider value={renderStrategyProps}>
36
38
  <PresenceProvider value={apiPresence}>{getChildren()}</PresenceProvider>
37
- </PresencePropsProvider>
39
+ </RenderStrategyProvider>
38
40
  </DialogProvider>);
39
41
  };
@@ -4,7 +4,7 @@ import { createMemo, createUniqueId } from 'solid-js';
4
4
  import { useEnvironmentContext } from '../environment';
5
5
  export const useDialog = (props) => {
6
6
  const getRootNode = useEnvironmentContext();
7
- const context = mergeProps({ id: createUniqueId(), getRootNode, 'open.controlled': props.open !== undefined }, props);
7
+ const context = mergeProps({ id: createUniqueId(), getRootNode }, props);
8
8
  const [state, send] = useMachine(dialog.machine(context), { context });
9
9
  return createMemo(() => dialog.connect(state, send, normalizeProps));
10
10
  };
@@ -4,7 +4,7 @@ import { createMemo, createUniqueId } from 'solid-js';
4
4
  import { useEnvironmentContext } from '../environment';
5
5
  export const useHoverCard = (props) => {
6
6
  const getRootNode = useEnvironmentContext();
7
- const context = mergeProps({ id: createUniqueId(), getRootNode, 'open.controlled': props.open !== undefined }, props);
7
+ const context = mergeProps({ id: createUniqueId(), getRootNode }, props);
8
8
  const [state, send] = useMachine(hoverCard.machine(context), { context });
9
9
  return createMemo(() => hoverCard.connect(state, send, normalizeProps));
10
10
  };
package/source/index.jsx CHANGED
@@ -2,6 +2,8 @@ export * from './accordion';
2
2
  export * from './avatar';
3
3
  export * from './carousel';
4
4
  export * from './checkbox';
5
+ export * from './clipboard';
6
+ export * from './collapsible';
5
7
  export * from './color-picker';
6
8
  export * from './combobox';
7
9
  export * from './date-picker';
@@ -11,6 +13,7 @@ export * from './environment';
11
13
  export * from './factory';
12
14
  export * from './file-upload';
13
15
  export * from './hover-card';
16
+ export * from './locale';
14
17
  export * from './menu';
15
18
  export * from './number-input';
16
19
  export * from './pagination';
@@ -0,0 +1,2 @@
1
+ export { LocaleProvider } from './locale';
2
+ export { useLocaleContext } from './locale-context';
@@ -0,0 +1,7 @@
1
+ import { createContext } from '../create-context';
2
+ export const [LocaleContextProvider, useLocaleContext] = createContext({
3
+ hookName: 'useEnvironmentContext',
4
+ providerName: '<EnvironmentProvider />',
5
+ strict: false,
6
+ defaultValue: () => ({ dir: 'ltr', locale: 'en-US' }),
7
+ });
@@ -0,0 +1,24 @@
1
+ import { isRTL, trackLocale } from '@zag-js/i18n-utils';
2
+ import { createEffect, createMemo, createSignal, onCleanup, splitProps, } from 'solid-js';
3
+ import { useEnvironmentContext } from '../environment';
4
+ import { LocaleContextProvider } from './locale-context';
5
+ export const LocaleProvider = (props) => {
6
+ const [localeProps, restProps] = splitProps(props, ['locale', 'defaultLocale']);
7
+ const [locale, setLocale] = createSignal(localeProps.defaultLocale || localeProps.locale || 'en-US');
8
+ const getRootNode = useEnvironmentContext();
9
+ createEffect(() => {
10
+ const cleanup = trackLocale({
11
+ locale: localeProps.locale,
12
+ getRootNode,
13
+ onLocaleChange(locale) {
14
+ setLocale(locale.locale);
15
+ },
16
+ });
17
+ onCleanup(cleanup);
18
+ });
19
+ const context = createMemo(() => ({
20
+ locale: locale(),
21
+ dir: isRTL(locale()) ? 'rtl' : 'ltr',
22
+ }));
23
+ return <LocaleContextProvider value={context}>{restProps.children}</LocaleContextProvider>;
24
+ };
@@ -4,7 +4,7 @@ import { createMemo, createUniqueId } from 'solid-js';
4
4
  import { useEnvironmentContext } from '../environment';
5
5
  export const useMenu = (props) => {
6
6
  const getRootNode = useEnvironmentContext();
7
- const context = mergeProps({ id: createUniqueId(), getRootNode, 'open.controlled': props.open !== undefined }, props);
7
+ const context = mergeProps({ id: createUniqueId(), getRootNode }, props);
8
8
  const [state, send, machine] = useMachine(menu.machine(context), { context });
9
9
  return createMemo(() => ({
10
10
  api: () => menu.connect(state, send, normalizeProps),
@@ -4,7 +4,7 @@ import { createMemo, createUniqueId } from 'solid-js';
4
4
  import { useEnvironmentContext } from '../environment';
5
5
  export const usePopover = (props) => {
6
6
  const getRootNode = useEnvironmentContext();
7
- const context = mergeProps({ id: createUniqueId(), getRootNode, 'open.controlled': props.open !== undefined }, props);
7
+ const context = mergeProps({ id: createUniqueId(), getRootNode }, props);
8
8
  const [state, send] = useMachine(popover.machine(context), { context });
9
9
  return createMemo(() => popover.connect(state, send, normalizeProps));
10
10
  };
@@ -1,6 +1,5 @@
1
1
  import { Presence } from './presence';
2
2
  import { PresenceProvider, usePresenceContext } from './presence-context';
3
- import { PresencePropsProvider, usePresencePropsContext, } from './presence-props-context';
4
3
  import { splitPresenceProps } from './split-presence-props';
5
4
  import { usePresence } from './use-presence';
6
- export { Presence, PresencePropsProvider, PresenceProvider, splitPresenceProps, usePresence, usePresenceContext, usePresencePropsContext, };
5
+ export { Presence, PresenceProvider, splitPresenceProps, usePresence, usePresenceContext };
@@ -1,9 +1,7 @@
1
1
  import { createSplitProps } from '../create-split-props';
2
- export function splitPresenceProps(props) {
3
- return createSplitProps()(props, [
4
- 'lazyMount',
5
- 'onExitComplete',
6
- 'present',
7
- 'unmountOnExit',
8
- ]);
9
- }
2
+ export const splitPresenceProps = (props) => createSplitProps()(props, [
3
+ 'lazyMount',
4
+ 'onExitComplete',
5
+ 'present',
6
+ 'unmountOnExit',
7
+ ]);