@yamada-ui/utils 0.1.0 → 0.1.2

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.
@@ -6,7 +6,7 @@ declare const isNumeric: (value: any) => boolean;
6
6
  declare const isString: (value: any) => value is string;
7
7
  declare const isUndefined: (value: any) => value is undefined;
8
8
  declare const isNull: (value: any) => value is null;
9
- declare const isObject: <T extends Dict<any>>(value: any) => value is T;
9
+ declare const isObject: <T extends Dict>(value: any) => value is T;
10
10
  declare const isArray: <T extends any[]>(value: any) => value is T;
11
11
  declare const isEmpty: (value: any) => boolean;
12
12
  declare const isFunction: <T extends Function = Function>(value: any) => value is T;
@@ -118,47 +118,87 @@ var useUpdateEffect = (callback, deps) => {
118
118
  };
119
119
  }, []);
120
120
  };
121
+ var useAsync = (func, deps = []) => {
122
+ const [state, callback] = useAsyncFunc(func, deps, { loading: true });
123
+ React.useEffect(() => {
124
+ callback();
125
+ }, [callback]);
126
+ return state;
127
+ };
128
+ var useAsyncFunc = (func, deps = [], initialState = { loading: false }) => {
129
+ const lastCallId = React.useRef(0);
130
+ const isMounted = useIsMounted();
131
+ const [state, setState] = React.useState(initialState);
132
+ const callback = React.useCallback((...args) => {
133
+ const callId = ++lastCallId.current;
134
+ if (!state.loading) {
135
+ setState((prevState) => ({ ...prevState, loading: true }));
136
+ }
137
+ return func(...args).then(
138
+ (value) => {
139
+ if (isMounted.current && callId === lastCallId.current)
140
+ setState({ value, loading: false });
141
+ return value;
142
+ },
143
+ (error) => {
144
+ if (isMounted.current && callId === lastCallId.current)
145
+ setState({ error, loading: false });
146
+ return error;
147
+ }
148
+ );
149
+ }, deps);
150
+ return [state, callback];
151
+ };
152
+ var useAsyncRetry = (func, deps = []) => {
153
+ const [attempt, setAttempt] = React.useState(0);
154
+ const state = useAsync(func, [...deps, attempt]);
155
+ const stateLoading = state.loading;
156
+ const retry = React.useCallback(() => {
157
+ if (stateLoading)
158
+ return;
159
+ setAttempt((currentAttempt) => currentAttempt + 1);
160
+ }, [...deps, stateLoading]);
161
+ return { ...state, retry };
162
+ };
121
163
 
122
164
  // src/color.ts
