@basiln/utils 0.1.10 → 0.1.12

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 (77) hide show
  1. package/README.md +1 -0
  2. package/dist/Choose.js.map +1 -1
  3. package/dist/Choose.mjs +1 -1
  4. package/dist/Flex.js +13 -13
  5. package/dist/Flex.js.map +1 -1
  6. package/dist/Flex.mjs +1 -1
  7. package/dist/Format.js +19 -1
  8. package/dist/Format.js.map +1 -1
  9. package/dist/Format.mjs +1 -1
  10. package/dist/SafeArea.js +12 -2
  11. package/dist/SafeArea.js.map +1 -1
  12. package/dist/SafeArea.mjs +2 -2
  13. package/dist/Spacing.js +12 -2
  14. package/dist/Spacing.js.map +1 -1
  15. package/dist/Spacing.mjs +1 -1
  16. package/dist/Validate.js.map +1 -1
  17. package/dist/Validate.mjs +1 -1
  18. package/dist/{chunk-R23KSR7N.mjs → chunk-5MSITYTP.mjs} +1 -1
  19. package/dist/{chunk-R23KSR7N.mjs.map → chunk-5MSITYTP.mjs.map} +1 -1
  20. package/dist/{chunk-FTMJVXXH.mjs → chunk-5OCEFCYV.mjs} +2 -2
  21. package/dist/chunk-5OCEFCYV.mjs.map +1 -0
  22. package/dist/{chunk-RASCHI5T.mjs → chunk-75ILZSEA.mjs} +3 -5
  23. package/dist/chunk-75ILZSEA.mjs.map +1 -0
  24. package/dist/{chunk-OLYZDPI3.mjs → chunk-ASHPZIPG.mjs} +20 -2
  25. package/dist/chunk-ASHPZIPG.mjs.map +1 -0
  26. package/dist/{chunk-EB5LTJRH.mjs → chunk-ASPAKWHO.mjs} +2 -2
  27. package/dist/{chunk-EB5LTJRH.mjs.map → chunk-ASPAKWHO.mjs.map} +1 -1
  28. package/dist/{chunk-3BSCIHE2.mjs → chunk-FEPXSL77.mjs} +4 -11
  29. package/dist/chunk-FEPXSL77.mjs.map +1 -0
  30. package/dist/{chunk-QD5QDTUG.mjs → chunk-HCRCYF7A.mjs} +1 -1
  31. package/dist/chunk-HCRCYF7A.mjs.map +1 -0
  32. package/dist/{chunk-KIUJWSBE.mjs → chunk-JTQFGEBG.mjs} +2 -4
  33. package/dist/chunk-JTQFGEBG.mjs.map +1 -0
  34. package/dist/{chunk-KMMS4XJ6.mjs → chunk-K7254VDU.mjs} +1 -1
  35. package/dist/{chunk-KMMS4XJ6.mjs.map → chunk-K7254VDU.mjs.map} +1 -1
  36. package/dist/{chunk-7WNTKDNW.mjs → chunk-KFMJD3YK.mjs} +1 -1
  37. package/dist/chunk-KFMJD3YK.mjs.map +1 -0
  38. package/dist/{chunk-UCZMT7TP.mjs → chunk-QKAXJVK7.mjs} +3 -13
  39. package/dist/chunk-QKAXJVK7.mjs.map +1 -0
  40. package/dist/{chunk-Z7YV6A56.mjs → chunk-RQ2CQOT7.mjs} +2 -6
  41. package/dist/chunk-RQ2CQOT7.mjs.map +1 -0
  42. package/dist/{chunk-VIGWO4EN.mjs → chunk-YQMA54XQ.mjs} +2 -2
  43. package/dist/chunk-YQMA54XQ.mjs.map +1 -0
  44. package/dist/composeEventHandlers.js.map +1 -1
  45. package/dist/composeEventHandlers.mjs +1 -1
  46. package/dist/createContext.js +3 -10
  47. package/dist/createContext.js.map +1 -1
  48. package/dist/createContext.mjs +1 -1
  49. package/dist/ellipsis.js +3 -3
  50. package/dist/ellipsis.js.map +1 -1
  51. package/dist/ellipsis.mjs +1 -1
  52. package/dist/hasBatchim.js.map +1 -1
  53. package/dist/hasBatchim.mjs +1 -1
  54. package/dist/hexToRgba.js +1 -3
  55. package/dist/hexToRgba.js.map +1 -1
  56. package/dist/hexToRgba.mjs +1 -1
  57. package/dist/index.d.mts +11 -6
  58. package/dist/index.d.ts +11 -6
  59. package/dist/index.js +45 -50
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.mjs +13 -13
  62. package/dist/josa.js.map +1 -1
  63. package/dist/josa.mjs +2 -2
  64. package/dist/queryString.js +1 -5
  65. package/dist/queryString.js.map +1 -1
  66. package/dist/queryString.mjs +1 -1
  67. package/package.json +6 -4
  68. package/dist/chunk-3BSCIHE2.mjs.map +0 -1
  69. package/dist/chunk-7WNTKDNW.mjs.map +0 -1
  70. package/dist/chunk-FTMJVXXH.mjs.map +0 -1
  71. package/dist/chunk-KIUJWSBE.mjs.map +0 -1
  72. package/dist/chunk-OLYZDPI3.mjs.map +0 -1
  73. package/dist/chunk-QD5QDTUG.mjs.map +0 -1
  74. package/dist/chunk-RASCHI5T.mjs.map +0 -1
  75. package/dist/chunk-UCZMT7TP.mjs.map +0 -1
  76. package/dist/chunk-VIGWO4EN.mjs.map +0 -1
  77. package/dist/chunk-Z7YV6A56.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Flex.tsx"],"sourcesContent":["import { memo, type CSSProperties, type HTMLAttributes } from 'react';\nimport styled from '@emotion/styled';\n\nimport { coerceCssPixelValue, type CSSPixelValue } from './coerceCssPixelValue';\n\ntype Justify = CSSProperties['justifyContent'];\ntype Align = CSSProperties['alignItems'];\ntype Direction = CSSProperties['flexDirection'];\n\nexport type FlexProps = HTMLAttributes<HTMLDivElement> & {\n gap?: CSSPixelValue;\n justify?: Justify;\n align?: Align;\n direction?: Direction;\n};\n\nexport const Flex = memo(function Flex(props: FlexProps) {\n const {\n gap = 0,\n justify = 'center',\n align = 'center',\n direction = 'row',\n children,\n ...restProps\n } = props;\n\n return (\n <Container $gap={gap} $justify={justify} $align={align} $direction={direction} {...restProps}>\n {children}\n </Container>\n );\n});\n\nexport const Container = styled.div<{\n $gap: CSSPixelValue;\n $justify: Justify;\n $align: Align;\n $direction: Direction;\n}>`\n display: flex;\n flex-direction: ${({ $direction }) => $direction};\n gap: ${({ $gap }) => coerceCssPixelValue($gap)};\n align-items: ${({ $align }) => $align};\n justify-content: ${({ $justify }) => $justify};\n`;\n"],"mappings":";;;;;AAAA,SAAS,YAAqD;AAC9D,OAAO,YAAY;AA0Bf;AAXG,IAAM,OAAO,KAAK,SAASA,MAAK,OAAkB;AACvD,QAAM;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,SACE,oBAAC,aAAU,MAAM,KAAK,UAAU,SAAS,QAAQ,OAAO,YAAY,WAAY,GAAG,WAChF,UACH;AAEJ,CAAC;AAEM,IAAM,YAAY,OAAO;AAAA;AAAA,oBAOZ,CAAC,EAAE,WAAW,MAAM,UAAU;AAAA,SACzC,CAAC,EAAE,KAAK,MAAM,oBAAoB,IAAI,CAAC;AAAA,iBAC/B,CAAC,EAAE,OAAO,MAAM,MAAM;AAAA,qBAClB,CAAC,EAAE,SAAS,MAAM,QAAQ;AAAA;","names":["Flex"]}
