@ariakit/core 0.0.1 → 0.1.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 (163) hide show
  1. package/.eslintignore +6 -0
  2. package/CHANGELOG.md +18 -0
  3. package/checkbox/checkbox-store/package.json +7 -0
  4. package/cjs/__chunks/2YFRPUZP.cjs +30 -0
  5. package/cjs/__chunks/3BBA3Z5G.cjs +143 -0
  6. package/cjs/__chunks/3KP2MDG6.cjs +1491 -0
  7. package/cjs/__chunks/5D5Y5EI4.cjs +146 -0
  8. package/cjs/__chunks/7ZXWQTAY.cjs +71 -0
  9. package/cjs/__chunks/AZVDLKO3.cjs +286 -0
  10. package/cjs/__chunks/EFEGT32M.cjs +12 -0
  11. package/cjs/__chunks/EIDN2CWH.cjs +57 -0
  12. package/cjs/__chunks/GDZQUFNP.cjs +30 -0
  13. package/cjs/__chunks/NX5OHIMM.cjs +169 -0
  14. package/cjs/__chunks/OFNGELMA.cjs +182 -0
  15. package/cjs/checkbox/checkbox-store.cjs +27 -0
  16. package/cjs/checkbox/checkbox-store.d.ts +34 -0
  17. package/cjs/collection/collection-store.cjs +9 -0
  18. package/cjs/collection/collection-store.d.ts +65 -0
  19. package/cjs/combobox/combobox-store.cjs +163 -0
  20. package/cjs/combobox/combobox-store.d.ts +67 -0
  21. package/cjs/composite/composite-overflow-store.cjs +15 -0
  22. package/cjs/composite/composite-overflow-store.d.ts +10 -0
  23. package/cjs/composite/composite-store.cjs +11 -0
  24. package/cjs/composite/composite-store.d.ts +202 -0
  25. package/cjs/dialog/dialog-store.cjs +9 -0
  26. package/cjs/dialog/dialog-store.d.ts +10 -0
  27. package/cjs/disclosure/disclosure-store.cjs +8 -0
  28. package/cjs/disclosure/disclosure-store.d.ts +87 -0
  29. package/cjs/form/form-store.cjs +241 -0
  30. package/cjs/form/form-store.d.ts +236 -0
  31. package/cjs/form/types.cjs +1 -0
  32. package/cjs/form/types.d.ts +38 -0
  33. package/cjs/hovercard/hovercard-store.cjs +11 -0
  34. package/cjs/hovercard/hovercard-store.d.ts +45 -0
  35. package/cjs/index.cjs +5 -0
  36. package/cjs/index.d.ts +2 -0
  37. package/cjs/menu/menu-bar-store.cjs +27 -0
  38. package/cjs/menu/menu-bar-store.d.ts +10 -0
  39. package/cjs/menu/menu-store.cjs +108 -0
  40. package/cjs/menu/menu-store.d.ts +70 -0
  41. package/cjs/popover/popover-store.cjs +10 -0
  42. package/cjs/popover/popover-store.d.ts +150 -0
  43. package/cjs/radio/radio-store.cjs +36 -0
  44. package/cjs/radio/radio-store.d.ts +31 -0
  45. package/cjs/select/select-store.cjs +164 -0
  46. package/cjs/select/select-store.d.ts +87 -0
  47. package/cjs/tab/tab-store.cjs +126 -0
  48. package/cjs/tab/tab-store.d.ts +78 -0
  49. package/cjs/toolbar/toolbar-store.cjs +27 -0
  50. package/cjs/toolbar/toolbar-store.d.ts +21 -0
  51. package/cjs/tooltip/tooltip-store.cjs +98 -0
  52. package/cjs/tooltip/tooltip-store.d.ts +28 -0
  53. package/cjs/tsconfig.build.tsbuildinfo +1 -0
  54. package/cjs/utils/array.cjs +12 -0
  55. package/cjs/utils/array.d.ts +29 -0
  56. package/cjs/utils/dom.cjs +38 -0
  57. package/cjs/utils/dom.d.ts +105 -0
  58. package/cjs/utils/events.cjs +132 -0
  59. package/cjs/utils/events.d.ts +73 -0
  60. package/cjs/utils/focus.cjs +222 -0
  61. package/cjs/utils/focus.d.ts +117 -0
  62. package/cjs/utils/misc.cjs +40 -0
  63. package/cjs/utils/misc.d.ts +111 -0
  64. package/cjs/utils/platform.cjs +15 -0
  65. package/cjs/utils/platform.d.ts +20 -0
  66. package/cjs/utils/store.cjs +9 -0
  67. package/cjs/utils/store.d.ts +99 -0
  68. package/cjs/utils/types.cjs +1 -0
  69. package/cjs/utils/types.d.ts +72 -0
  70. package/collection/collection-store/package.json +7 -0
  71. package/combobox/combobox-store/package.json +7 -0
  72. package/composite/composite-overflow-store/package.json +7 -0
  73. package/composite/composite-store/package.json +7 -0
  74. package/dialog/dialog-store/package.json +7 -0
  75. package/disclosure/disclosure-store/package.json +7 -0
  76. package/esm/__chunks/5XEKIOCW.js +30 -0
  77. package/esm/__chunks/6U25WEDX.js +286 -0
  78. package/esm/__chunks/6UPCMUXT.js +1491 -0
  79. package/esm/__chunks/ADRUFBEO.js +12 -0
  80. package/esm/__chunks/DXA3K2FY.js +30 -0
  81. package/esm/__chunks/HCKYJLMC.js +71 -0
  82. package/esm/__chunks/KLKI3AIB.js +146 -0
  83. package/esm/__chunks/L7KN5AYP.js +169 -0
  84. package/esm/__chunks/RX3ZUQ6U.js +57 -0
  85. package/esm/__chunks/UOJSZ35L.js +143 -0
  86. package/esm/__chunks/UVCATTRC.js +182 -0
  87. package/esm/checkbox/checkbox-store.d.ts +34 -0
  88. package/esm/checkbox/checkbox-store.js +27 -0
  89. package/esm/collection/collection-store.d.ts +65 -0
  90. package/esm/collection/collection-store.js +9 -0
  91. package/esm/combobox/combobox-store.d.ts +67 -0
  92. package/esm/combobox/combobox-store.js +163 -0
  93. package/esm/composite/composite-overflow-store.d.ts +10 -0
  94. package/esm/composite/composite-overflow-store.js +15 -0
  95. package/esm/composite/composite-store.d.ts +202 -0
  96. package/esm/composite/composite-store.js +11 -0
  97. package/esm/dialog/dialog-store.d.ts +10 -0
  98. package/esm/dialog/dialog-store.js +9 -0
  99. package/esm/disclosure/disclosure-store.d.ts +87 -0
  100. package/esm/disclosure/disclosure-store.js +8 -0
  101. package/esm/form/form-store.d.ts +236 -0
  102. package/esm/form/form-store.js +241 -0
  103. package/esm/form/types.d.ts +38 -0
  104. package/esm/form/types.js +0 -0
  105. package/esm/hovercard/hovercard-store.d.ts +45 -0
  106. package/esm/hovercard/hovercard-store.js +11 -0
  107. package/esm/index.d.ts +2 -0
  108. package/esm/index.js +5 -0
  109. package/esm/menu/menu-bar-store.d.ts +10 -0
  110. package/esm/menu/menu-bar-store.js +27 -0
  111. package/esm/menu/menu-store.d.ts +70 -0
  112. package/esm/menu/menu-store.js +108 -0
  113. package/esm/popover/popover-store.d.ts +150 -0
  114. package/esm/popover/popover-store.js +10 -0
  115. package/esm/radio/radio-store.d.ts +31 -0
  116. package/esm/radio/radio-store.js +36 -0
  117. package/esm/select/select-store.d.ts +87 -0
  118. package/esm/select/select-store.js +164 -0
  119. package/esm/tab/tab-store.d.ts +78 -0
  120. package/esm/tab/tab-store.js +126 -0
  121. package/esm/toolbar/toolbar-store.d.ts +21 -0
  122. package/esm/toolbar/toolbar-store.js +27 -0
  123. package/esm/tooltip/tooltip-store.d.ts +28 -0
  124. package/esm/tooltip/tooltip-store.js +98 -0
  125. package/esm/tsconfig.build.tsbuildinfo +1 -0
  126. package/esm/utils/array.d.ts +29 -0
  127. package/esm/utils/array.js +12 -0
  128. package/esm/utils/dom.d.ts +105 -0
  129. package/esm/utils/dom.js +38 -0
  130. package/esm/utils/events.d.ts +73 -0
  131. package/esm/utils/events.js +132 -0
  132. package/esm/utils/focus.d.ts +117 -0
  133. package/esm/utils/focus.js +222 -0
  134. package/esm/utils/misc.d.ts +111 -0
  135. package/esm/utils/misc.js +40 -0
  136. package/esm/utils/platform.d.ts +20 -0
  137. package/esm/utils/platform.js +15 -0
  138. package/esm/utils/store.d.ts +99 -0
  139. package/esm/utils/store.js +9 -0
  140. package/esm/utils/types.d.ts +72 -0
  141. package/esm/utils/types.js +0 -0
  142. package/form/form-store/package.json +7 -0
  143. package/form/types/package.json +7 -0
  144. package/hovercard/hovercard-store/package.json +7 -0
  145. package/license +21 -0
  146. package/menu/menu-bar-store/package.json +7 -0
  147. package/menu/menu-store/package.json +7 -0
  148. package/package.json +137 -6
  149. package/popover/popover-store/package.json +7 -0
  150. package/radio/radio-store/package.json +7 -0
  151. package/select/select-store/package.json +7 -0
  152. package/tab/tab-store/package.json +7 -0
  153. package/toolbar/toolbar-store/package.json +7 -0
  154. package/tooltip/tooltip-store/package.json +7 -0
  155. package/tsconfig.build.json +4 -0
  156. package/utils/array/package.json +7 -0
  157. package/utils/dom/package.json +7 -0
  158. package/utils/events/package.json +7 -0
  159. package/utils/focus/package.json +7 -0
  160. package/utils/misc/package.json +7 -0
  161. package/utils/platform/package.json +7 -0
  162. package/utils/store/package.json +7 -0
  163. package/utils/types/package.json +7 -0
