@ioca/react 1.4.81 → 1.5.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 (217) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +31 -31
  3. package/lib/cjs/components/affix/affix.js.map +1 -1
  4. package/lib/cjs/components/affix/totop.js.map +1 -1
  5. package/lib/cjs/components/badge/badge.js.map +1 -1
  6. package/lib/cjs/components/button/button.js.map +1 -1
  7. package/lib/cjs/components/button/confirm.js.map +1 -1
  8. package/lib/cjs/components/button/group.js.map +1 -1
  9. package/lib/cjs/components/button/toggle.js.map +1 -1
  10. package/lib/cjs/components/card/card.js.map +1 -1
  11. package/lib/cjs/components/checkbox/checkbox.js.map +1 -1
  12. package/lib/cjs/components/checkbox/item.js.map +1 -1
  13. package/lib/cjs/components/collapse/collapse.js.map +1 -1
  14. package/lib/cjs/components/collapse/item.js.map +1 -1
  15. package/lib/cjs/components/datagrid/cell.js.map +1 -1
  16. package/lib/cjs/components/datagrid/datagrid.js.map +1 -1
  17. package/lib/cjs/components/datagrid/resize.js.map +1 -1
  18. package/lib/cjs/components/datagrid/row.js.map +1 -1
  19. package/lib/cjs/components/datagrid/sorter.js.map +1 -1
  20. package/lib/cjs/components/description/description.js.map +1 -1
  21. package/lib/cjs/components/drawer/drawer.js.map +1 -1
  22. package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
  23. package/lib/cjs/components/dropdown/item.js.map +1 -1
  24. package/lib/cjs/components/editor/controls.js.map +1 -1
  25. package/lib/cjs/components/editor/editor.js.map +1 -1
  26. package/lib/cjs/components/flex/flex.js.map +1 -1
  27. package/lib/cjs/components/form/context.js.map +1 -1
  28. package/lib/cjs/components/form/field.js.map +1 -1
  29. package/lib/cjs/components/form/form.js.map +1 -1
  30. package/lib/cjs/components/form/useConfig.js.map +1 -1
  31. package/lib/cjs/components/form/useForm.js.map +1 -1
  32. package/lib/cjs/components/icon/icon.js.map +1 -1
  33. package/lib/cjs/components/image/image.js.map +1 -1
  34. package/lib/cjs/components/image/list.js.map +1 -1
  35. package/lib/cjs/components/input/container.js.map +1 -1
  36. package/lib/cjs/components/input/input.js.map +1 -1
  37. package/lib/cjs/components/input/number.js +2 -1
  38. package/lib/cjs/components/input/number.js.map +1 -1
  39. package/lib/cjs/components/input/range.js +2 -1
  40. package/lib/cjs/components/input/range.js.map +1 -1
  41. package/lib/cjs/components/input/textarea.js.map +1 -1
  42. package/lib/cjs/components/list/item.js.map +1 -1
  43. package/lib/cjs/components/list/list.js.map +1 -1
  44. package/lib/cjs/components/loading/loading.js.map +1 -1
  45. package/lib/cjs/components/message/message.js.map +1 -1
  46. package/lib/cjs/components/modal/content.js.map +1 -1
  47. package/lib/cjs/components/modal/context.js.map +1 -1
  48. package/lib/cjs/components/modal/hookModal.js.map +1 -1
  49. package/lib/cjs/components/modal/modal.js.map +1 -1
  50. package/lib/cjs/components/modal/useModal.js.map +1 -1
  51. package/lib/cjs/components/pagination/page.js.map +1 -1
  52. package/lib/cjs/components/pagination/pagination.js.map +1 -1
  53. package/lib/cjs/components/picker/colors/footer.js.map +1 -1
  54. package/lib/cjs/components/picker/colors/handle.js.map +1 -1
  55. package/lib/cjs/components/picker/colors/index.js.map +1 -1
  56. package/lib/cjs/components/picker/dates/dates.js.map +1 -1
  57. package/lib/cjs/components/picker/dates/index.js.map +1 -1
  58. package/lib/cjs/components/picker/dates/panel.js.map +1 -1
  59. package/lib/cjs/components/picker/time/index.js.map +1 -1
  60. package/lib/cjs/components/picker/time/item.js.map +1 -1
  61. package/lib/cjs/components/picker/time/panel.js.map +1 -1
  62. package/lib/cjs/components/popconfirm/popconfirm.js.map +1 -1
  63. package/lib/cjs/components/popup/content.js.map +1 -1
  64. package/lib/cjs/components/popup/popup.js +141 -101
  65. package/lib/cjs/components/popup/popup.js.map +1 -1
  66. package/lib/cjs/components/progress/circle.js.map +1 -1
  67. package/lib/cjs/components/progress/line.js.map +1 -1
  68. package/lib/cjs/components/progress/progress.js.map +1 -1
  69. package/lib/cjs/components/radio/item.js.map +1 -1
  70. package/lib/cjs/components/radio/radio.js.map +1 -1
  71. package/lib/cjs/components/resizable/resizable.js.map +1 -1
  72. package/lib/cjs/components/river/river.js.map +1 -1
  73. package/lib/cjs/components/select/options.js.map +1 -1
  74. package/lib/cjs/components/select/select.js.map +1 -1
  75. package/lib/cjs/components/step/divider.js.map +1 -1
  76. package/lib/cjs/components/step/item.js.map +1 -1
  77. package/lib/cjs/components/step/step.js.map +1 -1
  78. package/lib/cjs/components/swiper/item.js.map +1 -1
  79. package/lib/cjs/components/swiper/swiper.js.map +1 -1
  80. package/lib/cjs/components/tabs/item.js.map +1 -1
  81. package/lib/cjs/components/tabs/tabs.js.map +1 -1
  82. package/lib/cjs/components/tag/tag.js.map +1 -1
  83. package/lib/cjs/components/text/highlight.js.map +1 -1
  84. package/lib/cjs/components/text/number.js.map +1 -1
  85. package/lib/cjs/components/text/text.js.map +1 -1
  86. package/lib/cjs/components/text/time.js.map +1 -1
  87. package/lib/cjs/components/tree/item.js.map +1 -1
  88. package/lib/cjs/components/tree/tree.js.map +1 -1
  89. package/lib/cjs/components/upload/renderFile.js.map +1 -1
  90. package/lib/cjs/components/upload/upload.js.map +1 -1
  91. package/lib/cjs/components/utils/empty/index.js.map +1 -1
  92. package/lib/cjs/components/utils/helpericon/helpericon.js.map +1 -1
  93. package/lib/cjs/components/video/video.js.map +1 -1
  94. package/lib/cjs/js/hooks.js +0 -64
  95. package/lib/cjs/js/hooks.js.map +1 -1
  96. package/lib/cjs/js/usePreview/content.js.map +1 -1
  97. package/lib/cjs/js/usePreview/index.js.map +1 -1
  98. package/lib/cjs/js/usePreview/renderFile.js.map +1 -1
  99. package/lib/cjs/js/usePreview/type.js.map +1 -1
  100. package/lib/cjs/js/useRipple/index.js +6 -6
  101. package/lib/cjs/js/useRipple/index.js.map +1 -1
  102. package/lib/cjs/js/useTheme/index.js +138 -20
  103. package/lib/cjs/js/useTheme/index.js.map +1 -1
  104. package/lib/cjs/js/utils.js.map +1 -1
  105. package/lib/css/colors.css +781 -0
  106. package/lib/css/index.css +1 -1
  107. package/lib/css/index.css.map +1 -1
  108. package/lib/css/input.css +192 -0
  109. package/lib/css/reset.css +153 -0
  110. package/lib/css/tokens.css +12 -0
  111. package/lib/css/utilities.css +1974 -0
  112. package/lib/es/components/affix/affix.js.map +1 -1
  113. package/lib/es/components/affix/totop.js.map +1 -1
  114. package/lib/es/components/badge/badge.js.map +1 -1
  115. package/lib/es/components/button/button.js.map +1 -1
  116. package/lib/es/components/button/confirm.js.map +1 -1
  117. package/lib/es/components/button/group.js.map +1 -1
  118. package/lib/es/components/button/toggle.js.map +1 -1
  119. package/lib/es/components/card/card.js.map +1 -1
  120. package/lib/es/components/checkbox/checkbox.js.map +1 -1
  121. package/lib/es/components/checkbox/item.js.map +1 -1
  122. package/lib/es/components/collapse/collapse.js.map +1 -1
  123. package/lib/es/components/collapse/item.js.map +1 -1
  124. package/lib/es/components/datagrid/cell.js.map +1 -1
  125. package/lib/es/components/datagrid/datagrid.js.map +1 -1
  126. package/lib/es/components/datagrid/resize.js.map +1 -1
  127. package/lib/es/components/datagrid/row.js.map +1 -1
  128. package/lib/es/components/datagrid/sorter.js.map +1 -1
  129. package/lib/es/components/description/description.js.map +1 -1
  130. package/lib/es/components/drawer/drawer.js.map +1 -1
  131. package/lib/es/components/dropdown/dropdown.js.map +1 -1
  132. package/lib/es/components/dropdown/item.js.map +1 -1
  133. package/lib/es/components/editor/controls.js.map +1 -1
  134. package/lib/es/components/editor/editor.js.map +1 -1
  135. package/lib/es/components/flex/flex.js.map +1 -1
  136. package/lib/es/components/form/context.js.map +1 -1
  137. package/lib/es/components/form/field.js.map +1 -1
  138. package/lib/es/components/form/form.js.map +1 -1
  139. package/lib/es/components/form/useConfig.js.map +1 -1
  140. package/lib/es/components/form/useForm.js.map +1 -1
  141. package/lib/es/components/icon/icon.js.map +1 -1
  142. package/lib/es/components/image/image.js.map +1 -1
  143. package/lib/es/components/image/list.js.map +1 -1
  144. package/lib/es/components/input/container.js.map +1 -1
  145. package/lib/es/components/input/input.js.map +1 -1
  146. package/lib/es/components/input/number.js +2 -1
  147. package/lib/es/components/input/number.js.map +1 -1
  148. package/lib/es/components/input/range.js +2 -1
  149. package/lib/es/components/input/range.js.map +1 -1
  150. package/lib/es/components/input/textarea.js.map +1 -1
  151. package/lib/es/components/list/item.js.map +1 -1
  152. package/lib/es/components/list/list.js.map +1 -1
  153. package/lib/es/components/loading/loading.js.map +1 -1
  154. package/lib/es/components/message/message.js.map +1 -1
  155. package/lib/es/components/modal/content.js.map +1 -1
  156. package/lib/es/components/modal/context.js.map +1 -1
  157. package/lib/es/components/modal/hookModal.js.map +1 -1
  158. package/lib/es/components/modal/modal.js.map +1 -1
  159. package/lib/es/components/modal/useModal.js.map +1 -1
  160. package/lib/es/components/pagination/page.js.map +1 -1
  161. package/lib/es/components/pagination/pagination.js.map +1 -1
  162. package/lib/es/components/picker/colors/footer.js.map +1 -1
  163. package/lib/es/components/picker/colors/handle.js.map +1 -1
  164. package/lib/es/components/picker/colors/index.js.map +1 -1
  165. package/lib/es/components/picker/dates/dates.js.map +1 -1
  166. package/lib/es/components/picker/dates/index.js.map +1 -1
  167. package/lib/es/components/picker/dates/panel.js.map +1 -1
  168. package/lib/es/components/picker/time/index.js.map +1 -1
  169. package/lib/es/components/picker/time/item.js.map +1 -1
  170. package/lib/es/components/picker/time/panel.js.map +1 -1
  171. package/lib/es/components/popconfirm/popconfirm.js.map +1 -1
  172. package/lib/es/components/popup/content.js.map +1 -1
  173. package/lib/es/components/popup/popup.js +143 -103
  174. package/lib/es/components/popup/popup.js.map +1 -1
  175. package/lib/es/components/progress/circle.js.map +1 -1
  176. package/lib/es/components/progress/line.js.map +1 -1
  177. package/lib/es/components/progress/progress.js.map +1 -1
  178. package/lib/es/components/radio/item.js.map +1 -1
  179. package/lib/es/components/radio/radio.js.map +1 -1
  180. package/lib/es/components/resizable/resizable.js.map +1 -1
  181. package/lib/es/components/river/river.js.map +1 -1
  182. package/lib/es/components/select/options.js.map +1 -1
  183. package/lib/es/components/select/select.js.map +1 -1
  184. package/lib/es/components/step/divider.js.map +1 -1
  185. package/lib/es/components/step/item.js.map +1 -1
  186. package/lib/es/components/step/step.js.map +1 -1
  187. package/lib/es/components/swiper/item.js.map +1 -1
  188. package/lib/es/components/swiper/swiper.js.map +1 -1
  189. package/lib/es/components/tabs/item.js.map +1 -1
  190. package/lib/es/components/tabs/tabs.js.map +1 -1
  191. package/lib/es/components/tag/tag.js.map +1 -1
  192. package/lib/es/components/text/highlight.js.map +1 -1
  193. package/lib/es/components/text/number.js.map +1 -1
  194. package/lib/es/components/text/text.js.map +1 -1
  195. package/lib/es/components/text/time.js.map +1 -1
  196. package/lib/es/components/tree/item.js.map +1 -1
  197. package/lib/es/components/tree/tree.js.map +1 -1
  198. package/lib/es/components/upload/renderFile.js.map +1 -1
  199. package/lib/es/components/upload/upload.js.map +1 -1
  200. package/lib/es/components/utils/empty/index.js.map +1 -1
  201. package/lib/es/components/utils/helpericon/helpericon.js.map +1 -1
  202. package/lib/es/components/video/video.js.map +1 -1
  203. package/lib/es/js/hooks.js +1 -64
  204. package/lib/es/js/hooks.js.map +1 -1
  205. package/lib/es/js/usePreview/content.js.map +1 -1
  206. package/lib/es/js/usePreview/index.js.map +1 -1
  207. package/lib/es/js/usePreview/renderFile.js.map +1 -1
  208. package/lib/es/js/usePreview/type.js.map +1 -1
  209. package/lib/es/js/useRipple/index.js +6 -6
  210. package/lib/es/js/useRipple/index.js.map +1 -1
  211. package/lib/es/js/useTheme/index.js +139 -21
  212. package/lib/es/js/useTheme/index.js.map +1 -1
  213. package/lib/es/js/utils.js.map +1 -1
  214. package/lib/index.js +289 -191
  215. package/lib/types/components/drawer/drawer.d.ts +2 -1
  216. package/lib/types/js/useTheme/index.d.ts +2 -1
  217. package/package.json +98 -99