@@ -43,11 +43,7 @@ function getQueryString(name, parser) {
43
43
  return parser(value);
44
44
  }
45
45
  }
46
- function setQueryString({
47
- qs,
48
- key,
49
- value
50
- }) {
46
+ function setQueryString({ qs, key, value }) {
51
47
  const parsed = parseQueryString(qs);
52
48
  return createQueryString({
53
49
  ...parsed,
@@ -64,4 +60,4 @@ var queryString = {
64
60
  export {
65
61
  queryString
66
62
  };
67
- //# sourceMappingURL=chunk-Z7YV6A56.mjs.map
63
+ //# sourceMappingURL=chunk-RQ2CQOT7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/queryString.ts"],"sourcesContent":["/**\n * @description 쿼리 스트링을 생성합니다.\n * @example createSearchParamString({ a: 1, b: 2, c: 3 }) // 'a=1&b=2&c=3'\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createSearchParamString(params: Record<string, any>) {\n return (\n new URLSearchParams(\n Object.entries(params)\n .filter(([, value]) => value != null)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return value.map((x) => [key, x]);\n }\n return [[key, value]];\n })\n .flat()\n )\n .toString()\n // Convert space characters to '%20' according to RFC3986 spec, from RFC1738.\n .replace(/\\+/g, '%20')\n );\n}\n\n/**\n * @description 물음표를 포함한 쿼리 스트링을 생성합니다.\n * @example createQueryString({ a: 1, b: 2, c: 3 }) // '?a=1&b=2&c=3'\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createQueryString(params: Record<string, any>) {\n const queryString = createSearchParamString(params);\n\n if (queryString === '') {\n return '';\n }\n\n return `?${queryString}`;\n}\n\n/**\n * @description 이터러블에서 키와 값을 가진 객체로 변환합니다.\n * @example fromEntries([['a', 1], ['b', 2], ['c', 3]]) // { a: 1, b: 2, c: 3 }\n */\nfunction fromEntries<T extends readonly [string | number, unknown]>(iterable: Iterable<T>) {\n const result: Record<string | number | symbol, T[1]> = {};\n\n for (const [key, value] of Array.from(iterable)) {\n if (result[key]) {\n if (Array.isArray(result[key])) {\n (result[key] as Array<string | number>).push(value as string | number);\n } else {\n result[key] = [result[key], value];\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * @description 쿼리 스트링을 객체로 변환합니다.\n * @example parseQueryString('?a=1&b=2&c=3') // { a: '1', b: '2', c: '3' }\n */\nfunction parseQueryString<Result = Record<string, string>>(\n queryString: string = typeof location !== 'undefined' ? location.search : ''\n): Result {\n const query = queryString.trim().replace(/^[?#&]/, '');\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return fromEntries(new URLSearchParams(query)) as any;\n}\n\n/**\n * @description 쿼리 스트링에서 특정 키의 값을 가져옵니다.\n *\n * @param name 가져올 쿼리 스트링의 키\n * @param parser 가져온 값을 파싱할 함수\n * @returns 파싱된 값\n *\n * @example\n * url: 'http://example.com/?a=1'\n * getQueryString('a') // '1'\n * getQueryString('a', parseInt) // 1\n * getQueryString('b') // undefined\n * getQueryString('b', parseInt) // undefined\n */\nfunction getQueryString(name: string): string | undefined;\nfunction getQueryString<T>(name: string, parser: (val: string) => T): T | undefined;\nfunction getQueryString<T = string>(name: string, parser?: (val: string) => T) {\n const value = queryString.parse<{ [name: string]: string | undefined }>()[name];\n\n if (parser == null || value == null) {\n return value;\n } else {\n return parser(value);\n }\n}\n\n/**\n * @description 기존 쿼리 스트링에 새로운 쿼리 스트링을 추가합니다.\n * @example setQueryString({ qs: '?a=1', key: 'b', value: '2' }) // '?a=1&b=2'\n */\nfunction setQueryString({ qs, key, value }: { qs: string; key: string; value: string }) {\n const parsed = parseQueryString(qs);\n\n return createQueryString({\n ...parsed,\n [key]: value,\n });\n}\n\nexport const queryString = {\n create: createQueryString,\n parse: parseQueryString,\n get: getQueryString,\n set: setQueryString,\n};\n"],"mappings":";AAKA,SAAS,wBAAwB,QAA6B;AAC5D,SACE,IAAI;AAAA,IACF,OAAO,QAAQ,MAAM,EAClB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,SAAS,IAAI,EACnC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAAA,MAClC;AACA,aAAO,CAAC,CAAC,KAAK,KAAK,CAAC;AAAA,IACtB,CAAC,EACA,KAAK;AAAA,EACV,EACG,SAAS,EAET,QAAQ,OAAO,KAAK;AAE3B;AAOA,SAAS,kBAAkB,QAA6B;AACtD,QAAMA,eAAc,wBAAwB,MAAM;AAElD,MAAIA,iBAAgB,IAAI;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,IAAIA,YAAW;AACxB;AAMA,SAAS,YAA2D,UAAuB;AACzF,QAAM,SAAiD,CAAC;AAExD,aAAW,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,QAAQ,GAAG;AAC/C,QAAI,OAAO,GAAG,GAAG;AACf,UAAI,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG;AAC9B,QAAC,OAAO,GAAG,EAA6B,KAAK,KAAwB;AAAA,MACvE,OAAO;AACL,eAAO,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,KAAK;AAAA,MACnC;AAAA,IACF,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,iBACPA,eAAsB,OAAO,aAAa,cAAc,SAAS,SAAS,IAClE;AACR,QAAM,QAAQA,aAAY,KAAK,EAAE,QAAQ,UAAU,EAAE;AAGrD,SAAO,YAAY,IAAI,gBAAgB,KAAK,CAAC;AAC/C;AAkBA,SAAS,eAA2B,MAAc,QAA6B;AAC7E,QAAM,QAAQ,YAAY,MAA8C,EAAE,IAAI;AAE9E,MAAI,UAAU,QAAQ,SAAS,MAAM;AACnC,WAAO;AAAA,EACT,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAMA,SAAS,eAAe,EAAE,IAAI,KAAK,MAAM,GAA+C;AACtF,QAAM,SAAS,iBAAiB,EAAE;AAElC,SAAO,kBAAkB;AAAA,IACvB,GAAG;AAAA,IACH,CAAC,GAAG,GAAG;AAAA,EACT,CAAC;AACH;AAEO,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AACP;","names":["queryString"]}
@@ -4,7 +4,7 @@ import {
4
4
 
5
5
  // src/Spacing.tsx
6
6
  import { memo } from "react";
7
- import { styled } from "styled-components";
7
+ import styled from "@emotion/styled";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
  var Spacing = memo(function Spacing2(props) {
10
10
  const { direction = "vertical", size, ...restProps } = props;
@@ -19,4 +19,4 @@ var SpacingContainer = styled.div`
19
19
  export {
20
20
  Spacing
21
21
  };
22
- //# sourceMappingURL=chunk-VIGWO4EN.mjs.map
22
+ //# sourceMappingURL=chunk-YQMA54XQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Spacing.tsx"],"sourcesContent":["import { memo, type HTMLAttributes } from 'react';\nimport styled from '@emotion/styled';\n\nimport { coerceCssPixelValue, type CSSPixelValue } from './coerceCssPixelValue';\n\ntype AxisDirection = 'vertical' | 'horizontal';\n\nexport type SpacingProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n direction?: AxisDirection;\n size: CSSPixelValue;\n};\n\nexport const Spacing = memo(function Spacing(props: SpacingProps) {\n const { direction = 'vertical', size, ...restProps } = props;\n\n return <SpacingContainer $direction={direction} $size={size} {...restProps} />;\n});\n\nconst SpacingContainer = styled.div<{\n $direction: SpacingProps['direction'];\n $size: SpacingProps['size'];\n}>`\n flex: none;\n width: ${({ $direction, $size }) =>\n $direction === 'horizontal' ? coerceCssPixelValue($size) : undefined};\n height: ${({ $direction, $size }) =>\n $direction === 'vertical' ? coerceCssPixelValue($size) : undefined};\n`;\n"],"mappings":";;;;;AAAA,SAAS,YAAiC;AAC1C,OAAO,YAAY;AAcV;AAHF,IAAM,UAAU,KAAK,SAASA,SAAQ,OAAqB;AAChE,QAAM,EAAE,YAAY,YAAY,MAAM,GAAG,UAAU,IAAI;AAEvD,SAAO,oBAAC,oBAAiB,YAAY,WAAW,OAAO,MAAO,GAAG,WAAW;AAC9E,CAAC;AAED,IAAM,mBAAmB,OAAO;AAAA;AAAA,WAKrB,CAAC,EAAE,YAAY,MAAM,MAC5B,eAAe,eAAe,oBAAoB,KAAK,IAAI,MAAS;AAAA,YAC5D,CAAC,EAAE,YAAY,MAAM,MAC7B,eAAe,aAAa,oBAAoB,KAAK,IAAI,MAAS;AAAA;","names":["Spacing"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/composeEventHandlers.ts"],"sourcesContent":["// @see https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\n\nexport function composeEventHandlers<E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {}\n) {\n return function handleEvent(event: E) {\n originalEventHandler?.(event);\n\n if (\n checkForDefaultPrevented === false ||\n !(event as unknown as Event).defaultPrevented\n ) {\n return ourEventHandler?.(event);\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,qBACd,sBACA,iBACA,EAAE,2BAA2B,KAAK,IAAI,CAAC,GACvC;AACA,SAAO,SAAS,YAAY,OAAU;AACpC,2BAAuB,KAAK;AAE5B,QACE,6BAA6B,SAC7B,CAAE,MAA2B,kBAC7B;AACA,aAAO,kBAAkB,KAAK;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/composeEventHandlers.ts"],"sourcesContent":["// @see https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\n\nexport function composeEventHandlers<E>(\n originalEventHandler?: (event: E) => void,\n ourEventHandler?: (event: E) => void,\n { checkForDefaultPrevented = true } = {}\n) {\n return function handleEvent(event: E) {\n originalEventHandler?.(event);\n\n if (checkForDefaultPrevented === false || !(event as unknown as Event).defaultPrevented) {\n return ourEventHandler?.(event);\n }\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,qBACd,sBACA,iBACA,EAAE,2BAA2B,KAAK,IAAI,CAAC,GACvC;AACA,SAAO,SAAS,YAAY,OAAU;AACpC,2BAAuB,KAAK;AAE5B,QAAI,6BAA6B,SAAS,CAAE,MAA2B,kBAAkB;AACvF,aAAO,kBAAkB,KAAK;AAAA,IAChC;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  composeEventHandlers
3
- } from "./chunk-QD5QDTUG.mjs";
3
+ } from "./chunk-HCRCYF7A.mjs";
4
4
  export {
5
5
  composeEventHandlers
6
6
  };
@@ -26,23 +26,16 @@ module.exports = __toCommonJS(createContext_exports);
26
26
  var import_react = require("react");
27
27
  var import_jsx_runtime = require("react/jsx-runtime");
28
28
  function createContext(rootComponentName, defaultContext) {
29
- const Context = (0, import_react.createContext)(
30
- defaultContext
31
- );
29
+ const Context = (0, import_react.createContext)(defaultContext);
32
30
  function Provider(props) {
33
31
  const { children, ...contextValues } = props;
34
- const value = (0, import_react.useMemo)(
35
- () => contextValues,
36
- [contextValues]
37
- );
32
+ const value = (0, import_react.useMemo)(() => contextValues, [contextValues]);
38
33
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Context.Provider, { value, children });
39
34
  }
40
35
  function useContext(consumerName) {
41
36
  const context = (0, import_react.useContext)(Context);
42
37
  if (context == null) {
43
- throw new Error(
44
- `${consumerName}\uC740 ${rootComponentName}\uD558\uC704\uC5D0\uC11C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4.`
45
- );
38
+ throw new Error(`${consumerName}\uC740 ${rootComponentName}\uD558\uC704\uC5D0\uC11C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4.`);
46
39
  }
47
40
  return context;
48
41
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/createContext.tsx"],"sourcesContent":["import {\n useMemo,\n createContext as createContextRaw,\n useContext as useContextRaw,\n type PropsWithChildren,\n} from 'react';\n\nexport function createContext<ContextValueType extends object | null>(\n rootComponentName: string,\n defaultContext?: ContextValueType\n) {\n const Context = createContextRaw<ContextValueType | undefined>(\n defaultContext\n );\n\n function Provider(props: PropsWithChildren<ContextValueType>) {\n const { children, ...contextValues } = props;\n\n const value = useMemo(\n () => contextValues,\n [contextValues]\n ) as ContextValueType;\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n }\n\n function useContext(consumerName: string) {\n const context = useContextRaw(Context);\n if (context == null) {\n throw new Error(\n `${consumerName}은 ${rootComponentName}하위에서 사용해야 합니다.`\n );\n }\n\n return context;\n }\n\n Provider.displayName = `${rootComponentName}Provider`;\n return [Provider, useContext] as const;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKO;AAkBI;AAhBJ,SAAS,cACd,mBACA,gBACA;AACA,QAAM,cAAU,aAAAA;AAAA,IACd;AAAA,EACF;AAEA,WAAS,SAAS,OAA4C;AAC5D,UAAM,EAAE,UAAU,GAAG,cAAc,IAAI;AAEvC,UAAM,YAAQ;AAAA,MACZ,MAAM;AAAA,MACN,CAAC,aAAa;AAAA,IAChB;AAEA,WAAO,4CAAC,QAAQ,UAAR,EAAiB,OAAe,UAAS;AAAA,EACnD;AAEA,WAAS,WAAW,cAAsB;AACxC,UAAM,cAAU,aAAAC,YAAc,OAAO;AACrC,QAAI,WAAW,MAAM;AACnB,YAAM,IAAI;AAAA,QACR,GAAG,YAAY,UAAK,iBAAiB;AAAA,MACvC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,GAAG,iBAAiB;AAC3C,SAAO,CAAC,UAAU,UAAU;AAC9B;","names":["createContextRaw","useContextRaw"]}
1
+ {"version":3,"sources":["../src/createContext.tsx"],"sourcesContent":["import {\n useMemo,\n createContext as createContextRaw,\n useContext as useContextRaw,\n type PropsWithChildren,\n} from 'react';\n\nexport function createContext<ContextValueType extends object | null>(\n rootComponentName: string,\n defaultContext?: ContextValueType\n) {\n const Context = createContextRaw<ContextValueType | undefined>(defaultContext);\n\n function Provider(props: PropsWithChildren<ContextValueType>) {\n const { children, ...contextValues } = props;\n\n const value = useMemo(() => contextValues, [contextValues]) as ContextValueType;\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n }\n\n function useContext(consumerName: string) {\n const context = useContextRaw(Context);\n if (context == null) {\n throw new Error(`${consumerName}은 ${rootComponentName}하위에서 사용해야 합니다.`);\n }\n\n return context;\n }\n\n Provider.displayName = `${rootComponentName}Provider`;\n return [Provider, useContext] as const;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKO;AAaI;AAXJ,SAAS,cACd,mBACA,gBACA;AACA,QAAM,cAAU,aAAAA,eAA+C,cAAc;AAE7E,WAAS,SAAS,OAA4C;AAC5D,UAAM,EAAE,UAAU,GAAG,cAAc,IAAI;AAEvC,UAAM,YAAQ,sBAAQ,MAAM,eAAe,CAAC,aAAa,CAAC;AAE1D,WAAO,4CAAC,QAAQ,UAAR,EAAiB,OAAe,UAAS;AAAA,EACnD;AAEA,WAAS,WAAW,cAAsB;AACxC,UAAM,cAAU,aAAAC,YAAc,OAAO;AACrC,QAAI,WAAW,MAAM;AACnB,YAAM,IAAI,MAAM,GAAG,YAAY,UAAK,iBAAiB,uEAAgB;AAAA,IACvE;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc,GAAG,iBAAiB;AAC3C,SAAO,CAAC,UAAU,UAAU;AAC9B;","names":["createContextRaw","useContextRaw"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createContext
3
- } from "./chunk-3BSCIHE2.mjs";
3
+ } from "./chunk-FEPXSL77.mjs";
4
4
  export {
5
5
  createContext
6
6
  };
package/dist/ellipsis.js CHANGED
@@ -24,13 +24,13 @@ __export(ellipsis_exports, {
24
24
  multiLineEllipsis: () => multiLineEllipsis
25
25
  });
26
26
  module.exports = __toCommonJS(ellipsis_exports);
27
- var import_styled_components = require("styled-components");
28
- var ellipsis = import_styled_components.css`
27
+ var import_react = require("@emotion/react");
28
+ var ellipsis = import_react.css`
29
29
  overflow: hidden;
30
30
  text-overflow: ellipsis;
31
31
  white-space: nowrap;
32
32
  `;
33
- var multiLineEllipsis = ({ line }) => import_styled_components.css`
33
+ var multiLineEllipsis = ({ line }) => import_react.css`
34
34
  display: -webkit-box;
35
35
  overflow: hidden;
36
36
  text-overflow: ellipsis;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ellipsis.ts"],"sourcesContent":["import { css } from 'styled-components';\n\nexport type MultiLineEllipsisProps = {\n line: number;\n};\n\nexport const ellipsis = css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const multiLineEllipsis = ({ line }: MultiLineEllipsisProps) => css`\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: ${line};\n -webkit-box-orient: vertical;\n`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAoB;AAMb,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAMjB,IAAM,oBAAoB,CAAC,EAAE,KAAK,MAA8B;AAAA;AAAA;AAAA;AAAA,wBAI/C,IAAI;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../src/ellipsis.ts"],"sourcesContent":["import { css } from '@emotion/react';\n\nexport type MultiLineEllipsisProps = {\n line: number;\n};\n\nexport const ellipsis = css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const multiLineEllipsis = ({ line }: MultiLineEllipsisProps) => css`\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: ${line};\n -webkit-box-orient: vertical;\n`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAoB;AAMb,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAMjB,IAAM,oBAAoB,CAAC,EAAE,KAAK,MAA8B;AAAA;AAAA;AAAA;AAAA,wBAI/C,IAAI;AAAA;AAAA;","names":[]}
package/dist/ellipsis.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ellipsis,
3
3
  multiLineEllipsis
4
- } from "./chunk-FTMJVXXH.mjs";
4
+ } from "./chunk-5OCEFCYV.mjs";
5
5
  export {
6
6
  ellipsis,
7
7
  multiLineEllipsis
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hasBatchim.ts","../src/constants/josa.ts"],"sourcesContent":["import {\n COMPLETE_HANGUL_END_CHARCODE,\n COMPLETE_HANGUL_START_CHARCODE,\n NUMBER_OF_JONGSEONG,\n} from './constants/josa';\n\n/**\n * 한글 음절의 받침 유무를 확인합니다.\n * @param str - 검사할 문자열\n * @returns 받침이 있으면 true, 없으면 false\n */\nexport function hasBatchim(str: string): boolean {\n const lastChar = str[str.length - 1];\n if (!lastChar) return false;\n\n const charCode = lastChar.charCodeAt(0);\n\n // 한글 완성형 문자인지 확인\n if (\n charCode < COMPLETE_HANGUL_START_CHARCODE ||\n charCode > COMPLETE_HANGUL_END_CHARCODE\n ) {\n return false;\n }\n\n // 받침 코드 계산\n const batchimCode =\n (charCode - COMPLETE_HANGUL_START_CHARCODE) % NUMBER_OF_JONGSEONG;\n\n return batchimCode > 0; // 받침이 있으면 true\n}\n","export const COMPLETE_HANGUL_START_CHARCODE = '가'.charCodeAt(0);\nexport const COMPLETE_HANGUL_END_CHARCODE = '힣'.charCodeAt(0);\n\nexport const NUMBER_OF_JONGSEONG = 28;\nexport const NUMBER_OF_JUNGSEONG = 21;\n\nconst DISASSEMBLED_CONSONANTS_BY_CONSONANT = {\n '': '',\n ㄱ: 'ㄱ',\n ㄲ: 'ㄲ',\n ㄳ: 'ㄱㅅ',\n ㄴ: 'ㄴ',\n ㄵ: 'ㄴㅈ',\n ㄶ: 'ㄴㅎ',\n ㄷ: 'ㄷ',\n ㄸ: 'ㄸ',\n ㄹ: 'ㄹ',\n ㄺ: 'ㄹㄱ',\n ㄻ: 'ㄹㅁ',\n ㄼ: 'ㄹㅂ',\n ㄽ: 'ㄹㅅ',\n ㄾ: 'ㄹㅌ',\n ㄿ: 'ㄹㅍ',\n ㅀ: 'ㄹㅎ',\n ㅁ: 'ㅁ',\n ㅂ: 'ㅂ',\n ㅃ: 'ㅃ',\n ㅄ: 'ㅂㅅ',\n ㅅ: 'ㅅ',\n ㅆ: 'ㅆ',\n ㅇ: 'ㅇ',\n ㅈ: 'ㅈ',\n ㅉ: 'ㅉ',\n ㅊ: 'ㅊ',\n ㅋ: 'ㅋ',\n ㅌ: 'ㅌ',\n ㅍ: 'ㅍ',\n ㅎ: 'ㅎ',\n} as const;\n\nexport const JONGSEONGS = (\n [\n '',\n 'ㄱ',\n 'ㄲ',\n 'ㄳ',\n 'ㄴ',\n 'ㄵ',\n 'ㄶ',\n 'ㄷ',\n 'ㄹ',\n 'ㄺ',\n 'ㄻ',\n 'ㄼ',\n 'ㄽ',\n 'ㄾ',\n 'ㄿ',\n 'ㅀ',\n 'ㅁ',\n 'ㅂ',\n 'ㅄ',\n 'ㅅ',\n 'ㅆ',\n 'ㅇ',\n 'ㅈ',\n 'ㅊ',\n 'ㅋ',\n 'ㅌ',\n 'ㅍ',\n 'ㅎ',\n ] as const\n).map((consonant) => DISASSEMBLED_CONSONANTS_BY_CONSONANT[consonant]);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,iCAAiC,SAAI,WAAW,CAAC;AACvD,IAAM,+BAA+B,SAAI,WAAW,CAAC;AAErD,IAAM,sBAAsB;AAGnC,IAAM,uCAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AACL;AAEO,IAAM,aACX;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EACA,IAAI,CAAC,cAAc,qCAAqC,SAAS,CAAC;;;AD5D7D,SAAS,WAAW,KAAsB;AAC/C,QAAM,WAAW,IAAI,IAAI,SAAS,CAAC;AACnC,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,WAAW,SAAS,WAAW,CAAC;AAGtC,MACE,WAAW,kCACX,WAAW,8BACX;AACA,WAAO;AAAA,EACT;AAGA,QAAM,eACH,WAAW,kCAAkC;AAEhD,SAAO,cAAc;AACvB;","names":[]}
1
+ {"version":3,"sources":["../src/hasBatchim.ts","../src/constants/josa.ts"],"sourcesContent":["import {\n COMPLETE_HANGUL_END_CHARCODE,\n COMPLETE_HANGUL_START_CHARCODE,\n NUMBER_OF_JONGSEONG,\n} from './constants/josa';\n\n/**\n * 한글 음절의 받침 유무를 확인합니다.\n * @param str - 검사할 문자열\n * @returns 받침이 있으면 true, 없으면 false\n */\nexport function hasBatchim(str: string): boolean {\n const lastChar = str[str.length - 1];\n if (!lastChar) return false;\n\n const charCode = lastChar.charCodeAt(0);\n\n // 한글 완성형 문자인지 확인\n if (charCode < COMPLETE_HANGUL_START_CHARCODE || charCode > COMPLETE_HANGUL_END_CHARCODE) {\n return false;\n }\n\n // 받침 코드 계산\n const batchimCode = (charCode - COMPLETE_HANGUL_START_CHARCODE) % NUMBER_OF_JONGSEONG;\n\n return batchimCode > 0; // 받침이 있으면 true\n}\n","export const COMPLETE_HANGUL_START_CHARCODE = '가'.charCodeAt(0);\nexport const COMPLETE_HANGUL_END_CHARCODE = '힣'.charCodeAt(0);\n\nexport const NUMBER_OF_JONGSEONG = 28;\nexport const NUMBER_OF_JUNGSEONG = 21;\n\nconst DISASSEMBLED_CONSONANTS_BY_CONSONANT = {\n '': '',\n ㄱ: 'ㄱ',\n ㄲ: 'ㄲ',\n ㄳ: 'ㄱㅅ',\n ㄴ: 'ㄴ',\n ㄵ: 'ㄴㅈ',\n ㄶ: 'ㄴㅎ',\n ㄷ: 'ㄷ',\n ㄸ: 'ㄸ',\n ㄹ: 'ㄹ',\n ㄺ: 'ㄹㄱ',\n ㄻ: 'ㄹㅁ',\n ㄼ: 'ㄹㅂ',\n ㄽ: 'ㄹㅅ',\n ㄾ: 'ㄹㅌ',\n ㄿ: 'ㄹㅍ',\n ㅀ: 'ㄹㅎ',\n ㅁ: 'ㅁ',\n ㅂ: 'ㅂ',\n ㅃ: 'ㅃ',\n ㅄ: 'ㅂㅅ',\n ㅅ: 'ㅅ',\n ㅆ: 'ㅆ',\n ㅇ: 'ㅇ',\n ㅈ: 'ㅈ',\n ㅉ: 'ㅉ',\n ㅊ: 'ㅊ',\n ㅋ: 'ㅋ',\n ㅌ: 'ㅌ',\n ㅍ: 'ㅍ',\n ㅎ: 'ㅎ',\n} as const;\n\nexport const JONGSEONGS = (\n [\n '',\n 'ㄱ',\n 'ㄲ',\n 'ㄳ',\n 'ㄴ',\n 'ㄵ',\n 'ㄶ',\n 'ㄷ',\n 'ㄹ',\n 'ㄺ',\n 'ㄻ',\n 'ㄼ',\n 'ㄽ',\n 'ㄾ',\n 'ㄿ',\n 'ㅀ',\n 'ㅁ',\n 'ㅂ',\n 'ㅄ',\n 'ㅅ',\n 'ㅆ',\n 'ㅇ',\n 'ㅈ',\n 'ㅊ',\n 'ㅋ',\n 'ㅌ',\n 'ㅍ',\n 'ㅎ',\n ] as const\n).map((consonant) => DISASSEMBLED_CONSONANTS_BY_CONSONANT[consonant]);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,iCAAiC,SAAI,WAAW,CAAC;AACvD,IAAM,+BAA+B,SAAI,WAAW,CAAC;AAErD,IAAM,sBAAsB;AAGnC,IAAM,uCAAuC;AAAA,EAC3C,IAAI;AAAA,EACJ,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AAAA,EACH,QAAG;AACL;AAEO,IAAM,aACX;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EACA,IAAI,CAAC,cAAc,qCAAqC,SAAS,CAAC;;;AD5D7D,SAAS,WAAW,KAAsB;AAC/C,QAAM,WAAW,IAAI,IAAI,SAAS,CAAC;AACnC,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,WAAW,SAAS,WAAW,CAAC;AAGtC,MAAI,WAAW,kCAAkC,WAAW,8BAA8B;AACxF,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,WAAW,kCAAkC;AAElE,SAAO,cAAc;AACvB;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hasBatchim
3
- } from "./chunk-KMMS4XJ6.mjs";
3
+ } from "./chunk-K7254VDU.mjs";
4
4
  import "./chunk-GQPOYY4X.mjs";
5
5
  export {
6
6
  hasBatchim
package/dist/hexToRgba.js CHANGED
@@ -43,9 +43,7 @@ function isValidAlpha(alpha) {
43
43
  }
44
44
  function hexToRgba({ hex, alpha = 1 }) {
45
45
  if (!isValidAlpha(alpha)) {
46
- throw new Error(
47
- `Invalid alpha value. Must be between 0 and 1, received: ${alpha}`
48
- );
46
+ throw new Error(`Invalid alpha value. Must be between 0 and 1, received: ${alpha}`);
49
47
  }
50
48
  const validatedHex = validateHex(hex);
51
49
  const expandedHex = expandHex(validatedHex);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hexToRgba.ts"],"sourcesContent":["export type HexToRgbaProps = { hex: string; alpha?: number };\n\nfunction parseHexToDecimal(hex: string): number {\n return parseInt(hex, 16);\n}\n\nfunction validateHex(hex: string): string {\n const match = /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.exec(hex);\n if (!match) {\n throw new Error(\n `Invalid hex value: \"${hex}\". Expected formats: \"#RGB\", \"RGB\", \"#RRGGBB\", or \"RRGGBB\".`\n );\n }\n return match[1];\n}\n\nfunction expandHex(hex: string): string {\n return hex.length === 3\n ? hex\n .split('')\n .map((char) => char + char)\n .join('')\n : hex;\n}\n\nfunction isValidAlpha(alpha: number): boolean {\n return alpha >= 0 && alpha <= 1;\n}\n\nexport function hexToRgba({ hex, alpha = 1 }: HexToRgbaProps): string {\n if (!isValidAlpha(alpha)) {\n throw new Error(\n `Invalid alpha value. Must be between 0 and 1, received: ${alpha}`\n );\n }\n\n const validatedHex = validateHex(hex);\n const expandedHex = expandHex(validatedHex);\n\n const r = parseHexToDecimal(expandedHex.slice(0, 2));\n const g = parseHexToDecimal(expandedHex.slice(2, 4));\n const b = parseHexToDecimal(expandedHex.slice(4, 6));\n\n return `rgba(${r},${g},${b},${alpha})`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,kBAAkB,KAAqB;AAC9C,SAAO,SAAS,KAAK,EAAE;AACzB;AAEA,SAAS,YAAY,KAAqB;AACxC,QAAM,QAAQ,sCAAsC,KAAK,GAAG;AAC5D,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,MAAM,CAAC;AAChB;AAEA,SAAS,UAAU,KAAqB;AACtC,SAAO,IAAI,WAAW,IAClB,IACG,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,OAAO,IAAI,EACzB,KAAK,EAAE,IACV;AACN;AAEA,SAAS,aAAa,OAAwB;AAC5C,SAAO,SAAS,KAAK,SAAS;AAChC;AAEO,SAAS,UAAU,EAAE,KAAK,QAAQ,EAAE,GAA2B;AACpE,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,2DAA2D,KAAK;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,eAAe,YAAY,GAAG;AACpC,QAAM,cAAc,UAAU,YAAY;AAE1C,QAAM,IAAI,kBAAkB,YAAY,MAAM,GAAG,CAAC,CAAC;AACnD,QAAM,IAAI,kBAAkB,YAAY,MAAM,GAAG,CAAC,CAAC;AACnD,QAAM,IAAI,kBAAkB,YAAY,MAAM,GAAG,CAAC,CAAC;AAEnD,SAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK;AACrC;","names":[]}
1
+ {"version":3,"sources":["../src/hexToRgba.ts"],"sourcesContent":["export type HexToRgbaProps = { hex: string; alpha?: number };\n\nfunction parseHexToDecimal(hex: string): number {\n return parseInt(hex, 16);\n}\n\nfunction validateHex(hex: string): string {\n const match = /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.exec(hex);\n if (!match) {\n throw new Error(\n `Invalid hex value: \"${hex}\". Expected formats: \"#RGB\", \"RGB\", \"#RRGGBB\", or \"RRGGBB\".`\n );\n }\n return match[1];\n}\n\nfunction expandHex(hex: string): string {\n return hex.length === 3\n ? hex\n .split('')\n .map((char) => char + char)\n .join('')\n : hex;\n}\n\nfunction isValidAlpha(alpha: number): boolean {\n return alpha >= 0 && alpha <= 1;\n}\n\nexport function hexToRgba({ hex, alpha = 1 }: HexToRgbaProps): string {\n if (!isValidAlpha(alpha)) {\n throw new Error(`Invalid alpha value. Must be between 0 and 1, received: ${alpha}`);\n }\n\n const validatedHex = validateHex(hex);\n const expandedHex = expandHex(validatedHex);\n\n const r = parseHexToDecimal(expandedHex.slice(0, 2));\n const g = parseHexToDecimal(expandedHex.slice(2, 4));\n const b = parseHexToDecimal(expandedHex.slice(4, 6));\n\n return `rgba(${r},${g},${b},${alpha})`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,kBAAkB,KAAqB;AAC9C,SAAO,SAAS,KAAK,EAAE;AACzB;AAEA,SAAS,YAAY,KAAqB;AACxC,QAAM,QAAQ,sCAAsC,KAAK,GAAG;AAC5D,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,MAAM,CAAC;AAChB;AAEA,SAAS,UAAU,KAAqB;AACtC,SAAO,IAAI,WAAW,IAClB,IACG,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,OAAO,IAAI,EACzB,KAAK,EAAE,IACV;AACN;AAEA,SAAS,aAAa,OAAwB;AAC5C,SAAO,SAAS,KAAK,SAAS;AAChC;AAEO,SAAS,UAAU,EAAE,KAAK,QAAQ,EAAE,GAA2B;AACpE,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,2DAA2D,KAAK,EAAE;AAAA,EACpF;AAEA,QAAM,eAAe,YAAY,GAAG;AACpC,QAAM,cAAc,UAAU,YAAY;AAE1C,QAAM,IAAI,kBAAkB,YAAY,MAAM,GAAG,CAAC,CAAC;AACnD,QAAM,IAAI,kBAAkB,YAAY,MAAM,GAAG,CAAC,CAAC;AACnD,QAAM,IAAI,kBAAkB,YAAY,MAAM,GAAG,CAAC,CAAC;AAEnD,SAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK;AACrC;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  hexToRgba
3
- } from "./chunk-KIUJWSBE.mjs";
3
+ } from "./chunk-JTQFGEBG.mjs";
4
4
  export {
5
5
  hexToRgba
6
6
  };
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import React__default, { ReactNode, FC, PropsWithChildren, HTMLAttributes, CSSProperties, ComponentPropsWithoutRef, Ref } from 'react';
4
- import * as styled_components from 'styled-components';
4
+ import * as _emotion_react from '@emotion/react';
5
5
 
6
6
  type ChooseWhenProps = {
7
7
  condition: boolean;
@@ -53,8 +53,8 @@ declare const Flex: React.NamedExoticComponent<FlexProps>;
53
53
  type MultiLineEllipsisProps = {
54
54
  line: number;
55
55
  };
56
- declare const ellipsis: styled_components.RuleSet<object>;
57
- declare const multiLineEllipsis: ({ line }: MultiLineEllipsisProps) => styled_components.RuleSet<object>;
56
+ declare const ellipsis: _emotion_react.SerializedStyles;
57
+ declare const multiLineEllipsis: ({ line }: MultiLineEllipsisProps) => _emotion_react.SerializedStyles;
58
58
 
59
59
  type HexToRgbaProps = {
60
60
  hex: string;
@@ -120,11 +120,11 @@ type SafeAreaProps<T extends React__default.ElementType = 'div'> = {
120
120
  declare const SafeArea: {
121
121
  <T extends React__default.ElementType = "div">({ as, children, ...props }: SafeAreaProps<T>): react_jsx_runtime.JSX.Element;
122
122
  Top: React__default.NamedExoticComponent<Omit<Omit<React__default.HTMLAttributes<HTMLDivElement>, "children"> & {
123
- direction?: "horizontal" | "vertical";
123
+ direction?: "vertical" | "horizontal";
124
124
  size: CSSPixelValue;
125
125
  }, "size">>;
126
126
  Bottom: React__default.NamedExoticComponent<Omit<Omit<React__default.HTMLAttributes<HTMLDivElement>, "children"> & {
127
- direction?: "horizontal" | "vertical";
127
+ direction?: "vertical" | "horizontal";
128
128
  size: CSSPixelValue;
129
129
  }, "size">>;
130
130
  };
@@ -159,7 +159,7 @@ declare function getQueryString<T>(name: string, parser: (val: string) => T): T
159
159
  * @description 기존 쿼리 스트링에 새로운 쿼리 스트링을 추가합니다.
160
160
  * @example setQueryString({ qs: '?a=1', key: 'b', value: '2' }) // '?a=1&b=2'
161
161
  */
162
- declare function setQueryString({ qs, key, value, }: {
162
+ declare function setQueryString({ qs, key, value }: {
163
163
  qs: string;
164
164
  key: string;
165
165
  value: string;
@@ -199,6 +199,7 @@ declare const Format: {
199
199
  removeHyphen: typeof removeHyphen;
200
200
  commaize: typeof formatCommaizeNumber;
201
201
  padTime: typeof padTime;
202
+ email: typeof email;
202
203
  };
203
204
  /**
204
205
  * 숫자를 전화번호 형식으로 변환합니다.
@@ -224,6 +225,10 @@ declare function formatCommaizeNumber(value: Value): string;
224
225
  * @example Format.padTime(9) // '09'
225
226
  */
226
227
  declare function padTime(value: Value): string;
228
+ /**
229
+ * 이메일을 주소 앞자리 64자 @ 도메인 255자 → 최대 320자 제한에 맞춰 포맷합니다.
230
+ */
231
+ declare function email(value: string): string;
227
232
 
228
233
  type Mode = 'H' | 'C' | 'W';
229
234
  type Wind = 1 | 2 | 3;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import React__default, { ReactNode, FC, PropsWithChildren, HTMLAttributes, CSSProperties, ComponentPropsWithoutRef, Ref } from 'react';
4
- import * as styled_components from 'styled-components';
4
+ import * as _emotion_react from '@emotion/react';
5
5
 
6
6
  type ChooseWhenProps = {
7
7
  condition: boolean;
@@ -53,8 +53,8 @@ declare const Flex: React.NamedExoticComponent<FlexProps>;
53
53
  type MultiLineEllipsisProps = {
54
54
  line: number;
55
55
  };
56
- declare const ellipsis: styled_components.RuleSet<object>;
57
- declare const multiLineEllipsis: ({ line }: MultiLineEllipsisProps) => styled_components.RuleSet<object>;
56
+ declare const ellipsis: _emotion_react.SerializedStyles;
57
+ declare const multiLineEllipsis: ({ line }: MultiLineEllipsisProps) => _emotion_react.SerializedStyles;
58
58
 
59
59
  type HexToRgbaProps = {
60
60
  hex: string;
@@ -120,11 +120,11 @@ type SafeAreaProps<T extends React__default.ElementType = 'div'> = {
120
120
  declare const SafeArea: {
121
121
  <T extends React__default.ElementType = "div">({ as, children, ...props }: SafeAreaProps<T>): react_jsx_runtime.JSX.Element;
122
122
  Top: React__default.NamedExoticComponent<Omit<Omit<React__default.HTMLAttributes<HTMLDivElement>, "children"> & {
123
- direction?: "horizontal" | "vertical";
123
+ direction?: "vertical" | "horizontal";
124
124
  size: CSSPixelValue;
125
125
  }, "size">>;
126
126
  Bottom: React__default.NamedExoticComponent<Omit<Omit<React__default.HTMLAttributes<HTMLDivElement>, "children"> & {
127
- direction?: "horizontal" | "vertical";
127
+ direction?: "vertical" | "horizontal";
128
128
  size: CSSPixelValue;
129
129
  }, "size">>;
130
130
  };
@@ -159,7 +159,7 @@ declare function getQueryString<T>(name: string, parser: (val: string) => T): T
159
159
  * @description 기존 쿼리 스트링에 새로운 쿼리 스트링을 추가합니다.
160
160
  * @example setQueryString({ qs: '?a=1', key: 'b', value: '2' }) // '?a=1&b=2'
161
161
  */
162
- declare function setQueryString({ qs, key, value, }: {
162
+ declare function setQueryString({ qs, key, value }: {
163
163
  qs: string;
164
164
  key: string;
165
165
  value: string;
@@ -199,6 +199,7 @@ declare const Format: {
199
199
  removeHyphen: typeof removeHyphen;
200
200
  commaize: typeof formatCommaizeNumber;
201
201
  padTime: typeof padTime;
202
+ email: typeof email;
202
203
  };
203
204
  /**
204
205
  * 숫자를 전화번호 형식으로 변환합니다.
@@ -224,6 +225,10 @@ declare function formatCommaizeNumber(value: Value): string;
224
225
  * @example Format.padTime(9) // '09'
225
226
  */
226
227
  declare function padTime(value: Value): string;
228
+ /**
229
+ * 이메일을 주소 앞자리 64자 @ 도메인 255자 → 최대 320자 제한에 맞춰 포맷합니다.
230
+ */
231
+ declare function email(value: string): string;
227
232
 
228
233
  type Mode = 'H' | 'C' | 'W';
229
234
  type Wind = 1 | 2 | 3;
package/dist/index.js CHANGED
@@ -89,23 +89,16 @@ function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForD
89
89
  var import_react2 = require("react");
90
90
  var import_jsx_runtime2 = require("react/jsx-runtime");
91
91
  function createContext(rootComponentName, defaultContext) {
92
- const Context = (0, import_react2.createContext)(
93
- defaultContext
94
- );
92
+ const Context = (0, import_react2.createContext)(defaultContext);
95
93
  function Provider(props) {
96
94
  const { children, ...contextValues } = props;
97
- const value = (0, import_react2.useMemo)(
98
- () => contextValues,
99
- [contextValues]
100
- );
95
+ const value = (0, import_react2.useMemo)(() => contextValues, [contextValues]);
101
96
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Context.Provider, { value, children });
102
97
  }
103
98
  function useContext(consumerName) {
104
99
  const context = (0, import_react2.useContext)(Context);
105
100
  if (context == null) {
106
- throw new Error(
107
- `${consumerName}\uC740 ${rootComponentName}\uD558\uC704\uC5D0\uC11C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4.`
108
- );
101
+ throw new Error(`${consumerName}\uC740 ${rootComponentName}\uD558\uC704\uC5D0\uC11C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4.`);
109
102
  }
110
103
  return context;
111
104
  }
@@ -130,7 +123,7 @@ function If(props) {
130
123
 
131
124
  // src/Flex.tsx
132
125
  var import_react3 = require("react");
133
- var import_styled_components = require("styled-components");
126
+ var import_styled = __toESM(require("@emotion/styled"));
134
127
 
135
128
  // src/coerceCssPixelValue.ts
136
129
  function coerceCssPixelValue(value) {
@@ -148,19 +141,9 @@ var Flex = (0, import_react3.memo)(function Flex2(props) {
148
141
  children,
149
142
  ...restProps
150
143
  } = props;
151
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
152
- Container,
153
- {
154
- $gap: gap,
155
- $justify: justify,
156
- $align: align,
157
- $direction: direction,
158
- ...restProps,
159
- children
160
- }
161
- );
144
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Container, { $gap: gap, $justify: justify, $align: align, $direction: direction, ...restProps, children });
162
145
  });
163
- var Container = import_styled_components.styled.div`
146
+ var Container = import_styled.default.div`
164
147
  display: flex;
165
148
  flex-direction: ${({ $direction }) => $direction};
166
149
  gap: ${({ $gap }) => coerceCssPixelValue($gap)};
@@ -169,13 +152,13 @@ var Container = import_styled_components.styled.div`
169
152
  `;
170
153
 
171
154
  // src/ellipsis.ts
172
- var import_styled_components2 = require("styled-components");
173
- var ellipsis = import_styled_components2.css`
155
+ var import_react4 = require("@emotion/react");
156
+ var ellipsis = import_react4.css`
174
157
  overflow: hidden;
175
158
  text-overflow: ellipsis;
176
159
  white-space: nowrap;
177
160
  `;
178
- var multiLineEllipsis = ({ line }) => import_styled_components2.css`
161
+ var multiLineEllipsis = ({ line }) => import_react4.css`
179
162
  display: -webkit-box;
180
163
  overflow: hidden;
181
164
  text-overflow: ellipsis;
@@ -204,9 +187,7 @@ function isValidAlpha(alpha) {
204
187
  }
205
188
  function hexToRgba({ hex, alpha = 1 }) {
206
189
  if (!isValidAlpha(alpha)) {
207
- throw new Error(
208
- `Invalid alpha value. Must be between 0 and 1, received: ${alpha}`
209
- );
190
+ throw new Error(`Invalid alpha value. Must be between 0 and 1, received: ${alpha}`);
210
191
  }
211
192
  const validatedHex = validateHex(hex);
212
193
  const expandedHex = expandHex(validatedHex);
@@ -319,9 +300,9 @@ function josaPicker(props) {
319
300
  josa.pick = josaPicker;
320
301
 
321
302
  // src/Validate.ts
322
- function isEmail(email) {
303
+ function isEmail(email2) {
323
304
  const regExp = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
324
- return regExp.test(email);
305
+ return regExp.test(email2);
325
306
  }
326
307
  function isPhoneNumber(phoneNumber) {
327
308
  const regExpWithHyphen = /^01([0|1|6|7|8|9])-([0-9]{3,4})-([0-9]{4})$/;
@@ -334,14 +315,14 @@ var Validate = {
334
315
  };
335
316
 
336
317
  // src/Spacing.tsx
337
- var import_react4 = require("react");
338
- var import_styled_components3 = require("styled-components");
318
+ var import_react5 = require("react");
319
+ var import_styled2 = __toESM(require("@emotion/styled"));
339
320
  var import_jsx_runtime5 = require("react/jsx-runtime");
340
- var Spacing = (0, import_react4.memo)(function Spacing2(props) {
321
+ var Spacing = (0, import_react5.memo)(function Spacing2(props) {
341
322
  const { direction = "vertical", size, ...restProps } = props;
342
323
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpacingContainer, { $direction: direction, $size: size, ...restProps });
343
324
  });
344
- var SpacingContainer = import_styled_components3.styled.div`
325
+ var SpacingContainer = import_styled2.default.div`
345
326
  flex: none;
346
327
  width: ${({ $direction, $size }) => $direction === "horizontal" ? coerceCssPixelValue($size) : void 0};
347
328
  height: ${({ $direction, $size }) => $direction === "vertical" ? coerceCssPixelValue($size) : void 0};
@@ -362,7 +343,7 @@ var useSafeArea = ({
362
343
  };
363
344
 
364
345
  // src/SafeArea.tsx
365
- var import_react5 = require("react");
346
+ var import_react6 = require("react");
366
347
  var import_jsx_runtime6 = require("react/jsx-runtime");
367
348
  var SafeArea = ({
368
349
  as,
@@ -376,11 +357,11 @@ var SafeArea = ({
376
357
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SafeAreaBottom, {})
377
358
  ] });
378
359
  };
379
- var SafeAreaTop = (0, import_react5.memo)(function SafeAreaTop2(props) {
360
+ var SafeAreaTop = (0, import_react6.memo)(function SafeAreaTop2(props) {
380
361
  const { top } = useSafeArea();
381
362
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spacing, { ...props, size: top });
382
363
  });
383
- var SafeAreaBottom = (0, import_react5.memo)(function SafeAreaBottom2(props) {
364
+ var SafeAreaBottom = (0, import_react6.memo)(function SafeAreaBottom2(props) {
384
365
  const { bottom } = useSafeArea();
385
366
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spacing, { ...props, size: bottom });
386
367
  });
@@ -432,11 +413,7 @@ function getQueryString(name, parser) {
432
413
  return parser(value);
433
414
  }
434
415
  }
435
- function setQueryString({
436
- qs,
437
- key,
438
- value
439
- }) {
416
+ function setQueryString({ qs, key, value }) {
440
417
  const parsed = parseQueryString(qs);
441
418
  return createQueryString({
442
419
  ...parsed,
@@ -502,7 +479,8 @@ var Format = {
502
479
  phone: formatPhoneNumber,
503
480
  removeHyphen,
504
481
  commaize: formatCommaizeNumber,
505
- padTime
482
+ padTime,
483
+ email
506
484
  };
507
485
  function formatPhoneNumber(phoneNumber) {
508
486
  return phoneNumber.replace(/[^0-9]/g, "").replace(/^(\d{0,3})(\d{0,4})(\d{0,4})$/g, "$1-$2-$3").replace(/(-{1,2})$/g, "");
@@ -519,6 +497,23 @@ function formatCommaizeNumber(value) {
519
497
  function padTime(value) {
520
498
  return String(value).padStart(2, "0");
521
499
  }
500
+ function email(value) {
501
+ if (!value.includes("@")) {
502
+ return value;
503
+ }
504
+ let formattedEmail = value;
505
+ const [localPart, domain] = value.split("@");
506
+ if (localPart && localPart.length > 64) {
507
+ formattedEmail = localPart.slice(0, 64) + (domain ? "@" + domain : "");
508
+ }
509
+ if (domain && domain.length > 255) {
510
+ formattedEmail = localPart + "@" + domain.slice(0, 255);
511
+ }
512
+ if (value.length > 320) {
513
+ formattedEmail = value.slice(0, 320);
514
+ }
515
+ return formattedEmail;
516
+ }
522
517
 
523
518
  // src/DomainFormat.ts
524
519
  function formatModeName(mode, customMapping = {}) {
@@ -616,8 +611,8 @@ var DomainFormat = {
616
611
  };
617
612
 
618
613
  // src/useCombinedRefs.ts
619
- var import_react6 = require("react");
620
- var useCombinedRefs = (...refs) => (0, import_react6.useCallback)(
614
+ var import_react7 = require("react");
615
+ var useCombinedRefs = (...refs) => (0, import_react7.useCallback)(
621
616
  (element) => refs.forEach((ref) => {
622
617
  if (!ref) {
623
618
  return;
@@ -634,13 +629,13 @@ var useCombinedRefs = (...refs) => (0, import_react6.useCallback)(
634
629
  var React2 = __toESM(require("react"));
635
630
 
636
631
  // src/usePreservedCallback.ts
637
- var import_react7 = require("react");
632
+ var import_react8 = require("react");
638
633
  var usePreservedCallback = (callback) => {
639
- const callbackRef = (0, import_react7.useRef)(callback);
640
- (0, import_react7.useEffect)(() => {
634
+ const callbackRef = (0, import_react8.useRef)(callback);
635
+ (0, import_react8.useEffect)(() => {
641
636
  callbackRef.current = callback;
642
637
  }, [callback]);
643
- return (0, import_react7.useMemo)(() => (...args) => callbackRef.current?.(...args), []);
638
+ return (0, import_react8.useMemo)(() => (...args) => callbackRef.current?.(...args), []);
644
639
  };
645
640
  var usePreservedCallback_default = usePreservedCallback;
646
641