@@ -0,0 +1,12 @@
1
+ import {
2
+ createDisclosureStore
3
+ } from "./HCKYJLMC.js";
4
+
5
+ // src/dialog/dialog-store.ts
6
+ function createDialogStore(props = {}) {
7
+ return createDisclosureStore(props);
8
+ }
9
+
10
+ export {
11
+ createDialogStore
12
+ };
@@ -0,0 +1,30 @@
1
+ import {
2
+ canUseDOM
3
+ } from "./UVCATTRC.js";
4
+
5
+ // src/utils/platform.ts
6
+ function isTouchDevice() {
7
+ return canUseDOM && !!navigator.maxTouchPoints;
8
+ }
9
+ function isApple() {
10
+ if (!canUseDOM)
11
+ return false;
12
+ return /mac|iphone|ipad|ipod/i.test(navigator.platform);
13
+ }
14
+ function isSafari() {
15
+ return canUseDOM && isApple() && /apple/i.test(navigator.vendor);
16
+ }
17
+ function isFirefox() {
18
+ return canUseDOM && /firefox\//i.test(navigator.userAgent);
19
+ }
20
+ function isMac() {
21
+ return canUseDOM && navigator.platform.startsWith("Mac") && !isTouchDevice();
22
+ }
23
+
24
+ export {
25
+ isTouchDevice,
26
+ isApple,
27
+ isSafari,
28
+ isFirefox,
29
+ isMac
30
+ };
@@ -0,0 +1,71 @@
1
+ import {
2
+ createStore
3
+ } from "./UOJSZ35L.js";
4
+ import {
5
+ defaultValue
6
+ } from "./KLKI3AIB.js";
7
+
8
+ // src/disclosure/disclosure-store.ts
9
+ function createDisclosureStore(props = {}) {
10
+ const syncState = props.store?.getState();
11
+ const open = defaultValue(
12
+ props.open,
13
+ syncState?.open,
14
+ props.defaultOpen,
15
+ false
16
+ );
17
+ const animated = defaultValue(props.animated, syncState?.animated, false);
18
+ const initialState = {
19
+ open,
20
+ animated,
21
+ animating: !!animated && open,
22
+ mounted: open,
23
+ contentElement: defaultValue(syncState?.contentElement, null),
24
+ disclosureElement: defaultValue(syncState?.disclosureElement, null)
25
+ };
26
+ const disclosure = createStore(initialState, props.store);
27
+ disclosure.setup(
28
+ () => disclosure.sync(
29
+ (state) => {
30
+ if (state.animated)
31
+ return;
32
+ disclosure.setState("animating", false);
33
+ },
34
+ ["animated", "animating"]
35
+ )
36
+ );
37
+ disclosure.setup(
38
+ () => disclosure.sync(
39
+ (state, prev) => {
40
+ if (!state.animated)
41
+ return;
42
+ const mounting = state === prev;
43
+ const animating = mounting ? state.open : state.open !== prev.open;
44
+ disclosure.setState("animating", animating);
45
+ },
46
+ ["open", "animated"]
47
+ )
48
+ );
49
+ disclosure.setup(
50
+ () => disclosure.sync(
51
+ (state) => {
52
+ disclosure.setState("mounted", state.open || state.animating);
53
+ },
54
+ ["open", "animating"]
55
+ )
56
+ );
57
+ return {
58
+ ...disclosure,
59
+ setOpen: (value) => disclosure.setState("open", value),
60
+ show: () => disclosure.setState("open", true),
61
+ hide: () => disclosure.setState("open", false),
62
+ toggle: () => disclosure.setState("open", (open2) => !open2),
63
+ stopAnimation: () => disclosure.setState("animating", false),
64
+ setContentElement: (value) => disclosure.setState("contentElement", value),
65
+ setDisclosureElement: (value) => disclosure.setState("disclosureElement", value)
66
+ };
67
+ }
68
+
69
+ export {
70
+ createDisclosureStore
71
+ };
@@ -0,0 +1,146 @@
1
+ // src/utils/misc.ts
2
+ function noop(..._) {
3
+ }
4
+ function shallowEqual(a, b) {
5
+ if (a === b)
6
+ return true;
7
+ if (!a)
8
+ return false;
9
+ if (!b)
10
+ return false;
11
+ if (typeof a !== "object")
12
+ return false;
13
+ if (typeof b !== "object")
14
+ return false;
15
+ const aKeys = Object.keys(a);
16
+ const bKeys = Object.keys(b);
17
+ const { length } = aKeys;
18
+ if (bKeys.length !== length)
19
+ return false;
20
+ for (const key of aKeys) {
21
+ if (a[key] !== b[key]) {
22
+ return false;
23
+ }
24
+ }
25
+ return true;
26
+ }
27
+ function applyState(argument, currentValue) {
28
+ if (isUpdater(argument)) {
29
+ const value = isLazyValue(currentValue) ? currentValue() : currentValue;
30
+ return argument(value);
31
+ }
32
+ return argument;
33
+ }
34
+ function isUpdater(argument) {
35
+ return typeof argument === "function";
36
+ }
37
+ function isLazyValue(value) {
38
+ return typeof value === "function";
39
+ }
40
+ function isObject(arg) {
41
+ return typeof arg === "object" && arg != null;
42
+ }
43
+ function isEmpty(arg) {
44
+ if (Array.isArray(arg))
45
+ return !arg.length;
46
+ if (isObject(arg))
47
+ return !Object.keys(arg).length;
48
+ if (arg == null)
49
+ return true;
50
+ if (arg === "")
51
+ return true;
52
+ return false;
53
+ }
54
+ function isInteger(arg) {
55
+ if (typeof arg === "number") {
56
+ return Math.floor(arg) === arg;
57
+ }
58
+ return String(Math.floor(Number(arg))) === arg;
59
+ }
60
+ function hasOwnProperty(object, prop) {
61
+ return Object.prototype.hasOwnProperty.call(object, prop);
62
+ }
63
+ function chain(...fns) {
64
+ return (...args) => {
65
+ for (const fn of fns) {
66
+ if (typeof fn === "function") {
67
+ fn(...args);
68
+ }
69
+ }
70
+ };
71
+ }
72
+ function cx(...args) {
73
+ return args.filter(Boolean).join(" ") || void 0;
74
+ }
75
+ function normalizeString(str) {
76
+ return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
77
+ }
78
+ function omit(object, keys) {
79
+ const result = { ...object };
80
+ for (const key of keys) {
81
+ if (hasOwnProperty(result, key)) {
82
+ delete result[key];
83
+ }
84
+ }
85
+ return result;
86
+ }
87
+ function pick(object, paths) {
88
+ const result = {};
89
+ for (const key of paths) {
90
+ if (hasOwnProperty(object, key)) {
91
+ result[key] = object[key];
92
+ }
93
+ }
94
+ return result;
95
+ }
96
+ function identity(value) {
97
+ return value;
98
+ }
99
+ function beforePaint(cb = noop) {
100
+ const raf = requestAnimationFrame(cb);
101
+ return () => cancelAnimationFrame(raf);
102
+ }
103
+ function afterPaint(cb = noop) {
104
+ let raf = requestAnimationFrame(() => {
105
+ raf = requestAnimationFrame(cb);
106
+ });
107
+ return () => cancelAnimationFrame(raf);
108
+ }
109
+ function invariant(condition, message) {
110
+ if (condition)
111
+ return;
112
+ if (typeof message !== "string")
113
+ throw new Error("Invariant failed");
114
+ throw new Error(message);
115
+ }
116
+ function getKeys(obj) {
117
+ return Object.keys(obj);
118
+ }
119
+ function defaultValue(...values) {
120
+ for (const value of values) {
121
+ if (value !== void 0)
122
+ return value;
123
+ }
124
+ return void 0;
125
+ }
126
+
127
+ export {
128
+ noop,
129
+ shallowEqual,
130
+ applyState,
131
+ isObject,
132
+ isEmpty,
133
+ isInteger,
134
+ hasOwnProperty,
135
+ chain,
136
+ cx,
137
+ normalizeString,
138
+ omit,
139
+ pick,
140
+ identity,
141
+ beforePaint,
142
+ afterPaint,
143
+ invariant,
144
+ getKeys,
145
+ defaultValue
146
+ };
@@ -0,0 +1,169 @@
1
+ import {
2
+ createStore
3
+ } from "./UOJSZ35L.js";
4
+ import {
5
+ chain,
6
+ defaultValue
7
+ } from "./KLKI3AIB.js";
8
+ import {
9
+ getDocument
10
+ } from "./UVCATTRC.js";
11
+
12
+ // src/collection/collection-store.ts
13
+ function isElementPreceding(a, b) {
14
+ return Boolean(
15
+ b.compareDocumentPosition(a) & Node.DOCUMENT_POSITION_PRECEDING
16
+ );
17
+ }
18
+ function sortBasedOnDOMPosition(items) {
19
+ const pairs = items.map((item, index) => [index, item]);
20
+ let isOrderDifferent = false;
21
+ pairs.sort(([indexA, a], [indexB, b]) => {
22
+ const elementA = a.element;
23
+ const elementB = b.element;
24
+ if (elementA === elementB)
25
+ return 0;
26
+ if (!elementA || !elementB)
27
+ return 0;
28
+ if (isElementPreceding(elementA, elementB)) {
29
+ if (indexA > indexB) {
30
+ isOrderDifferent = true;
31
+ }
32
+ return -1;
33
+ }
34
+ if (indexA < indexB) {
35
+ isOrderDifferent = true;
36
+ }
37
+ return 1;
38
+ });
39
+ if (isOrderDifferent) {
40
+ return pairs.map(([_, item]) => item);
41
+ }
42
+ return items;
43
+ }
44
+ function getCommonParent(items) {
45
+ const firstItem = items.find((item) => !!item.element);
46
+ const lastItem = [...items].reverse().find((item) => !!item.element);
47
+ let parentElement = firstItem?.element?.parentElement;
48
+ while (parentElement && lastItem?.element) {
49
+ const parent = parentElement;
50
+ if (lastItem && parent.contains(lastItem.element)) {
51
+ return parentElement;
52
+ }
53
+ parentElement = parentElement.parentElement;
54
+ }
55
+ return getDocument(parentElement).body;
56
+ }
57
+ function createCollectionStore(props = {}) {
58
+ const itemsMap = /* @__PURE__ */ new Map();
59
+ const syncState = props.store?.getState();
60
+ const initialState = {
61
+ items: defaultValue(props.items, syncState?.items, props.defaultItems, []),
62
+ renderedItems: defaultValue(syncState?.renderedItems, [])
63
+ };
64
+ const privateStore = createStore({
65
+ renderedItems: initialState.renderedItems
66
+ });
67
+ const collection = createStore(initialState, props.store);
68
+ const sortItems = () => {
69
+ const state = privateStore.getState();
70
+ const renderedItems = sortBasedOnDOMPosition(state.renderedItems);
71
+ privateStore.setState("renderedItems", renderedItems);
72
+ collection.setState("renderedItems", renderedItems);
73
+ };
74
+ collection.setup(() => {
75
+ return privateStore.syncBatch(
76
+ (state) => {
77
+ let firstRun = true;
78
+ let raf = 0;
79
+ raf = requestAnimationFrame(sortItems);
80
+ if (typeof IntersectionObserver !== "function")
81
+ return;
82
+ const callback = () => {
83
+ if (firstRun) {
84
+ firstRun = false;
85
+ return;
86
+ }
87
+ cancelAnimationFrame(raf);
88
+ raf = requestAnimationFrame(sortItems);
89
+ };
90
+ const root = getCommonParent(state.renderedItems);
91
+ const observer = new IntersectionObserver(callback, { root });
92
+ state.renderedItems.forEach((item) => {
93
+ if (item.element) {
94
+ observer.observe(item.element);
95
+ }
96
+ });
97
+ return () => {
98
+ cancelAnimationFrame(raf);
99
+ observer.disconnect();
100
+ };
101
+ },
102
+ ["renderedItems"]
103
+ );
104
+ });
105
+ const mergeItem = (item, setItems, canDeleteFromMap = false) => {
106
+ let prevItem;
107
+ setItems((items) => {
108
+ const index = itemsMap.get(item.id) && items.findIndex(({ id }) => id === item.id);
109
+ const nextItems = items.slice();
110
+ if (index && index >= 0) {
111
+ prevItem = items[index];
112
+ const nextItem = { ...prevItem, ...item };
113
+ nextItems[index] = nextItem;
114
+ itemsMap.set(item.id, nextItem);
115
+ } else {
116
+ nextItems.push(item);
117
+ itemsMap.set(item.id, item);
118
+ }
119
+ return nextItems;
120
+ });
121
+ const unmergeItem = () => {
122
+ setItems((items) => {
123
+ if (!prevItem) {
124
+ if (canDeleteFromMap) {
125
+ itemsMap.delete(item.id);
126
+ }
127
+ return items.filter(({ id }) => id !== item.id);
128
+ }
129
+ const index = items.findIndex(({ id }) => id === item.id);
130
+ if (index === -1)
131
+ return items;
132
+ const nextItems = items.slice();
133
+ nextItems[index] = prevItem;
134
+ itemsMap.set(item.id, prevItem);
135
+ return nextItems;
136
+ });
137
+ };
138
+ return unmergeItem;
139
+ };
140
+ const registerItem = (item) => mergeItem(item, (getItems) => collection.setState("items", getItems), true);
141
+ return {
142
+ ...collection,
143
+ registerItem,
144
+ renderItem: (item) => chain(
145
+ registerItem(item),
146
+ mergeItem(
147
+ item,
148
+ (getItems) => privateStore.setState("renderedItems", getItems)
149
+ )
150
+ ),
151
+ item: (id) => {
152
+ if (!id)
153
+ return null;
154
+ let item = itemsMap.get(id);
155
+ if (!item) {
156
+ const { items } = collection.getState();
157
+ item = items.find((item2) => item2.id === id);
158
+ if (item) {
159
+ itemsMap.set(id, item);
160
+ }
161
+ }
162
+ return item || null;
163
+ }
164
+ };
165
+ }
166
+
167
+ export {
168
+ createCollectionStore
169
+ };
@@ -0,0 +1,57 @@
1
+ import {
2
+ createPopoverStore
3
+ } from "./6UPCMUXT.js";
4
+ import {
5
+ createStore
6
+ } from "./UOJSZ35L.js";
7
+ import {
8
+ defaultValue
9
+ } from "./KLKI3AIB.js";
10
+
11
+ // src/hovercard/hovercard-store.ts
12
+ function createHovercardStore(props = {}) {
13
+ const syncState = props.store?.getState();
14
+ const timeout = defaultValue(props.timeout, syncState?.timeout, 500);
15
+ const popover = createPopoverStore({
16
+ ...props,
17
+ placement: defaultValue(
18
+ props.placement,
19
+ syncState?.placement,
20
+ "bottom"
21
+ )
22
+ });
23
+ const initialState = {
24
+ ...popover.getState(),
25
+ timeout,
26
+ showTimeout: defaultValue(
27
+ props.showTimeout,
28
+ syncState?.showTimeout,
29
+ timeout
30
+ ),
31
+ hideTimeout: defaultValue(
32
+ props.hideTimeout,
33
+ syncState?.hideTimeout,
34
+ timeout
35
+ ),
36
+ autoFocusOnShow: defaultValue(syncState?.autoFocusOnShow, false)
37
+ };
38
+ const hovercard = createStore(initialState, popover, props.store);
39
+ hovercard.setup(
40
+ () => hovercard.sync(
41
+ (state) => {
42
+ hovercard.setState("showTimeout", (value) => value ?? state.timeout);
43
+ hovercard.setState("hideTimeout", (value) => value ?? state.timeout);
44
+ },
45
+ ["timeout"]
46
+ )
47
+ );
48
+ return {
49
+ ...popover,
50
+ ...hovercard,
51
+ setAutoFocusOnShow: (value) => hovercard.setState("autoFocusOnShow", value)
52
+ };
53
+ }
54
+
55
+ export {
56
+ createHovercardStore
57
+ };
@@ -0,0 +1,143 @@
1
+ import {
2
+ applyState,
3
+ chain,
4
+ getKeys,
5
+ hasOwnProperty,
6
+ noop,
7
+ omit,
8
+ pick
9
+ } from "./KLKI3AIB.js";
10
+
11
+ // src/utils/store.ts
12
+ function createStore(initialState, ...stores) {
13
+ let state = initialState;
14
+ let prevStateBatch = state;
15
+ let lastUpdate = Symbol();
16
+ let updating = false;
17
+ let initialized = false;
18
+ const updatedKeys = /* @__PURE__ */ new Set();
19
+ const setups = /* @__PURE__ */ new Set();
20
+ const listeners = /* @__PURE__ */ new Set();
21
+ const listenersBatch = /* @__PURE__ */ new Set();
22
+ const disposables = /* @__PURE__ */ new WeakMap();
23
+ const listenerKeys = /* @__PURE__ */ new WeakMap();
24
+ const setup = (callback) => {
25
+ setups.add(callback);
26
+ return () => setups.delete(callback);
27
+ };
28
+ const init = () => {
29
+ if (initialized)
30
+ return noop;
31
+ if (!stores.length)
32
+ return noop;
33
+ initialized = true;
34
+ const desyncs = getKeys(state).map(
35
+ (key) => chain(
36
+ ...stores.map((store) => {
37
+ const storeState = store?.getState?.();
38
+ if (!storeState)
39
+ return;
40
+ if (!hasOwnProperty(storeState, key))
41
+ return;
42
+ return store?.sync?.((state2) => setState(key, state2[key]), [key]);
43
+ })
44
+ )
45
+ );
46
+ const teardowns = [];
47
+ setups.forEach((setup2) => teardowns.push(setup2()));
48
+ const cleanups = stores.map((store) => store?.init?.());
49
+ return chain(...desyncs, ...teardowns, ...cleanups, () => {
50
+ initialized = false;
51
+ });
52
+ };
53
+ const sub = (listener, keys, batch = false) => {
54
+ const set = batch ? listenersBatch : listeners;
55
+ set.add(listener);
56
+ listenerKeys.set(listener, keys);
57
+ return () => {
58
+ disposables.get(listener)?.();
59
+ disposables.delete(listener);
60
+ listenerKeys.delete(listener);
61
+ set.delete(listener);
62
+ };
63
+ };
64
+ const subscribe = (listener, keys) => sub(listener, keys);
65
+ const sync = (listener, keys) => {
66
+ disposables.set(listener, listener(state, state));
67
+ return sub(listener, keys);
68
+ };
69
+ const syncBatch = (listener, keys) => {
70
+ if (!updating) {
71
+ disposables.set(listener, listener(state, prevStateBatch));
72
+ }
73
+ return sub(listener, keys, true);
74
+ };
75
+ const getState = () => state;
76
+ const setState = (key, value) => {
77
+ if (!hasOwnProperty(state, key))
78
+ return;
79
+ const nextValue = applyState(value, state[key]);
80
+ if (nextValue === state[key])
81
+ return;
82
+ stores.forEach((store) => {
83
+ store?.setState?.(key, nextValue);
84
+ });
85
+ const prevState = state;
86
+ state = { ...state, [key]: nextValue };
87
+ const thisUpdate = Symbol();
88
+ lastUpdate = thisUpdate;
89
+ updating = true;
90
+ updatedKeys.add(key);
91
+ const run = (listener, prev, uKeys) => {
92
+ const keys = listenerKeys.get(listener);
93
+ const updated = (k) => uKeys ? uKeys.has(k) : k === key;
94
+ if (!keys || keys.some(updated)) {
95
+ disposables.get(listener)?.();
96
+ disposables.set(listener, listener(state, prev));
97
+ }
98
+ };
99
+ listeners.forEach((listener) => run(listener, prevState));
100
+ queueMicrotask(() => {
101
+ if (lastUpdate !== thisUpdate)
102
+ return;
103
+ updating = false;
104
+ const snapshot = state;
105
+ listenersBatch.forEach((listener) => {
106
+ run(listener, prevStateBatch, updatedKeys);
107
+ });
108
+ prevStateBatch = snapshot;
109
+ queueMicrotask(() => {
110
+ updatedKeys.clear();
111
+ });
112
+ });
113
+ };
114
+ const pick2 = (...keys) => createStore(pick(state, keys), finalStore);
115
+ const omit2 = (...keys) => createStore(omit(state, keys), finalStore);
116
+ const finalStore = {
117
+ setup,
118
+ init,
119
+ subscribe,
120
+ sync,
121
+ syncBatch,
122
+ getState,
123
+ setState,
124
+ pick: pick2,
125
+ omit: omit2
126
+ };
127
+ return finalStore;
128
+ }
129
+ function mergeStore(...stores) {
130
+ const initialState = stores.reduce((state, store2) => {
131
+ const nextState = store2?.getState?.();
132
+ if (!nextState)
133
+ return state;
134
+ return { ...state, ...nextState };
135
+ }, {});
136
+ const store = createStore(initialState, ...stores);
137
+ return store;
138
+ }
139
+
140
+ export {
141
+ createStore,
142
+ mergeStore
143
+ };