package/lib/index.js CHANGED
@@ -35,12 +35,12 @@ function triggerRipple(target, e) {
35
35
  const [$box, $ripple] = createRipple();
36
36
  const rect = target.getBoundingClientRect();
37
37
  const size = Math.max(rect.width, rect.height) * 2;
38
- $ripple.style.cssText = `
39
- left: ${e.pageX - rect.left}px;
40
- top: ${e.pageY - rect.top}px;
41
- width: ${size}px;
42
- height: ${size}px;
43
- transition: all ${TIMEOUT / 1000}s;
38
+ $ripple.style.cssText = `
39
+ left: ${e.pageX - rect.left}px;
40
+ top: ${e.pageY - rect.top}px;
41
+ width: ${size}px;
42
+ height: ${size}px;
43
+ transition: all ${TIMEOUT / 1000}s;
44
44
  `;
45
45
  target.insertAdjacentElement("afterbegin", $box);
46
46
  target.offsetHeight;
@@ -192,69 +192,6 @@ function useReactive(initialState) {
192
192
  }
193
193
  return proxyRef.current;
194
194
  }
195
- function useLocalStorageState(key, options) {
196
- const { defaultValue, listenStorageChange } = options ?? {};
197
- const getDefault = () => {
198
- return typeof defaultValue === "function"
199
- ? defaultValue()
200
- : defaultValue;
201
- };
202
- const read = () => {
203
- if (typeof window === "undefined")
204
- return getDefault();
205
- const raw = window.localStorage.getItem(key);
206
- if (raw === null)
207
- return getDefault();
208
- try {
209
- return JSON.parse(raw);
210
- }
211
- catch (e) {
212
- return raw;
213
- }
214
- };
215
- const [state, setState] = useState(() => read());
216
- const set = (value) => {
217
- setState((prev) => {
218
- const next = typeof value === "function"
219
- ? value(prev)
220
- : value;
221
- if (typeof window !== "undefined") {
222
- if (next === undefined) {
223
- window.localStorage.removeItem(key);
224
- }
225
- else {
226
- window.localStorage.setItem(key, JSON.stringify(next));
227
- }
228
- }
229
- return next;
230
- });
231
- };
232
- useEffect(() => {
233
- if (!listenStorageChange)
234
- return;
235
- if (typeof window === "undefined")
236
- return;
237
- const onStorage = (e) => {
238
- if (e.key !== key)
239
- return;
240
- if (e.newValue === null) {
241
- setState(getDefault());
242
- return;
243
- }
244
- try {
245
- setState(JSON.parse(e.newValue));
246
- }
247
- catch (err) {
248
- setState(e.newValue);
249
- }
250
- };
251
- window.addEventListener("storage", onStorage);
252
- return () => {
253
- window.removeEventListener("storage", onStorage);
254
- };
255
- }, [key, listenStorageChange]);
256
- return [state, set];
257
- }
258
195
  function useSize(target) {
259
196
  const [size, setSize] = useState();
260
197
  useEffect(() => {
@@ -1361,6 +1298,20 @@ const Content$2 = forwardRef((props, ref) => {
1361
1298
  return createPortal(content, container);
1362
1299
  });
1363
1300
 
1301
+ const REACT_FORWARD_REF = Symbol.for("react.forward_ref");
1302
+ const REACT_FRAGMENT = Symbol.for("react.fragment");
1303
+ const canAttachRef = (el) => {
1304
+ if (!isValidElement(el))
1305
+ return false;
1306
+ const t = el.type;
1307
+ if (typeof t === "string")
1308
+ return true;
1309
+ if (t?.prototype?.isReactComponent)
1310
+ return true;
1311
+ if (t?.$$typeof === REACT_FORWARD_REF)
1312
+ return true;
1313
+ return false;
1314
+ };
1364
1315
  function Popup(props) {
1365
1316
  const { visible = false, content, trigger = "hover", gap = 12, offset = 8, position = "top", showDelay = 16, hideDelay = 12, touchable, arrow = true, align = "center", fitSize, disabled, style, className, children, onVisibleChange, } = props;
1366
1317
  const triggerRef = useRef(null);
@@ -1624,55 +1575,135 @@ function Popup(props) {
1624
1575
  toggleRef.current = handleToggle;
1625
1576
  const doHide = useMemo(() => () => hideRef.current(), []);
1626
1577
  const doToggle = useMemo(() => (action) => toggleRef.current(action), []);
1627
- const eventMaps = useMemo(() => {
1628
- return {
1629
- click: {
1630
- onClick: () => doToggle(true),
1631
- },
1632
- hover: {
1633
- onMouseEnter: () => doToggle(true),
1634
- onMouseLeave: () => doToggle(false),
1635
- },
1636
- focus: {
1637
- onFocus: () => doToggle(true),
1638
- onBlur: () => doToggle(false),
1639
- },
1640
- contextmenu: {
1641
- onContextMenu: (e) => {
1642
- e.preventDefault();
1643
- e.stopPropagation();
1644
- pointRef.current = {
1645
- pageX: e.pageX,
1646
- pageY: e.pageY,
1647
- };
1648
- if (showRef.current) {
1649
- ensureBaseStyle();
1650
- computePointPosition();
1651
- return;
1578
+ const mergeRefs = useMemo(() => {
1579
+ return (...refs) => {
1580
+ return (node) => {
1581
+ for (const ref of refs) {
1582
+ if (!ref)
1583
+ continue;
1584
+ if (typeof ref === "function") {
1585
+ ref(node);
1652
1586
  }
1653
- clearAllTimers();
1654
- phaseRef.current = "showing";
1655
- lastPosRef.current = null;
1656
- lastArrowRef.current = null;
1657
- arrowElRef.current = null;
1658
- setShow(true);
1659
- timerRef.current = setTimeout(() => {
1660
- if (phaseRef.current !== "showing")
1661
- return;
1662
- if (!contentRef.current)
1663
- return;
1664
- ensureBaseStyle();
1665
- computePointPosition();
1666
- setContentVisible(true);
1667
- clearTimer();
1668
- latestRef.current.onVisibleChange?.(true);
1669
- phaseRef.current = "";
1670
- }, latestRef.current.showDelay);
1671
- },
1672
- },
1673
- none: {},
1587
+ else {
1588
+ ref.current = node;
1589
+ }
1590
+ }
1591
+ };
1674
1592
  };
1593
+ }, []);
1594
+ const triggerEvents = useMemo(() => {
1595
+ const setTriggerEl = (e) => {
1596
+ const el = e?.currentTarget;
1597
+ if (el)
1598
+ triggerRef.current = el;
1599
+ };
1600
+ switch (trigger) {
1601
+ case "click":
1602
+ return {
1603
+ onClick: (e) => {
1604
+ setTriggerEl(e);
1605
+ doToggle(true);
1606
+ },
1607
+ };
1608
+ case "hover":
1609
+ return {
1610
+ onMouseEnter: (e) => {
1611
+ setTriggerEl(e);
1612
+ doToggle(true);
1613
+ },
1614
+ onMouseLeave: (e) => {
1615
+ setTriggerEl(e);
1616
+ doToggle(false);
1617
+ },
1618
+ };
1619
+ case "focus":
1620
+ return {
1621
+ onFocus: (e) => {
1622
+ setTriggerEl(e);
1623
+ doToggle(true);
1624
+ },
1625
+ onBlur: (e) => {
1626
+ setTriggerEl(e);
1627
+ doToggle(false);
1628
+ },
1629
+ };
1630
+ case "contextmenu":
1631
+ return {
1632
+ onContextMenu: (e) => {
1633
+ e.preventDefault();
1634
+ e.stopPropagation();
1635
+ setTriggerEl(e);
1636
+ pointRef.current = {
1637
+ pageX: e.pageX,
1638
+ pageY: e.pageY,
1639
+ };
1640
+ if (showRef.current) {
1641
+ ensureBaseStyle();
1642
+ computePointPosition();
1643
+ return;
1644
+ }
1645
+ clearAllTimers();
1646
+ phaseRef.current = "showing";
1647
+ lastPosRef.current = null;
1648
+ lastArrowRef.current = null;
1649
+ arrowElRef.current = null;
1650
+ setShow(true);
1651
+ timerRef.current = setTimeout(() => {
1652
+ if (phaseRef.current !== "showing")
1653
+ return;
1654
+ if (!contentRef.current)
1655
+ return;
1656
+ ensureBaseStyle();
1657
+ computePointPosition();
1658
+ setContentVisible(true);
1659
+ clearTimer();
1660
+ latestRef.current.onVisibleChange?.(true);
1661
+ phaseRef.current = "";
1662
+ }, latestRef.current.showDelay);
1663
+ },
1664
+ };
1665
+ default:
1666
+ return {};
1667
+ }
1675
1668
  }, [doToggle]);
1669
+ const triggerNode = useMemo(() => {
1670
+ const events = triggerEvents;
1671
+ const eventKeys = Object.keys(events);
1672
+ const items = Children.toArray(children);
1673
+ let attachedRef = false;
1674
+ let cloned = false;
1675
+ const nextItems = items.map((item) => {
1676
+ if (!isValidElement(item))
1677
+ return item;
1678
+ if (item.type === REACT_FRAGMENT)
1679
+ return item;
1680
+ const attachRef = !attachedRef && canAttachRef(item);
1681
+ if (attachRef)
1682
+ attachedRef = true;
1683
+ if (!attachRef && eventKeys.length === 0)
1684
+ return item;
1685
+ const patchedProps = {};
1686
+ for (const evt of eventKeys) {
1687
+ const ours = events[evt];
1688
+ const theirs = item.props?.[evt];
1689
+ patchedProps[evt] =
1690
+ typeof theirs === "function"
1691
+ ? (e) => {
1692
+ ours(e);
1693
+ theirs(e);
1694
+ }
1695
+ : ours;
1696
+ }
1697
+ if (attachRef) {
1698
+ patchedProps.ref = mergeRefs(item.ref, triggerRef);
1699
+ }
1700
+ cloned = true;
1701
+ return cloneElement(item, patchedProps);
1702
+ });
1703
+ if (!cloned)
1704
+ return children;
1705
+ return nextItems.length === 1 ? nextItems[0] : jsx(Fragment, { children: nextItems });
1706
+ }, [children, triggerEvents, mergeRefs]);
1676
1707
  const contentTouch = useMemo(() => {
1677
1708
  if (!touchable)
1678
1709
  return {};
@@ -1753,61 +1784,7 @@ function Popup(props) {
1753
1784
  window.removeEventListener("scroll", onScrollOrResize, true);
1754
1785
  };
1755
1786
  }, [show]);
1756
- const mergeRefs = (...refs) => {
1757
- return (node) => {
1758
- for (const ref of refs) {
1759
- if (!ref)
1760
- continue;
1761
- if (typeof ref === "function") {
1762
- ref(node);
1763
- }
1764
- else {
1765
- ref.current = node;
1766
- }
1767
- }
1768
- };
1769
- };
1770
- return (jsxs(Fragment, { children: [(() => {
1771
- const events = eventMaps[trigger];
1772
- const items = Children.toArray(children);
1773
- const canAttachRef = (el) => {
1774
- if (!isValidElement(el))
1775
- return false;
1776
- const t = el.type;
1777
- if (typeof t === "string")
1778
- return true;
1779
- if (t?.prototype?.isReactComponent)
1780
- return true;
1781
- if (t?.$$typeof === Symbol.for("react.forward_ref"))
1782
- return true;
1783
- return false;
1784
- };
1785
- if (items.length !== 1) {
1786
- return (jsx("div", { ref: triggerRef, ...events, className: 'i-popup-trigger', style: { display: "inline-block" }, children: children }));
1787
- }
1788
- const only = items[0];
1789
- if (!isValidElement(only) || !canAttachRef(only)) {
1790
- return (jsx("div", { ref: triggerRef, ...events, className: 'i-popup-trigger', style: { display: "inline-block" }, children: only }));
1791
- }
1792
- const { className: childClassName, ...restProps } = only.props;
1793
- const nextProps = { ...restProps };
1794
- for (const evt of Object.keys(events)) {
1795
- const theirs = restProps[evt];
1796
- const ours = events[evt];
1797
- nextProps[evt] =
1798
- typeof theirs === "function"
1799
- ? (e) => {
1800
- ours(e);
1801
- theirs(e);
1802
- }
1803
- : ours;
1804
- }
1805
- return cloneElement(only, {
1806
- ref: mergeRefs(only.ref, triggerRef),
1807
- className: childClassName,
1808
- ...nextProps,
1809
- });
1810
- })(), show && (jsx(Content$2, { ref: contentRef, arrow: arrow && trigger !== "contextmenu", style: {
1787
+ return (jsxs(Fragment, { children: [triggerNode, show && (jsx(Content$2, { ref: contentRef, arrow: arrow && trigger !== "contextmenu", style: {
1811
1788
  ...style,
1812
1789
  position: "fixed",
1813
1790
  }, className: className, ...contentTouch, trigger: triggerRef.current, children: content }))] }));
@@ -3058,7 +3035,7 @@ function InputContainer(props) {
3058
3035
  }
3059
3036
 
3060
3037
  const Number$1 = (props) => {
3061
- const { ref, label, name, value = "", labelInline, step = 1, min = -Infinity, max = Infinity, thousand, precision, type, className, width, status = "normal", append, border, prepend, disabled, message, tip, hideControl, showMax, style, onChange, onEnter, onInput, onBlur, ...restProps } = props;
3038
+ const { ref, label, name, value = "", labelInline, step = 1, min = -Infinity, max = Infinity, thousand, precision, type, className, width, status = "normal", append, border, underline, prepend, disabled, message, tip, hideControl, showMax, style, onChange, onEnter, onInput, onBlur, ...restProps } = props;
3062
3039
  const [inputValue, setInputValue] = useState(value === undefined || value === null ? "" : String(value));
3063
3040
  const formatOut = (num) => {
3064
3041
  const v = clamp(num, min, max);
@@ -3153,11 +3130,12 @@ const Number$1 = (props) => {
3153
3130
  return (jsx(InputContainer, { label: label, labelInline: labelInline, className: className, style: { width, ...style }, tip: message ?? tip, status: status, children: jsxs("div", { className: classNames("i-input-item", {
3154
3131
  [`i-input-${status}`]: status !== "normal",
3155
3132
  "i-input-borderless": !border,
3133
+ "i-input-underline": underline,
3156
3134
  }), children: [prepend && jsx("div", { className: 'i-input-prepend', children: prepend }), !hideControl && !disabled && (jsx(Helpericon, { active: true, icon: jsx(MinusRound, {}), onClick: () => handleOperate(-step) })), jsx("input", { ...inputProps }), !hideControl && !disabled && (jsx(Helpericon, { active: true, icon: jsx(PlusRound, {}), onClick: () => handleOperate(step) })), showMax && max && !disabled && (jsx(Helpericon, { active: true, icon: jsx(KeyboardDoubleArrowUpRound, {}), onClick: handleMax })), append && jsx("div", { className: 'i-input-append', children: append })] }) }));
3157
3135
  };
3158
3136
 
3159
3137
  const Range = (props) => {
3160
- const { label, name, value, labelInline, min = -Infinity, max = Infinity, type, className, status = "normal", message, tip, append, prepend, step = 1, width, thousand, precision, hideControl, placeholder, border, autoSwitch, onChange, onBlur, style, ...restProps } = props;
3138
+ const { label, name, value, labelInline, min = -Infinity, max = Infinity, type, className, status = "normal", message, tip, append, prepend, step = 1, width, thousand, precision, hideControl, placeholder, border, underline, autoSwitch, onChange, onBlur, style, ...restProps } = props;
3161
3139
  const [rangeValue, setRangeValue] = useState(value);
3162
3140
  const getRangeNumber = (v) => clamp(v, min, max);
3163
3141
  const getFormatNumber = (v) => formatNumber(v, { precision, thousand });
@@ -3216,6 +3194,7 @@ const Range = (props) => {
3216
3194
  return (jsx(InputContainer, { label: label, labelInline: labelInline, className: className, style: { width, ...style }, tip: message ?? tip, status: status, children: jsxs("div", { className: classNames("i-input-item", {
3217
3195
  [`i-input-${status}`]: status !== "normal",
3218
3196
  "i-input-borderless": !border,
3197
+ "i-input-underline": underline,
3219
3198
  }), children: [prepend && jsx("div", { className: 'i-input-prepend', children: prepend }), !hideControl && (jsx(Helpericon, { active: true, icon: jsx(MinusRound, {}), onClick: (e) => handleOperate(e, -step, 0) })), jsx("input", { value: rangeValue?.[0] || "", placeholder: placeholder?.[0], ...inputProps, onBlur: handleBlur, onChange: (e) => handleChange(e, 0) }), !hideControl && (jsx(Helpericon, { active: true, icon: jsx(PlusRound, {}), onClick: (e) => handleOperate(e, step, 0) })), jsx(Helpericon, { active: true, icon: jsx(SyncAltRound, {}), style: { margin: 0 }, onClick: handleSwitch }), !hideControl && (jsx(Helpericon, { active: true, icon: jsx(MinusRound, {}), onClick: (e) => handleOperate(e, -step, 1) })), jsx("input", { value: rangeValue?.[1] || "", placeholder: placeholder?.[1], ...inputProps, onBlur: handleBlur, onChange: (e) => handleChange(e, 1) }), !hideControl && (jsx(Helpericon, { active: true, icon: jsx(PlusRound, {}), onClick: (e) => handleOperate(e, step, 1) })), append && jsx("div", { className: 'i-input-append', children: append })] }) }));
3220
3199
  };
3221
3200
 
@@ -5115,31 +5094,150 @@ const Upload = (props) => {
5115
5094
  }) }), uploadMessage && (jsx("span", { className: 'i-upload-message', children: uploadMessage })), fileList.length < limit && (jsxs("label", { children: [jsx("input", { ...restProps, disabled: disabled, ref: inputRef, type: 'file', className: 'i-input-file-hidden', multiple: multiple, onChange: handleChange }), trigger] }))] }) }));
5116
5095
  };
5117
5096
 
5097
+ const stores = new Map();
5098
+ function readTheme(key, defaultValue) {
5099
+ if (typeof window === "undefined")
5100
+ return defaultValue;
5101
+ const raw = window.localStorage.getItem(key);
5102
+ if (raw === null)
5103
+ return defaultValue;
5104
+ try {
5105
+ return JSON.parse(raw);
5106
+ }
5107
+ catch {
5108
+ return raw;
5109
+ }
5110
+ }
5111
+ function writeTheme(key, value) {
5112
+ if (typeof window === "undefined")
5113
+ return;
5114
+ if (value === undefined) {
5115
+ window.localStorage.removeItem(key);
5116
+ }
5117
+ else {
5118
+ window.localStorage.setItem(key, JSON.stringify(value));
5119
+ }
5120
+ }
5121
+ function applyThemeToDocument(theme) {
5122
+ if (typeof document === "undefined")
5123
+ return;
5124
+ if (!theme)
5125
+ return;
5126
+ const cls = document.documentElement.classList;
5127
+ const prev = Array.from(cls).find((n) => n.startsWith("theme-"));
5128
+ if (prev) {
5129
+ if (prev !== theme)
5130
+ cls.replace(prev, theme);
5131
+ }
5132
+ else {
5133
+ cls.add(theme);
5134
+ }
5135
+ }
5136
+ function ensureStore(key, defaultValue) {
5137
+ const existed = stores.get(key);
5138
+ if (existed) {
5139
+ return existed;
5140
+ }
5141
+ const theme = readTheme(key, defaultValue);
5142
+ const store = {
5143
+ key,
5144
+ defaultValue,
5145
+ theme,
5146
+ listeners: new Set(),
5147
+ storageSubscribers: 0,
5148
+ };
5149
+ stores.set(key, store);
5150
+ applyThemeToDocument(theme);
5151
+ return store;
5152
+ }
5153
+ function notify(store) {
5154
+ for (const listener of store.listeners) {
5155
+ listener(store.theme);
5156
+ }
5157
+ }
5158
+ function setStoreTheme(store, value) {
5159
+ const prev = store.theme;
5160
+ const next = typeof value === "function"
5161
+ ? value(prev)
5162
+ : value;
5163
+ const resolved = next ?? store.defaultValue;
5164
+ if (resolved === store.theme)
5165
+ return;
5166
+ store.theme = resolved;
5167
+ writeTheme(store.key, next);
5168
+ applyThemeToDocument(resolved);
5169
+ notify(store);
5170
+ }
5171
+ function ensureStorageListener(store) {
5172
+ if (typeof window === "undefined")
5173
+ return;
5174
+ if (store.storageListener)
5175
+ return;
5176
+ store.storageListener = (e) => {
5177
+ if (e.key !== store.key)
5178
+ return;
5179
+ if (e.newValue === null) {
5180
+ store.theme = store.defaultValue;
5181
+ applyThemeToDocument(store.theme);
5182
+ notify(store);
5183
+ return;
5184
+ }
5185
+ try {
5186
+ store.theme = JSON.parse(e.newValue);
5187
+ }
5188
+ catch {
5189
+ store.theme = e.newValue;
5190
+ }
5191
+ applyThemeToDocument(store.theme);
5192
+ notify(store);
5193
+ };
5194
+ window.addEventListener("storage", store.storageListener);
5195
+ }
5196
+ function cleanupStorageListener(store) {
5197
+ if (typeof window === "undefined")
5198
+ return;
5199
+ if (store.storageSubscribers > 0)
5200
+ return;
5201
+ if (!store.storageListener)
5202
+ return;
5203
+ window.removeEventListener("storage", store.storageListener);
5204
+ store.storageListener = undefined;
5205
+ }
5118
5206
  const useTheme = (props) => {
5119
5207
  const { key = "ioca-react-theme", defaultValue = "theme-auto", listenStorageChange, } = props ?? {};
5120
- const [mounted, setMounted] = useState(false);
5121
- const [theme, setTheme] = useLocalStorageState(key, {
5122
- defaultValue,
5123
- listenStorageChange,
5124
- });
5208
+ if (typeof window === "undefined") {
5209
+ return {
5210
+ theme: defaultValue,
5211
+ setTheme: () => { },
5212
+ };
5213
+ }
5214
+ const store = useMemo(() => ensureStore(key, defaultValue), [key]);
5215
+ const [theme, setThemeState] = useState(() => store.theme);
5125
5216
  useEffect(() => {
5126
- setMounted(true);
5127
- }, []);
5217
+ store.defaultValue = defaultValue;
5218
+ applyThemeToDocument(store.theme);
5219
+ }, [store, defaultValue]);
5128
5220
  useEffect(() => {
5129
- if (!mounted || !theme)
5130
- return;
5131
- const cls = document.documentElement.classList;
5132
- const prev = Array.from(cls).find((n) => n.startsWith("theme-"));
5133
- if (prev) {
5134
- cls.replace(prev, theme);
5135
- }
5136
- else {
5137
- cls.add(theme);
5221
+ store.listeners.add(setThemeState);
5222
+ setThemeState(store.theme);
5223
+ if (listenStorageChange) {
5224
+ store.storageSubscribers += 1;
5225
+ ensureStorageListener(store);
5138
5226
  }
5139
- }, [theme, mounted]);
5227
+ return () => {
5228
+ store.listeners.delete(setThemeState);
5229
+ if (listenStorageChange) {
5230
+ store.storageSubscribers = Math.max(0, store.storageSubscribers - 1);
5231
+ cleanupStorageListener(store);
5232
+ }
5233
+ };
5234
+ }, [store, listenStorageChange]);
5235
+ const setTheme = (value) => {
5236
+ setStoreTheme(store, value);
5237
+ };
5140
5238
  return {
5141
- theme: mounted ? theme : defaultValue,
5142
- setTheme: mounted ? setTheme : () => { },
5239
+ theme,
5240
+ setTheme,
5143
5241
  };
5144
5242
  };
5145
5243
 
@@ -1,5 +1,6 @@
1
+ import * as react from 'react';
1
2
  import { IDrawer } from './type.js';
2
3
 
3
- declare function Drawer(props: IDrawer): any;
4
+ declare function Drawer(props: IDrawer): react.ReactPortal;
4
5
 
5
6
  export { Drawer as default };
@@ -1,8 +1,9 @@
1
1
  import { ITheme } from './type.js';
2
2
 
3
+ type TSetTheme = (value: string | undefined | ((prev: string) => string | undefined)) => void;
3
4
  declare const useTheme: (props?: ITheme) => {
4
5
  theme: string;
5
- setTheme: (value: string | ((prev: string) => string)) => void;
6
+ setTheme: TSetTheme;
6
7
  };
7
8
 
8
9
  export { useTheme as default };