123
- import { TinyColor } from "@ctrl/tinycolor";
165
+ import { toHex, parseToRgba, transparentize, mix, darken, lighten } from "color2k";
124
166
  var getColor = (color, fallback) => (theme, colorMode) => {
125
167
  const hex = getMemoizedObject(
126
168
  theme,
127
169
  `colors.${color}`,
128
170
  color
129
171
  );
130
- if (isArray(hex)) {
131
- const [lightHex, darkHex] = hex;
132
- const { isValid, originalInput } = new TinyColor(colorMode !== "dark" ? lightHex : darkHex);
133
- return isValid ? originalInput : fallback;
134
- } else {
135
- const { isValid, originalInput } = new TinyColor(hex);
136
- return isValid ? originalInput : fallback;
172
+ try {
173
+ if (isArray(hex)) {
174
+ const [lightHex, darkHex] = hex;
175
+ return toHex(String(colorMode !== "dark" ? lightHex : darkHex));
176
+ } else {
177
+ return toHex(String(hex));
178
+ }
179
+ } catch {
180
+ return fallback != null ? fallback : "#000000";
137
181
  }
138
182
  };
139
183
  var lightenColor = (color, amount) => (theme, colorMode) => {
140
184
  const raw = getColor(color)(theme, colorMode);
141
- return new TinyColor(raw).lighten(amount).toRgbString();
185
+ return toHex(lighten(raw, amount / 100));
142
186
  };
143
187
  var darkenColor = (color, amount) => (theme, colorMode) => {
144
188
  const raw = getColor(color)(theme, colorMode);
145
- return new TinyColor(raw).darken(amount).toRgbString();
146
- };
147
- var brightenColor = (color, amount) => (theme, colorMode) => {
148
- const raw = getColor(color)(theme, colorMode);
149
- return new TinyColor(raw).brighten(amount).toRgbString();
189
+ return toHex(darken(raw, amount / 100));
150
190
  };
151
191
  var tintColor = (color, amount) => (theme, colorMode) => {
152
192
  const raw = getColor(color)(theme, colorMode);
153
- return new TinyColor(raw).tint(amount).toRgbString();
193
+ return toHex(mix(raw, "#fff", amount));
154
194
  };
155
195
  var shadeColor = (color, amount) => (theme, colorMode) => {
156
196
  const raw = getColor(color)(theme, colorMode);
157
- return new TinyColor(raw).shade(amount).toRgbString();
197
+ return toHex(mix(raw, "#000", amount / 100));
158
198
  };
159
199
  var transparentizeColor = (color, alpha) => (theme, colorMode) => {
160
200
  const raw = getColor(color)(theme, colorMode);
161
- return new TinyColor(raw).setAlpha(alpha).toRgbString();
201
+ return transparentize(raw, 1 - alpha);
162
202
  };
163
203
  var toneColor = (color, l) => (theme, colorMode) => {
164
204
  const raw = getColor(color)(theme, colorMode);
@@ -170,7 +210,7 @@ var toneColor = (color, l) => (theme, colorMode) => {
170
210
  n *= -1;
171
211
  if (n !== 0)
172
212
  n = n - 5 * (isLighten ? 1 : -1);
173
- return new TinyColor(raw)[isLighten ? "lighten" : "shade"](n).toString();
213
+ return toHex(isLighten ? lighten(raw, n / 100) : mix(raw, "#000", n / 100));
174
214
  };
175
215
  var randomColor = ({ string, colors } = {}) => {
176
216
  const fallback = randomHex();
@@ -210,14 +250,18 @@ var randomColorFromList = (str, list) => {
210
250
  return list[index];
211
251
  };
212
252
  var randomFromList = (list) => list[Math.floor(Math.random() * list.length)];
213
- var isLight = (color) => (theme, colorMode) => {
214
- const raw = getColor(color)(theme, colorMode);
215
- return new TinyColor(raw).isLight();
253
+ var getBrightness = (color) => {
254
+ const [r, g, b] = parseToRgba(color);
255
+ return (r * 299 + g * 587 + b * 114) / 1e3;
216
256
  };
217
- var isDark = (color) => (theme, colorMode) => {
257
+ var isTone = (color) => (theme, colorMode) => {
218
258
  const raw = getColor(color)(theme, colorMode);
219
- return new TinyColor(raw).isDark();
259
+ const brightness = getBrightness(raw);
260
+ const isDark2 = brightness < 128;
261
+ return isDark2 ? "dark" : "light";
220
262
  };
263
+ var isLight = (color) => (theme, colorMode) => isTone(color)(theme, colorMode) === "dark";
264
+ var isDark = (color) => (theme, colorMode) => isTone(color)(theme, colorMode) === "light";
221
265
 
222
266
  // src/object.ts
223
267
  var omitObject = (obj, keys) => {
@@ -387,15 +431,18 @@ export {
387
431
  useMergeRefs,
388
432
  useCallbackRef,
389
433
  useUpdateEffect,
434
+ useAsync,
435
+ useAsyncFunc,
436
+ useAsyncRetry,
390
437
  getColor,
391
438
  lightenColor,
392
439
  darkenColor,
393
- brightenColor,
394
440
  tintColor,
395
441
  shadeColor,
396
442
  transparentizeColor,
397
443
  toneColor,
398
444
  randomColor,
445
+ isTone,
399
446
  isLight,
400
447
  isDark
401
448
  };
package/dist/color.d.ts CHANGED
@@ -1,10 +1,8 @@
1
- import * as _ctrl_tinycolor from '@ctrl/tinycolor';
2
1
  import { Dict } from './index.types.js';
3
2
 
4
- declare const getColor: (color: string, fallback?: string) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string | number | _ctrl_tinycolor.RGB | _ctrl_tinycolor.HSL | _ctrl_tinycolor.HSV | undefined;
3
+ declare const getColor: (color: string, fallback?: string) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
5
4
  declare const lightenColor: (color: string, amount: number) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
6
5
  declare const darkenColor: (color: string, amount: number) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
7
- declare const brightenColor: (color: string, amount: number) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
8
6
  declare const tintColor: (color: string, amount: number) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
9
7
  declare const shadeColor: (color: string, amount: number) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
10
8
  declare const transparentizeColor: (color: string, alpha: number) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => string;
@@ -13,7 +11,8 @@ declare const randomColor: ({ string, colors }?: {
13
11
  string?: string | undefined;
14
12
  colors?: string[] | undefined;
15
13
  }) => string;
14
+ declare const isTone: (color: string) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => "light" | "dark";
16
15
  declare const isLight: (color: string) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => boolean;
17
16
  declare const isDark: (color: string) => (theme: Dict, colorMode: 'light' | 'dark' | undefined) => boolean;
18
17
 
19
- export { brightenColor, darkenColor, getColor, isDark, isLight, lightenColor, randomColor, shadeColor, tintColor, toneColor, transparentizeColor };
18
+ export { darkenColor, getColor, isDark, isLight, isTone, lightenColor, randomColor, shadeColor, tintColor, toneColor, transparentizeColor };
package/dist/color.js CHANGED
@@ -20,11 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/color.ts
21
21
  var color_exports = {};
22
22
  __export(color_exports, {
23
- brightenColor: () => brightenColor,
24
23
  darkenColor: () => darkenColor,
25
24
  getColor: () => getColor,
26
25
  isDark: () => isDark,
27
26
  isLight: () => isLight,
27
+ isTone: () => isTone,
28
28
  lightenColor: () => lightenColor,
29
29
  randomColor: () => randomColor,
30
30
  shadeColor: () => shadeColor,
@@ -33,7 +33,7 @@ __export(color_exports, {
33
33
  transparentizeColor: () => transparentizeColor
34
34
  });
35
35
  module.exports = __toCommonJS(color_exports);
36
- var import_tinycolor = require("@ctrl/tinycolor");
36
+ var import_color2k = require("color2k");
37
37
 
38
38
  // src/assertion.ts
39
39
  var isArray = (value) => Array.isArray(value);
@@ -74,38 +74,36 @@ var getColor = (color, fallback) => (theme, colorMode) => {
74
74
  `colors.${color}`,
75
75
  color
76
76
  );
77
- if (isArray(hex)) {
78
- const [lightHex, darkHex] = hex;
79
- const { isValid, originalInput } = new import_tinycolor.TinyColor(colorMode !== "dark" ? lightHex : darkHex);
80
- return isValid ? originalInput : fallback;
81
- } else {
82
- const { isValid, originalInput } = new import_tinycolor.TinyColor(hex);
83
- return isValid ? originalInput : fallback;
77
+ try {
78
+ if (isArray(hex)) {
79
+ const [lightHex, darkHex] = hex;
80
+ return (0, import_color2k.toHex)(String(colorMode !== "dark" ? lightHex : darkHex));
81
+ } else {
82
+ return (0, import_color2k.toHex)(String(hex));
83
+ }
84
+ } catch {
85
+ return fallback != null ? fallback : "#000000";
84
86
  }
85
87
  };
86
88
  var lightenColor = (color, amount) => (theme, colorMode) => {
87
89
  const raw = getColor(color)(theme, colorMode);
88
- return new import_tinycolor.TinyColor(raw).lighten(amount).toRgbString();
90
+ return (0, import_color2k.toHex)((0, import_color2k.lighten)(raw, amount / 100));
89
91
  };
90
92
  var darkenColor = (color, amount) => (theme, colorMode) => {
91
93
  const raw = getColor(color)(theme, colorMode);
92
- return new import_tinycolor.TinyColor(raw).darken(amount).toRgbString();
93
- };
94
- var brightenColor = (color, amount) => (theme, colorMode) => {
95
- const raw = getColor(color)(theme, colorMode);
96
- return new import_tinycolor.TinyColor(raw).brighten(amount).toRgbString();
94
+ return (0, import_color2k.toHex)((0, import_color2k.darken)(raw, amount / 100));
97
95
  };
98
96
  var tintColor = (color, amount) => (theme, colorMode) => {
99
97
  const raw = getColor(color)(theme, colorMode);
100
- return new import_tinycolor.TinyColor(raw).tint(amount).toRgbString();
98
+ return (0, import_color2k.toHex)((0, import_color2k.mix)(raw, "#fff", amount));
101
99
  };
102
100
  var shadeColor = (color, amount) => (theme, colorMode) => {
103
101
  const raw = getColor(color)(theme, colorMode);
104
- return new import_tinycolor.TinyColor(raw).shade(amount).toRgbString();
102
+ return (0, import_color2k.toHex)((0, import_color2k.mix)(raw, "#000", amount / 100));
105
103
  };
106
104
  var transparentizeColor = (color, alpha) => (theme, colorMode) => {
107
105
  const raw = getColor(color)(theme, colorMode);
108
- return new import_tinycolor.TinyColor(raw).setAlpha(alpha).toRgbString();
106
+ return (0, import_color2k.transparentize)(raw, 1 - alpha);
109
107
  };
110
108
  var toneColor = (color, l) => (theme, colorMode) => {
111
109
  const raw = getColor(color)(theme, colorMode);
@@ -117,7 +115,7 @@ var toneColor = (color, l) => (theme, colorMode) => {
117
115
  n *= -1;
118
116
  if (n !== 0)
119
117
  n = n - 5 * (isLighten ? 1 : -1);
120
- return new import_tinycolor.TinyColor(raw)[isLighten ? "lighten" : "shade"](n).toString();
118
+ return (0, import_color2k.toHex)(isLighten ? (0, import_color2k.lighten)(raw, n / 100) : (0, import_color2k.mix)(raw, "#000", n / 100));
121
119
  };
122
120
  var randomColor = ({ string, colors } = {}) => {
123
121
  const fallback = randomHex();
@@ -157,21 +155,25 @@ var randomColorFromList = (str, list) => {
157
155
  return list[index];
158
156
  };
159
157
  var randomFromList = (list) => list[Math.floor(Math.random() * list.length)];
160
- var isLight = (color) => (theme, colorMode) => {
161
- const raw = getColor(color)(theme, colorMode);
162
- return new import_tinycolor.TinyColor(raw).isLight();
158
+ var getBrightness = (color) => {
159
+ const [r, g, b] = (0, import_color2k.parseToRgba)(color);
160
+ return (r * 299 + g * 587 + b * 114) / 1e3;
163
161
  };
164
- var isDark = (color) => (theme, colorMode) => {
162
+ var isTone = (color) => (theme, colorMode) => {
165
163
  const raw = getColor(color)(theme, colorMode);
166
- return new import_tinycolor.TinyColor(raw).isDark();
164
+ const brightness = getBrightness(raw);
165
+ const isDark2 = brightness < 128;
166
+ return isDark2 ? "dark" : "light";
167
167
  };
168
+ var isLight = (color) => (theme, colorMode) => isTone(color)(theme, colorMode) === "dark";
169
+ var isDark = (color) => (theme, colorMode) => isTone(color)(theme, colorMode) === "light";
168
170
  // Annotate the CommonJS export names for ESM import in node:
169
171
  0 && (module.exports = {
170
- brightenColor,
171
172
  darkenColor,
172
173
  getColor,
173
174
  isDark,
174
175
  isLight,
176
+ isTone,
175
177
  lightenColor,
176
178
  randomColor,
177
179
  shadeColor,
package/dist/color.mjs CHANGED
@@ -1,16 +1,16 @@
1
1
  import {
2
- brightenColor,
3
2
  darkenColor,
4
3
  getColor,
5
4
  isDark,
6
5
  isLight,
6
+ isTone,
7
7
  lightenColor,
8
8
  randomColor,
9
9
  shadeColor,
10
10
  tintColor,
11
11
  toneColor,
12
12
  transparentizeColor
13
- } from "./chunk-A6J4FUU7.mjs";
13
+ } from "./chunk-VPOQGCMS.mjs";
14
14
  import "./chunk-SLJ4M7XC.mjs";
15
15
  import "./chunk-VYMGBE25.mjs";
16
16
  import "./chunk-BZAW2D6U.mjs";
@@ -20,11 +20,11 @@ import "./chunk-R5OUKGQ5.mjs";
20
20
  import "./chunk-FW7XS4NH.mjs";
21
21
  import "./chunk-PF7LRFIA.mjs";
22
22
  export {
23
- brightenColor,
24
23
  darkenColor,
25
24
  getColor,
26
25
  isDark,
27
26
  isLight,
27
+ isTone,
28
28
  lightenColor,
29
29
  randomColor,
30
30
  shadeColor,
package/dist/function.mjs CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  handlerAll,
4
4
  noop,
5
5
  runIfFunc
6
- } from "./chunk-A6J4FUU7.mjs";
6
+ } from "./chunk-VPOQGCMS.mjs";
7
7
  import "./chunk-SLJ4M7XC.mjs";
8
8
  import "./chunk-VYMGBE25.mjs";
9
9
  import "./chunk-BZAW2D6U.mjs";
package/dist/index.d.ts CHANGED
@@ -2,13 +2,12 @@ export { Dict, DynamicRecord, Length, Path, StringLiteral, Union } from './index
2
2
  export { cast, isArray, isEmpty, isFunction, isNotNumber, isNull, isNumber, isNumeric, isObject, isString, isUndefined, isUnit } from './assertion.js';
3
3
  export { assignAfter, filterObject, filterUndefined, flattenObject, getMemoizedObject, getObject, keysFormObject, memoizeObject, merge, objectFromEntries, omitObject, pickObject, replaceObject, splitObject } from './object.js';
4
4
  export { funcAll, handlerAll, noop, runIfFunc } from './function.js';
5
- export { DOMAttributes, MaybeRenderProp, PropGetter, RequiredPropGetter, assignRef, createContext, cx, findChildren, getValidChildren, includesChildren, isRefObject, isValidElement, mergeRefs, omitChildren, pickChildren, useCallbackRef, useIsMounted, useMergeRefs, useSafeLayoutEffect, useUnmountEffect, useUpdateEffect } from './react.js';
5
+ export { AsyncFnReturn, AsyncState, AsyncStateRetry, DOMAttributes, FunctionReturningPromise, MaybeRenderProp, PromiseType, PropGetter, RequiredPropGetter, assignRef, createContext, cx, findChildren, getValidChildren, includesChildren, isRefObject, isValidElement, mergeRefs, omitChildren, pickChildren, useAsync, useAsyncFunc, useAsyncRetry, useCallbackRef, useIsMounted, useMergeRefs, useSafeLayoutEffect, useUnmountEffect, useUpdateEffect } from './react.js';
6
6
  export { FocusableElement, ariaAttr, createdDom, dataAttr, getActiveElement, getAllFocusable, getEventRelatedTarget, getOwnerDocument, getOwnerWindow, getPlatform, hasNegativeTabIndex, hasTabIndex, isActiveElement, isApple, isContains, isContentEditable, isDisabled, isElement, isFocusable, isHTMLElement, isHidden, isMac, isSafari, isTabbable, platform, vendor } from './dom.js';
7
7
  export { escape } from './string.js';
8
8
  export { Operand, calc } from './calc.js';
9
- export { brightenColor, darkenColor, getColor, isDark, isLight, lightenColor, randomColor, shadeColor, tintColor, toneColor, transparentizeColor } from './color.js';
9
+ export { darkenColor, getColor, isDark, isLight, isTone, lightenColor, randomColor, shadeColor, tintColor, toneColor, transparentizeColor } from './color.js';
10
10
  export { filterEmpty } from './array.js';
11
11
  export { clampNumber, countDecimal, percentToValue, roundNumberToStep, toPrecision, valueToPercent } from './number.js';
12
12
  export { AnyPointerEvent, MixedEventListener, Point, PointType, PointerEventInfo, addDomEvent, addPointerEvent, getEventPoint, getEventWindow, isMouseEvent, isMultiTouchEvent, isTouchEvent, pointFromMouse, pointFromTouch } from './event.js';
13
13
  import 'react';
14
- import '@ctrl/tinycolor';
package/dist/index.js CHANGED
@@ -35,7 +35,6 @@ __export(src_exports, {
35
35
  ariaAttr: () => ariaAttr,
36
36
  assignAfter: () => assignAfter,
37
37
  assignRef: () => assignRef,
38
- brightenColor: () => brightenColor,
39
38
  calc: () => calc,
40
39
  cast: () => cast,
41
40
  clampNumber: () => clampNumber,
@@ -94,6 +93,7 @@ __export(src_exports, {
94
93
  isSafari: () => isSafari,
95
94
  isString: () => isString,
96
95
  isTabbable: () => isTabbable,
96
+ isTone: () => isTone,
97
97
  isTouchEvent: () => isTouchEvent,
98
98
  isUndefined: () => isUndefined,
99
99
  isUnit: () => isUnit,
@@ -123,6 +123,9 @@ __export(src_exports, {
123
123
  toPrecision: () => toPrecision,
124
124
  toneColor: () => toneColor,
125
125
  transparentizeColor: () => transparentizeColor,
126
+ useAsync: () => useAsync,
127
+ useAsyncFunc: () => useAsyncFunc,
128
+ useAsyncRetry: () => useAsyncRetry,
126
129
  useCallbackRef: () => useCallbackRef,
127
130
  useIsMounted: () => useIsMounted,
128
131
  useMergeRefs: () => useMergeRefs,
@@ -392,6 +395,48 @@ var useUpdateEffect = (callback, deps) => {
392
395
  };
393
396
  }, []);
394
397
  };
398
+ var useAsync = (func, deps = []) => {
399
+ const [state, callback] = useAsyncFunc(func, deps, { loading: true });
400
+ React.useEffect(() => {
401
+ callback();
402
+ }, [callback]);
403
+ return state;
404
+ };
405
+ var useAsyncFunc = (func, deps = [], initialState = { loading: false }) => {
406
+ const lastCallId = React.useRef(0);
407
+ const isMounted = useIsMounted();
408
+ const [state, setState] = React.useState(initialState);
409
+ const callback = React.useCallback((...args) => {
410
+ const callId = ++lastCallId.current;
411
+ if (!state.loading) {
412
+ setState((prevState) => ({ ...prevState, loading: true }));
413
+ }
414
+ return func(...args).then(
415
+ (value) => {
416
+ if (isMounted.current && callId === lastCallId.current)
417
+ setState({ value, loading: false });
418
+ return value;
419
+ },
420
+ (error) => {
421
+ if (isMounted.current && callId === lastCallId.current)
422
+ setState({ error, loading: false });
423
+ return error;
424
+ }
425
+ );
426
+ }, deps);
427
+ return [state, callback];
428
+ };
429
+ var useAsyncRetry = (func, deps = []) => {
430
+ const [attempt, setAttempt] = React.useState(0);
431
+ const state = useAsync(func, [...deps, attempt]);
432
+ const stateLoading = state.loading;
433
+ const retry = React.useCallback(() => {
434
+ if (stateLoading)
435
+ return;
436
+ setAttempt((currentAttempt) => currentAttempt + 1);
437
+ }, [...deps, stateLoading]);
438
+ return { ...state, retry };
439
+ };
395
440
 
396
441
  // src/dom.ts
397
442
  var createdDom = () => !!(typeof window !== "undefined" && window.document && window.document.createElement);
@@ -518,45 +563,43 @@ var calc = Object.assign(
518
563
  );
519
564
 
520
565
  // src/color.ts
521
- var import_tinycolor = require("@ctrl/tinycolor");
566
+ var import_color2k = require("color2k");
522
567
  var getColor = (color, fallback) => (theme, colorMode) => {
523
568
  const hex = getMemoizedObject(
524
569
  theme,
525
570
  `colors.${color}`,
526
571
  color
527
572
  );
528
- if (isArray(hex)) {
529
- const [lightHex, darkHex] = hex;
530
- const { isValid, originalInput } = new import_tinycolor.TinyColor(colorMode !== "dark" ? lightHex : darkHex);
531
- return isValid ? originalInput : fallback;
532
- } else {
533
- const { isValid, originalInput } = new import_tinycolor.TinyColor(hex);
534
- return isValid ? originalInput : fallback;
573
+ try {
574
+ if (isArray(hex)) {
575
+ const [lightHex, darkHex] = hex;
576
+ return (0, import_color2k.toHex)(String(colorMode !== "dark" ? lightHex : darkHex));
577
+ } else {
578
+ return (0, import_color2k.toHex)(String(hex));
579
+ }
580
+ } catch {
581
+ return fallback != null ? fallback : "#000000";
535
582
  }
536
583
  };
537
584
  var lightenColor = (color, amount) => (theme, colorMode) => {
538
585
  const raw = getColor(color)(theme, colorMode);
539
- return new import_tinycolor.TinyColor(raw).lighten(amount).toRgbString();
586
+ return (0, import_color2k.toHex)((0, import_color2k.lighten)(raw, amount / 100));
540
587
  };
541
588
  var darkenColor = (color, amount) => (theme, colorMode) => {
542
589
  const raw = getColor(color)(theme, colorMode);
543
- return new import_tinycolor.TinyColor(raw).darken(amount).toRgbString();
544
- };
545
- var brightenColor = (color, amount) => (theme, colorMode) => {
546
- const raw = getColor(color)(theme, colorMode);
547
- return new import_tinycolor.TinyColor(raw).brighten(amount).toRgbString();
590
+ return (0, import_color2k.toHex)((0, import_color2k.darken)(raw, amount / 100));
548
591
  };
549
592
  var tintColor = (color, amount) => (theme, colorMode) => {
550
593
  const raw = getColor(color)(theme, colorMode);
551
- return new import_tinycolor.TinyColor(raw).tint(amount).toRgbString();
594
+ return (0, import_color2k.toHex)((0, import_color2k.mix)(raw, "#fff", amount));
552
595
  };
553
596
  var shadeColor = (color, amount) => (theme, colorMode) => {
554
597
  const raw = getColor(color)(theme, colorMode);
555
- return new import_tinycolor.TinyColor(raw).shade(amount).toRgbString();
598
+ return (0, import_color2k.toHex)((0, import_color2k.mix)(raw, "#000", amount / 100));
556
599
  };
557
600
  var transparentizeColor = (color, alpha) => (theme, colorMode) => {
558
601
  const raw = getColor(color)(theme, colorMode);
559
- return new import_tinycolor.TinyColor(raw).setAlpha(alpha).toRgbString();
602
+ return (0, import_color2k.transparentize)(raw, 1 - alpha);
560
603
  };
561
604
  var toneColor = (color, l) => (theme, colorMode) => {
562
605
  const raw = getColor(color)(theme, colorMode);
@@ -568,7 +611,7 @@ var toneColor = (color, l) => (theme, colorMode) => {
568
611
  n *= -1;
569
612
  if (n !== 0)
570
613
  n = n - 5 * (isLighten ? 1 : -1);
571
- return new import_tinycolor.TinyColor(raw)[isLighten ? "lighten" : "shade"](n).toString();
614
+ return (0, import_color2k.toHex)(isLighten ? (0, import_color2k.lighten)(raw, n / 100) : (0, import_color2k.mix)(raw, "#000", n / 100));
572
615
  };
573
616
  var randomColor = ({ string, colors } = {}) => {
574
617
  const fallback = randomHex();
@@ -608,14 +651,18 @@ var randomColorFromList = (str, list) => {
608
651
  return list[index];
609
652
  };
610
653
  var randomFromList = (list) => list[Math.floor(Math.random() * list.length)];
611
- var isLight = (color) => (theme, colorMode) => {
612
- const raw = getColor(color)(theme, colorMode);
613
- return new import_tinycolor.TinyColor(raw).isLight();
654
+ var getBrightness = (color) => {
655
+ const [r, g, b] = (0, import_color2k.parseToRgba)(color);
656
+ return (r * 299 + g * 587 + b * 114) / 1e3;
614
657
  };
615
- var isDark = (color) => (theme, colorMode) => {
658
+ var isTone = (color) => (theme, colorMode) => {
616
659
  const raw = getColor(color)(theme, colorMode);
617
- return new import_tinycolor.TinyColor(raw).isDark();
660
+ const brightness = getBrightness(raw);
661
+ const isDark2 = brightness < 128;
662
+ return isDark2 ? "dark" : "light";
618
663
  };
664
+ var isLight = (color) => (theme, colorMode) => isTone(color)(theme, colorMode) === "dark";
665
+ var isDark = (color) => (theme, colorMode) => isTone(color)(theme, colorMode) === "light";
619
666
 
620
667
  // src/array.ts
621
668
  var filterEmpty = (array) => array.filter((value) => value != null);
@@ -697,7 +744,6 @@ var addPointerEvent = (target, type, cb, options) => addDomEvent(target, type, w
697
744
  ariaAttr,
698
745
  assignAfter,
699
746
  assignRef,
700
- brightenColor,
701
747
  calc,
702
748
  cast,
703
749
  clampNumber,
@@ -756,6 +802,7 @@ var addPointerEvent = (target, type, cb, options) => addDomEvent(target, type, w
756
802
  isSafari,
757
803
  isString,
758
804
  isTabbable,
805
+ isTone,
759
806
  isTouchEvent,
760
807
  isUndefined,
761
808
  isUnit,
@@ -785,6 +832,9 @@ var addPointerEvent = (target, type, cb, options) => addDomEvent(target, type, w
785
832
  toPrecision,
786
833
  toneColor,
787
834
  transparentizeColor,
835
+ useAsync,
836
+ useAsyncFunc,
837
+ useAsyncRetry,
788
838
  useCallbackRef,
789
839
  useIsMounted,
790
840
  useMergeRefs,
package/dist/index.mjs CHANGED
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  assignAfter,
3
3
  assignRef,
4
- brightenColor,
5
4
  createContext,
6
5
  cx,
7
6
  darkenColor,
@@ -19,6 +18,7 @@ import {
19
18
  isDark,
20
19
  isLight,
21
20
  isRefObject,
21
+ isTone,
22
22
  isValidElement,
23
23
  keysFormObject,
24
24
  lightenColor,
@@ -39,13 +39,16 @@ import {
39
39
  tintColor,
40
40
  toneColor,
41
41
  transparentizeColor,
42
+ useAsync,
43
+ useAsyncFunc,
44
+ useAsyncRetry,
42
45
  useCallbackRef,
43
46
  useIsMounted,
44
47
  useMergeRefs,
45
48
  useSafeLayoutEffect,
46
49
  useUnmountEffect,
47
50
  useUpdateEffect
48
- } from "./chunk-A6J4FUU7.mjs";
51
+ } from "./chunk-VPOQGCMS.mjs";
49
52
  import "./chunk-SLJ4M7XC.mjs";
50
53
  import {
51
54
  clampNumber,
@@ -122,7 +125,6 @@ export {
122
125
  ariaAttr,
123
126
  assignAfter,
124
127
  assignRef,
125
- brightenColor,
126
128
  calc,
127
129
  cast,
128
130
  clampNumber,
@@ -181,6 +183,7 @@ export {
181
183
  isSafari,
182
184
  isString,
183
185
  isTabbable,
186
+ isTone,
184
187
  isTouchEvent,
185
188
  isUndefined,
186
189
  isUnit,
@@ -210,6 +213,9 @@ export {
210
213
  toPrecision,
211
214
  toneColor,
212
215
  transparentizeColor,
216
+ useAsync,
217
+ useAsyncFunc,
218
+ useAsyncRetry,
213
219
  useCallbackRef,
214
220
  useIsMounted,
215
221
  useMergeRefs,
package/dist/object.d.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import { Dict } from './index.types.js';
2
2
 
3
- declare const omitObject: <T extends Dict<any>, K extends keyof T>(obj: T, keys: K[]) => Omit<T, K>;
4
- declare const pickObject: <T extends Dict<any>, K extends keyof T>(obj: T, keys: K[]) => { [P in K]: T[P]; };
5
- declare const splitObject: <T extends Dict<any>, K extends keyof T>(obj: T, keys: K[]) => [{ [P in K]: T[P]; }, Omit<T, K>];
6
- declare const filterObject: <T extends Dict<any>, K extends Dict<any>>(obj: T, func: (key: keyof T, value: T[keyof T], obj: T) => boolean) => K;
7
- declare const filterUndefined: <T extends Dict<any>>(obj: T) => T;
8
- declare const merge: <T extends Dict<any>>(target: any, source: any, overrideArray?: boolean) => T;
9
- declare const flattenObject: <T extends Dict<any>>(obj: any, maxDepth?: number) => T;
10
- declare const objectFromEntries: <T extends Dict<any>>(entries: any[][]) => T;
11
- declare const keysFormObject: <T extends Dict<any>>(obj: T) => (keyof T)[];
3
+ declare const omitObject: <T extends Dict, K extends keyof T>(obj: T, keys: K[]) => Omit<T, K>;
4
+ declare const pickObject: <T extends Dict, K extends keyof T>(obj: T, keys: K[]) => { [P in K]: T[P]; };
5
+ declare const splitObject: <T extends Dict, K extends keyof T>(obj: T, keys: K[]) => [{ [P in K]: T[P]; }, Omit<T, K>];
6
+ declare const filterObject: <T extends Dict, K extends Dict>(obj: T, func: (key: keyof T, value: T[keyof T], obj: T) => boolean) => K;
7
+ declare const filterUndefined: <T extends Dict>(obj: T) => T;
8
+ declare const merge: <T extends Dict>(target: any, source: any, overrideArray?: boolean) => T;
9
+ declare const flattenObject: <T extends Dict>(obj: any, maxDepth?: number) => T;
10
+ declare const objectFromEntries: <T extends Dict>(entries: any[][]) => T;
11
+ declare const keysFormObject: <T extends Dict>(obj: T) => (keyof T)[];
12
12
  declare const replaceObject: <T extends unknown>(objOrArray: T, callBack: (value: any) => any) => T;
13
13
  declare const getObject: (obj: Dict, path: string | number, fallback?: any, i?: number) => any;
14
14
  declare const memoizeObject: (func: typeof getObject) => (obj: Dict, path: string | number, fallback?: any, i?: number) => any;
package/dist/object.mjs CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  pickObject,
14
14
  replaceObject,
15
15
  splitObject
16
- } from "./chunk-A6J4FUU7.mjs";
16
+ } from "./chunk-VPOQGCMS.mjs";
17
17
  import "./chunk-SLJ4M7XC.mjs";
18
18
  import "./chunk-VYMGBE25.mjs";
19
19
  import "./chunk-BZAW2D6U.mjs";
package/dist/react.d.ts CHANGED
@@ -40,5 +40,55 @@ declare const mergeRefs: <T extends unknown = any>(...refs: (ReactRef<T> | undef
40
40
  declare const useMergeRefs: <T extends unknown = any>(...refs: (ReactRef<T> | undefined)[]) => (node: T | null) => void;
41
41
  declare const useCallbackRef: <T extends (...args: any[]) => any>(callback: T | undefined, deps?: React.DependencyList) => T;
42
42
  declare const useUpdateEffect: (callback: React.EffectCallback, deps: React.DependencyList) => void;
43
+ type FunctionReturningPromise = (...args: any[]) => Promise<any>;
44
+ declare const useAsync: <T extends FunctionReturningPromise>(func: T, deps?: React.DependencyList) => StateFromFunctionReturningPromise<T>;
45
+ type AsyncState<T> = {
46
+ loading: boolean;
47
+ error?: undefined;
48
+ value?: undefined;
49
+ } | {
50
+ loading: true;
51
+ error?: Error | undefined;
52
+ value?: T;
53
+ } | {
54
+ loading: false;
55
+ error: Error;
56
+ value?: undefined;
57
+ } | {
58
+ loading: false;
59
+ error?: undefined;
60
+ value: T;
61
+ };
62
+ type PromiseType<P extends Promise<any>> = P extends Promise<infer T> ? T : never;
63
+ type StateFromFunctionReturningPromise<T extends FunctionReturningPromise> = AsyncState<PromiseType<ReturnType<T>>>;
64
+ type AsyncFnReturn<T extends FunctionReturningPromise = FunctionReturningPromise> = [
65
+ StateFromFunctionReturningPromise<T>,
66
+ T
67
+ ];
68
+ declare const useAsyncFunc: <T extends FunctionReturningPromise>(func: T, deps?: React.DependencyList, initialState?: StateFromFunctionReturningPromise<T>) => AsyncFnReturn<T>;
69
+ type AsyncStateRetry<T> = AsyncState<T> & {
70
+ retry(): void;
71
+ };
72
+ declare const useAsyncRetry: <T>(func: () => Promise<T>, deps?: React.DependencyList) => {
73
+ retry: () => void;
74
+ loading: boolean;
75
+ error?: undefined;
76
+ value?: undefined;
77
+ } | {
78
+ retry: () => void;
79
+ loading: false;
80
+ error: Error;
81
+ value?: undefined;
82
+ } | {
83
+ retry: () => void;
84
+ loading: true;
85
+ error?: Error | undefined;
86
+ value?: T | undefined;
87
+ } | {
88
+ retry: () => void;
89
+ loading: false;
90
+ error?: undefined;
91
+ value: T;
92
+ };
43
93
 
44
- export { DOMAttributes, MaybeRenderProp, PropGetter, RequiredPropGetter, assignRef, createContext, cx, findChildren, getValidChildren, includesChildren, isRefObject, isValidElement, mergeRefs, omitChildren, pickChildren, useCallbackRef, useIsMounted, useMergeRefs, useSafeLayoutEffect, useUnmountEffect, useUpdateEffect };
94
+ export { AsyncFnReturn, AsyncState, AsyncStateRetry, DOMAttributes, FunctionReturningPromise, MaybeRenderProp, PromiseType, PropGetter, RequiredPropGetter, assignRef, createContext, cx, findChildren, getValidChildren, includesChildren, isRefObject, isValidElement, mergeRefs, omitChildren, pickChildren, useAsync, useAsyncFunc, useAsyncRetry, useCallbackRef, useIsMounted, useMergeRefs, useSafeLayoutEffect, useUnmountEffect, useUpdateEffect };
package/dist/react.js CHANGED
@@ -41,6 +41,9 @@ __export(react_exports, {
41
41
  mergeRefs: () => mergeRefs,
42
42
  omitChildren: () => omitChildren,
43
43
  pickChildren: () => pickChildren,
44
+ useAsync: () => useAsync,
45
+ useAsyncFunc: () => useAsyncFunc,
46
+ useAsyncRetry: () => useAsyncRetry,
44
47
  useCallbackRef: () => useCallbackRef,
45
48
  useIsMounted: () => useIsMounted,
46
49
  useMergeRefs: () => useMergeRefs,
@@ -154,6 +157,48 @@ var useUpdateEffect = (callback, deps) => {
154
157
  };
155
158
  }, []);
156
159
  };
160
+ var useAsync = (func, deps = []) => {
161
+ const [state, callback] = useAsyncFunc(func, deps, { loading: true });
162
+ React.useEffect(() => {
163
+ callback();
164
+ }, [callback]);
165
+ return state;
166
+ };
167
+ var useAsyncFunc = (func, deps = [], initialState = { loading: false }) => {
168
+ const lastCallId = React.useRef(0);
169
+ const isMounted = useIsMounted();
170
+ const [state, setState] = React.useState(initialState);
171
+ const callback = React.useCallback((...args) => {
172
+ const callId = ++lastCallId.current;
173
+ if (!state.loading) {
174
+ setState((prevState) => ({ ...prevState, loading: true }));
175
+ }
176
+ return func(...args).then(
177
+ (value) => {
178
+ if (isMounted.current && callId === lastCallId.current)
179
+ setState({ value, loading: false });
180
+ return value;
181
+ },
182
+ (error) => {
183
+ if (isMounted.current && callId === lastCallId.current)
184
+ setState({ error, loading: false });
185
+ return error;
186
+ }
187
+ );
188
+ }, deps);
189
+ return [state, callback];
190
+ };
191
+ var useAsyncRetry = (func, deps = []) => {
192
+ const [attempt, setAttempt] = React.useState(0);
193
+ const state = useAsync(func, [...deps, attempt]);
194
+ const stateLoading = state.loading;
195
+ const retry = React.useCallback(() => {
196
+ if (stateLoading)
197
+ return;
198
+ setAttempt((currentAttempt) => currentAttempt + 1);
199
+ }, [...deps, stateLoading]);
200
+ return { ...state, retry };
201
+ };
157
202
  // Annotate the CommonJS export names for ESM import in node:
158
203
  0 && (module.exports = {
159
204
  assignRef,
@@ -167,6 +212,9 @@ var useUpdateEffect = (callback, deps) => {
167
212
  mergeRefs,
168
213
  omitChildren,
169
214
  pickChildren,
215
+ useAsync,
216
+ useAsyncFunc,
217
+ useAsyncRetry,
170
218
  useCallbackRef,
171
219
  useIsMounted,
172
220
  useMergeRefs,
package/dist/react.mjs CHANGED
@@ -10,13 +10,16 @@ import {
10
10
  mergeRefs,
11
11
  omitChildren,
12
12
  pickChildren,
13
+ useAsync,
14
+ useAsyncFunc,
15
+ useAsyncRetry,
13
16
  useCallbackRef,
14
17
  useIsMounted,
15
18
  useMergeRefs,
16
19
  useSafeLayoutEffect,
17
20
  useUnmountEffect,
18
21
  useUpdateEffect
19
- } from "./chunk-A6J4FUU7.mjs";
22
+ } from "./chunk-VPOQGCMS.mjs";
20
23
  import "./chunk-SLJ4M7XC.mjs";
21
24
  import "./chunk-VYMGBE25.mjs";
22
25
  import "./chunk-BZAW2D6U.mjs";
@@ -37,6 +40,9 @@ export {
37
40
  mergeRefs,
38
41
  omitChildren,
39
42
  pickChildren,
43
+ useAsync,
44
+ useAsyncFunc,
45
+ useAsyncRetry,
40
46
  useCallbackRef,
41
47
  useIsMounted,
42
48
  useMergeRefs,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yamada-ui/utils",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Yamada UI utils",
5
5
  "keywords": [
6
6
  "utils",
@@ -28,11 +28,11 @@
28
28
  "url": "https://github.com/hirotomoyamada/yamada-ui/issues"
29
29
  },
30
30
  "dependencies": {
31
- "@ctrl/tinycolor": "^3.4.1"
31
+ "color2k": "^2.0.2"
32
32
  },
33
33
  "devDependencies": {
34
- "react": "^18.0.0",
35
- "clean-package": "2.2.0"
34
+ "clean-package": "2.2.0",
35
+ "react": "^18.0.0"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": ">=18"