@basiln/utils 0.1.1 → 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.
Files changed (122) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/dist/Choose.js +50 -0
  3. package/dist/Choose.js.map +1 -0
  4. package/dist/Choose.mjs +7 -0
  5. package/dist/Choose.mjs.map +1 -0
  6. package/dist/Flex.js +70 -0
  7. package/dist/Flex.js.map +1 -0
  8. package/dist/Flex.mjs +10 -0
  9. package/dist/Flex.mjs.map +1 -0
  10. package/dist/If.js +35 -0
  11. package/dist/If.js.map +1 -0
  12. package/dist/If.mjs +7 -0
  13. package/dist/If.mjs.map +1 -0
  14. package/dist/SafeArea.js +91 -0
  15. package/dist/SafeArea.js.map +1 -0
  16. package/dist/SafeArea.mjs +10 -0
  17. package/dist/SafeArea.mjs.map +1 -0
  18. package/dist/Spacing.js +49 -0
  19. package/dist/Spacing.js.map +1 -0
  20. package/dist/Spacing.mjs +8 -0
  21. package/dist/Spacing.mjs.map +1 -0
  22. package/dist/Validate.js +43 -0
  23. package/dist/Validate.js.map +1 -0
  24. package/dist/Validate.mjs +7 -0
  25. package/dist/Validate.mjs.map +1 -0
  26. package/dist/chunk-7WNTKDNW.mjs +26 -0
  27. package/dist/chunk-7WNTKDNW.mjs.map +1 -0
  28. package/dist/chunk-C7VOPXT2.mjs +23 -0
  29. package/dist/chunk-C7VOPXT2.mjs.map +1 -0
  30. package/dist/chunk-FUGA35PJ.mjs +22 -0
  31. package/dist/chunk-FUGA35PJ.mjs.map +1 -0
  32. package/dist/chunk-GQPOYY4X.mjs +77 -0
  33. package/dist/chunk-GQPOYY4X.mjs.map +1 -0
  34. package/dist/chunk-LKUAG7PE.mjs +22 -0
  35. package/dist/chunk-LKUAG7PE.mjs.map +1 -0
  36. package/dist/chunk-OIJ4AVT7.mjs +37 -0
  37. package/dist/chunk-OIJ4AVT7.mjs.map +1 -0
  38. package/dist/chunk-Q3B6WSD7.mjs +42 -0
  39. package/dist/chunk-Q3B6WSD7.mjs.map +1 -0
  40. package/dist/chunk-QD5QDTUG.mjs +14 -0
  41. package/dist/chunk-QD5QDTUG.mjs.map +1 -0
  42. package/dist/chunk-R23KSR7N.mjs +19 -0
  43. package/dist/chunk-R23KSR7N.mjs.map +1 -0
  44. package/dist/chunk-SJJHTYZC.mjs +30 -0
  45. package/dist/chunk-SJJHTYZC.mjs.map +1 -0
  46. package/dist/chunk-T7K7QYTL.mjs +9 -0
  47. package/dist/chunk-T7K7QYTL.mjs.map +1 -0
  48. package/dist/chunk-U4T3KW7L.mjs +67 -0
  49. package/dist/chunk-U4T3KW7L.mjs.map +1 -0
  50. package/dist/chunk-UFRXNT2I.mjs +11 -0
  51. package/dist/chunk-UFRXNT2I.mjs.map +1 -0
  52. package/dist/chunk-WHYNBO2G.mjs +12 -0
  53. package/dist/chunk-WHYNBO2G.mjs.map +1 -0
  54. package/dist/chunk-WOYL5AA5.mjs +39 -0
  55. package/dist/chunk-WOYL5AA5.mjs.map +1 -0
  56. package/dist/chunk-XBGZ3YNL.mjs +20 -0
  57. package/dist/chunk-XBGZ3YNL.mjs.map +1 -0
  58. package/dist/chunk-Z4QPISK7.mjs +36 -0
  59. package/dist/chunk-Z4QPISK7.mjs.map +1 -0
  60. package/dist/coerceCssPixelValue.js +33 -0
  61. package/dist/coerceCssPixelValue.js.map +1 -0
  62. package/dist/coerceCssPixelValue.mjs +7 -0
  63. package/dist/coerceCssPixelValue.mjs.map +1 -0
  64. package/dist/composeEventHandlers.js +38 -0
  65. package/dist/composeEventHandlers.js.map +1 -0
  66. package/dist/composeEventHandlers.mjs +7 -0
  67. package/dist/composeEventHandlers.mjs.map +1 -0
  68. package/dist/constants/josa.js +105 -0
  69. package/dist/constants/josa.js.map +1 -0
  70. package/dist/constants/josa.mjs +15 -0
  71. package/dist/constants/josa.mjs.map +1 -0
  72. package/dist/createContext.js +56 -0
  73. package/dist/createContext.js.map +1 -0
  74. package/dist/createContext.mjs +7 -0
  75. package/dist/createContext.mjs.map +1 -0
  76. package/dist/ellipsis.js +45 -0
  77. package/dist/ellipsis.js.map +1 -0
  78. package/dist/ellipsis.mjs +9 -0
  79. package/dist/ellipsis.mjs.map +1 -0
  80. package/dist/getVar.js +36 -0
  81. package/dist/getVar.js.map +1 -0
  82. package/dist/getVar.mjs +7 -0
  83. package/dist/getVar.mjs.map +1 -0
  84. package/dist/hasBatchim.js +111 -0
  85. package/dist/hasBatchim.js.map +1 -0
  86. package/dist/hasBatchim.mjs +8 -0
  87. package/dist/hasBatchim.mjs.map +1 -0
  88. package/dist/hexToRgba.js +61 -0
  89. package/dist/hexToRgba.js.map +1 -0
  90. package/dist/hexToRgba.mjs +7 -0
  91. package/dist/hexToRgba.mjs.map +1 -0
  92. package/dist/index.d.ts +174 -0
  93. package/dist/index.js +456 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/index.mjs +64 -0
  96. package/dist/index.mjs.map +1 -0
  97. package/dist/josa.js +133 -0
  98. package/dist/josa.js.map +1 -0
  99. package/dist/josa.mjs +9 -0
  100. package/dist/josa.mjs.map +1 -0
  101. package/dist/queryString.js +91 -0
  102. package/dist/queryString.js.map +1 -0
  103. package/dist/queryString.mjs +7 -0
  104. package/dist/queryString.mjs.map +1 -0
  105. package/dist/useSafeArea.js +49 -0
  106. package/dist/useSafeArea.js.map +1 -0
  107. package/dist/useSafeArea.mjs +8 -0
  108. package/dist/useSafeArea.mjs.map +1 -0
  109. package/package.json +5 -2
  110. package/src/Flex.tsx +51 -0
  111. package/src/SafeArea.tsx +46 -0
  112. package/src/Spacing.tsx +30 -0
  113. package/src/Validate.ts +25 -0
  114. package/src/coerceCssPixelValue.ts +5 -0
  115. package/src/constants/josa.ts +72 -0
  116. package/src/ellipsis.ts +19 -0
  117. package/src/hasBatchim.ts +31 -0
  118. package/src/hexToRgba.ts +45 -0
  119. package/src/index.ts +25 -0
  120. package/src/josa.ts +50 -0
  121. package/src/queryString.ts +134 -0
  122. package/src/useSafeArea.ts +24 -0
@@ -0,0 +1,174 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import React__default, { ReactNode, FC, PropsWithChildren, HTMLAttributes, CSSProperties, ComponentPropsWithoutRef } from 'react';
4
+ import * as styled_components from 'styled-components';
5
+
6
+ type ChooseWhenProps = {
7
+ condition: boolean;
8
+ children: ReactNode;
9
+ };
10
+ type ChooseProps = {
11
+ children: ReactNode;
12
+ };
13
+ type ChooseOtherwiseProps = {
14
+ children: ReactNode;
15
+ };
16
+ declare function Choose({ children }: ChooseProps): string | number | Iterable<ReactNode> | react_jsx_runtime.JSX.Element;
17
+ declare namespace Choose {
18
+ var When: FC<ChooseWhenProps>;
19
+ var Otherwise: FC<ChooseOtherwiseProps>;
20
+ }
21
+
22
+ declare function composeEventHandlers<E>(originalEventHandler?: (event: E) => void, ourEventHandler?: (event: E) => void, { checkForDefaultPrevented }?: {
23
+ checkForDefaultPrevented?: boolean | undefined;
24
+ }): (event: E) => void;
25
+
26
+ declare function createContext<ContextValueType extends object | null>(rootComponentName: string, defaultContext?: ContextValueType): readonly [{
27
+ (props: PropsWithChildren<ContextValueType>): react_jsx_runtime.JSX.Element;
28
+ displayName: string;
29
+ }, (consumerName: string) => NonNullable<ContextValueType>];
30
+
31
+ type VariableType = `--${string}`;
32
+ declare function getVar(variable: VariableType, defaultValue?: string): string;
33
+
34
+ type IfProps = {
35
+ condition: boolean;
36
+ children: ReactNode;
37
+ };
38
+ declare function If(props: IfProps): react_jsx_runtime.JSX.Element | null;
39
+
40
+ type CSSPixelValue = string | number;
41
+
42
+ type Justify = CSSProperties['justifyContent'];
43
+ type Align = CSSProperties['alignItems'];
44
+ type Direction = CSSProperties['flexDirection'];
45
+ type FlexProps = HTMLAttributes<HTMLDivElement> & {
46
+ gap?: CSSPixelValue;
47
+ justify?: Justify;
48
+ align?: Align;
49
+ direction?: Direction;
50
+ };
51
+ declare const Flex: React.NamedExoticComponent<FlexProps>;
52
+
53
+ type MultiLineEllipsisProps = {
54
+ line: number;
55
+ };
56
+ declare const ellipsis: styled_components.RuleSet<object>;
57
+ declare const multiLineEllipsis: ({ line }: MultiLineEllipsisProps) => styled_components.RuleSet<object>;
58
+
59
+ type HexToRgbaProps = {
60
+ hex: string;
61
+ alpha?: number;
62
+ };
63
+ declare function hexToRgba({ hex, alpha }: HexToRgbaProps): string;
64
+
65
+ type JosaOption = '이/가' | '을/를' | '은/는';
66
+ type ExtractJosaOption<T> = T extends `${infer A}/${infer B}` ? A | B : never;
67
+ type JosaProps<U extends JosaOption> = {
68
+ word: string;
69
+ josa: U;
70
+ };
71
+ /**
72
+ * 주어진 단어와 조사 옵션을 기반으로 올바른 조사를 반환합니다.
73
+ * @returns 단어와 올바른 조사가 결합된 문자열
74
+ */
75
+ declare function josa<U extends JosaOption>(props: JosaProps<U>): `${JosaProps<U>['word']}${ExtractJosaOption<U>}`;
76
+ declare namespace josa {
77
+ var pick: typeof josaPicker;
78
+ }
79
+ /**
80
+ * 주어진 단어와 조사 옵션을 기반으로 올바른 조사를 선택합니다.
81
+ * @returns 올바른 조사
82
+ */
83
+ declare function josaPicker<U extends JosaOption>(props: JosaProps<U>): ExtractJosaOption<U>;
84
+
85
+ /**
86
+ *
87
+ * @see 이메일 주소가 RFC 5322 표준을 따르는지 검사합니다. {@link https://emailregex.com/}
88
+ */
89
+ declare function isEmail(email: string): boolean;
90
+ declare function isPhoneNumber(phoneNumber: string): boolean;
91
+ declare const Validate: {
92
+ email: typeof isEmail;
93
+ phoneNumber: typeof isPhoneNumber;
94
+ };
95
+
96
+ type AxisDirection = 'vertical' | 'horizontal';
97
+ type SpacingProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
98
+ direction?: AxisDirection;
99
+ size: CSSPixelValue;
100
+ };
101
+ declare const Spacing: React.NamedExoticComponent<SpacingProps>;
102
+
103
+ type SafeAreaCssValueProps = {
104
+ top?: CSSPixelValue;
105
+ bottom?: CSSPixelValue;
106
+ left?: CSSPixelValue;
107
+ right?: CSSPixelValue;
108
+ };
109
+ declare const useSafeArea: ({ top: T, bottom: B, left: L, right: R, }?: SafeAreaCssValueProps) => {
110
+ top: string;
111
+ bottom: string;
112
+ left: string;
113
+ right: string;
114
+ };
115
+
116
+ type SafeAreaProps<T extends React__default.ElementType = 'div'> = {
117
+ as?: T;
118
+ children: ReactNode;
119
+ } & ComponentPropsWithoutRef<T>;
120
+ declare const SafeArea: {
121
+ <T extends React__default.ElementType<any, keyof React__default.JSX.IntrinsicElements> = "div">({ as, children, ...props }: SafeAreaProps<T>): react_jsx_runtime.JSX.Element;
122
+ Top: React__default.NamedExoticComponent<Omit<Omit<React__default.HTMLAttributes<HTMLDivElement>, "children"> & {
123
+ direction?: ("horizontal" | "vertical") | undefined;
124
+ size: CSSPixelValue;
125
+ }, "size">>;
126
+ Bottom: React__default.NamedExoticComponent<Omit<Omit<React__default.HTMLAttributes<HTMLDivElement>, "children"> & {
127
+ direction?: ("horizontal" | "vertical") | undefined;
128
+ size: CSSPixelValue;
129
+ }, "size">>;
130
+ };
131
+
132
+ /**
133
+ * @description 물음표를 포함한 쿼리 스트링을 생성합니다.
134
+ * @example createQueryString({ a: 1, b: 2, c: 3 }) // '?a=1&b=2&c=3'
135
+ */
136
+ declare function createQueryString(params: Record<string, any>): string;
137
+ /**
138
+ * @description 쿼리 스트링을 객체로 변환합니다.
139
+ * @example parseQueryString('?a=1&b=2&c=3') // { a: '1', b: '2', c: '3' }
140
+ */
141
+ declare function parseQueryString<Result = Record<string, string>>(queryString?: string): Result;
142
+ /**
143
+ * @description 쿼리 스트링에서 특정 키의 값을 가져옵니다.
144
+ *
145
+ * @param name 가져올 쿼리 스트링의 키
146
+ * @param parser 가져온 값을 파싱할 함수
147
+ * @returns 파싱된 값
148
+ *
149
+ * @example
150
+ * url: 'http://example.com/?a=1'
151
+ * getQueryString('a') // '1'
152
+ * getQueryString('a', parseInt) // 1
153
+ * getQueryString('b') // undefined
154
+ * getQueryString('b', parseInt) // undefined
155
+ */
156
+ declare function getQueryString(name: string): string | undefined;
157
+ declare function getQueryString<T>(name: string, parser: (val: string) => T): T | undefined;
158
+ /**
159
+ * @description 기존 쿼리 스트링에 새로운 쿼리 스트링을 추가합니다.
160
+ * @example setQueryString({ qs: '?a=1', key: 'b', value: '2' }) // '?a=1&b=2'
161
+ */
162
+ declare function setQueryString({ qs, key, value, }: {
163
+ qs: string;
164
+ key: string;
165
+ value: string;
166
+ }): string;
167
+ declare const queryString: {
168
+ create: typeof createQueryString;
169
+ parse: typeof parseQueryString;
170
+ get: typeof getQueryString;
171
+ set: typeof setQueryString;
172
+ };
173
+
174
+ export { Choose, ChooseOtherwiseProps, ChooseProps, ChooseWhenProps, Flex, FlexProps, HexToRgbaProps, If, IfProps, JosaProps, MultiLineEllipsisProps, SafeArea, SafeAreaCssValueProps, SafeAreaProps, Spacing, SpacingProps, Validate, VariableType, composeEventHandlers, createContext, ellipsis, getVar, hexToRgba, josa, multiLineEllipsis, queryString, useSafeArea };
package/dist/index.js ADDED
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ Choose: () => Choose,
24
+ Flex: () => Flex,
25
+ If: () => If,
26
+ SafeArea: () => SafeArea,
27
+ Spacing: () => Spacing,
28
+ Validate: () => Validate,
29
+ composeEventHandlers: () => composeEventHandlers,
30
+ createContext: () => createContext,
31
+ ellipsis: () => ellipsis,
32
+ getVar: () => getVar,
33
+ hexToRgba: () => hexToRgba,
34
+ josa: () => josa,
35
+ multiLineEllipsis: () => multiLineEllipsis,
36
+ queryString: () => queryString,
37
+ useSafeArea: () => useSafeArea
38
+ });
39
+ module.exports = __toCommonJS(src_exports);
40
+
41
+ // src/Choose.tsx
42
+ var import_react = require("react");
43
+ var import_jsx_runtime = require("react/jsx-runtime");
44
+ function Choose({ children }) {
45
+ const validChildren = import_react.Children.toArray(children);
46
+ const matchingChild = validChildren.find(
47
+ (child) => (0, import_react.isValidElement)(child) && child.type === Choose.When && child.props.condition
48
+ );
49
+ if (matchingChild) {
50
+ return matchingChild;
51
+ }
52
+ const otherwiseChild = validChildren.find(
53
+ (child) => (0, import_react.isValidElement)(child) && child.type === Choose.Otherwise
54
+ );
55
+ return otherwiseChild || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {});
56
+ }
57
+ var ChooseWhen = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
58
+ ChooseWhen.displayName = "Choose.When";
59
+ var ChooseOtherwise = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
60
+ Choose.When = ChooseWhen;
61
+ Choose.Otherwise = ChooseOtherwise;
62
+
63
+ // src/composeEventHandlers.ts
64
+ function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
65
+ return function handleEvent(event) {
66
+ originalEventHandler?.(event);
67
+ if (checkForDefaultPrevented === false || !event.defaultPrevented) {
68
+ return ourEventHandler?.(event);
69
+ }
70
+ };
71
+ }
72
+
73
+ // src/createContext.tsx
74
+ var import_react2 = require("react");
75
+ var import_jsx_runtime2 = require("react/jsx-runtime");
76
+ function createContext(rootComponentName, defaultContext) {
77
+ const Context = (0, import_react2.createContext)(
78
+ defaultContext
79
+ );
80
+ function Provider(props) {
81
+ const { children, ...contextValues } = props;
82
+ const value = (0, import_react2.useMemo)(
83
+ () => contextValues,
84
+ [contextValues]
85
+ );
86
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Context.Provider, { value, children });
87
+ }
88
+ function useContext(consumerName) {
89
+ const context = (0, import_react2.useContext)(Context);
90
+ if (context == null) {
91
+ throw new Error(
92
+ `${consumerName}\uC740 ${rootComponentName}\uD558\uC704\uC5D0\uC11C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4.`
93
+ );
94
+ }
95
+ return context;
96
+ }
97
+ Provider.displayName = `${rootComponentName}Provider`;
98
+ return [Provider, useContext];
99
+ }
100
+
101
+ // src/getVar.ts
102
+ function getVar(variable, defaultValue) {
103
+ if (defaultValue) {
104
+ return `var(${variable}, ${defaultValue})`;
105
+ }
106
+ return `var(${variable})`;
107
+ }
108
+
109
+ // src/If.tsx
110
+ var import_jsx_runtime3 = require("react/jsx-runtime");
111
+ function If(props) {
112
+ const { condition, children } = props;
113
+ return condition ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children }) : null;
114
+ }
115
+
116
+ // src/Flex.tsx
117
+ var import_react3 = require("react");
118
+ var import_styled_components = require("styled-components");
119
+
120
+ // src/coerceCssPixelValue.ts
121
+ function coerceCssPixelValue(value) {
122
+ return typeof value === "string" ? value : `${value}px`;
123
+ }
124
+
125
+ // src/Flex.tsx
126
+ var import_jsx_runtime4 = require("react/jsx-runtime");
127
+ var Flex = (0, import_react3.memo)(function Flex2(props) {
128
+ const {
129
+ gap = 0,
130
+ justify = "center",
131
+ align = "center",
132
+ direction = "row",
133
+ children,
134
+ ...restProps
135
+ } = props;
136
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
137
+ Container,
138
+ {
139
+ $gap: gap,
140
+ $justify: justify,
141
+ $align: align,
142
+ $direction: direction,
143
+ ...restProps,
144
+ children
145
+ }
146
+ );
147
+ });
148
+ var Container = import_styled_components.styled.div`
149
+ display: flex;
150
+ flex-direction: ${({ $direction }) => $direction};
151
+ gap: ${({ $gap }) => coerceCssPixelValue($gap)};
152
+ align-items: ${({ $align }) => $align};
153
+ justify-content: ${({ $justify }) => $justify};
154
+ `;
155
+
156
+ // src/ellipsis.ts
157
+ var import_styled_components2 = require("styled-components");
158
+ var ellipsis = import_styled_components2.css`
159
+ overflow: hidden;
160
+ white-space: nowrap;
161
+ text-overflow: ellipsis;
162
+ `;
163
+ var multiLineEllipsis = ({ line }) => import_styled_components2.css`
164
+ display: -webkit-box;
165
+ overflow: hidden;
166
+ text-overflow: ellipsis;
167
+ -webkit-line-clamp: ${line};
168
+ -webkit-box-orient: vertical;
169
+ `;
170
+
171
+ // src/hexToRgba.ts
172
+ function parseHexToDecimal(hex) {
173
+ return parseInt(hex, 16);
174
+ }
175
+ function validateHex(hex) {
176
+ const match = /^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.exec(hex);
177
+ if (!match) {
178
+ throw new Error(
179
+ `Invalid hex value: "${hex}". Expected formats: "#RGB", "RGB", "#RRGGBB", or "RRGGBB".`
180
+ );
181
+ }
182
+ return match[1];
183
+ }
184
+ function expandHex(hex) {
185
+ return hex.length === 3 ? hex.split("").map((char) => char + char).join("") : hex;
186
+ }
187
+ function isValidAlpha(alpha) {
188
+ return alpha >= 0 && alpha <= 1;
189
+ }
190
+ function hexToRgba({ hex, alpha = 1 }) {
191
+ if (!isValidAlpha(alpha)) {
192
+ throw new Error(
193
+ `Invalid alpha value. Must be between 0 and 1, received: ${alpha}`
194
+ );
195
+ }
196
+ const validatedHex = validateHex(hex);
197
+ const expandedHex = expandHex(validatedHex);
198
+ const r = parseHexToDecimal(expandedHex.slice(0, 2));
199
+ const g = parseHexToDecimal(expandedHex.slice(2, 4));
200
+ const b = parseHexToDecimal(expandedHex.slice(4, 6));
201
+ return `rgba(${r},${g},${b},${alpha})`;
202
+ }
203
+
204
+ // src/constants/josa.ts
205
+ var COMPLETE_HANGUL_START_CHARCODE = "\uAC00".charCodeAt(0);
206
+ var COMPLETE_HANGUL_END_CHARCODE = "\uD7A3".charCodeAt(0);
207
+ var NUMBER_OF_JONGSEONG = 28;
208
+ var DISASSEMBLED_CONSONANTS_BY_CONSONANT = {
209
+ "": "",
210
+ \u3131: "\u3131",
211
+ \u3132: "\u3132",
212
+ \u3133: "\u3131\u3145",
213
+ \u3134: "\u3134",
214
+ \u3135: "\u3134\u3148",
215
+ \u3136: "\u3134\u314E",
216
+ \u3137: "\u3137",
217
+ \u3138: "\u3138",
218
+ \u3139: "\u3139",
219
+ \u313A: "\u3139\u3131",
220
+ \u313B: "\u3139\u3141",
221
+ \u313C: "\u3139\u3142",
222
+ \u313D: "\u3139\u3145",
223
+ \u313E: "\u3139\u314C",
224
+ \u313F: "\u3139\u314D",
225
+ \u3140: "\u3139\u314E",
226
+ \u3141: "\u3141",
227
+ \u3142: "\u3142",
228
+ \u3143: "\u3143",
229
+ \u3144: "\u3142\u3145",
230
+ \u3145: "\u3145",
231
+ \u3146: "\u3146",
232
+ \u3147: "\u3147",
233
+ \u3148: "\u3148",
234
+ \u3149: "\u3149",
235
+ \u314A: "\u314A",
236
+ \u314B: "\u314B",
237
+ \u314C: "\u314C",
238
+ \u314D: "\u314D",
239
+ \u314E: "\u314E"
240
+ };
241
+ var JONGSEONGS = [
242
+ "",
243
+ "\u3131",
244
+ "\u3132",
245
+ "\u3133",
246
+ "\u3134",
247
+ "\u3135",
248
+ "\u3136",
249
+ "\u3137",
250
+ "\u3139",
251
+ "\u313A",
252
+ "\u313B",
253
+ "\u313C",
254
+ "\u313D",
255
+ "\u313E",
256
+ "\u313F",
257
+ "\u3140",
258
+ "\u3141",
259
+ "\u3142",
260
+ "\u3144",
261
+ "\u3145",
262
+ "\u3146",
263
+ "\u3147",
264
+ "\u3148",
265
+ "\u314A",
266
+ "\u314B",
267
+ "\u314C",
268
+ "\u314D",
269
+ "\u314E"
270
+ ].map((consonant) => DISASSEMBLED_CONSONANTS_BY_CONSONANT[consonant]);
271
+
272
+ // src/hasBatchim.ts
273
+ function hasBatchim(str) {
274
+ const lastChar = str[str.length - 1];
275
+ if (!lastChar)
276
+ return false;
277
+ const charCode = lastChar.charCodeAt(0);
278
+ if (charCode < COMPLETE_HANGUL_START_CHARCODE || charCode > COMPLETE_HANGUL_END_CHARCODE) {
279
+ return false;
280
+ }
281
+ const batchimCode = (charCode - COMPLETE_HANGUL_START_CHARCODE) % NUMBER_OF_JONGSEONG;
282
+ return batchimCode > 0;
283
+ }
284
+
285
+ // src/josa.ts
286
+ function josa(props) {
287
+ const { word, josa: josa2 } = props;
288
+ if (!word) {
289
+ return word;
290
+ }
291
+ return `${word}${josaPicker({
292
+ word,
293
+ josa: josa2
294
+ })}`;
295
+ }
296
+ function josaPicker(props) {
297
+ const { word, josa: josa2 } = props;
298
+ if (!word) {
299
+ return josa2.split("/")[0];
300
+ }
301
+ const has\uBC1B\uCE68 = hasBatchim(word);
302
+ const index = has\uBC1B\uCE68 ? 0 : 1;
303
+ return josa2.split("/")[index];
304
+ }
305
+ josa.pick = josaPicker;
306
+
307
+ // src/Validate.ts
308
+ function isEmail(email) {
309
+ 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,}))$/;
310
+ return regExp.test(email);
311
+ }
312
+ function isPhoneNumber(phoneNumber) {
313
+ const regExpWithHyphen = /^01([0|1|6|7|8|9])-([0-9]{3,4})-([0-9]{4})$/;
314
+ const regExpWithoutHyphen = /^01([0|1|6|7|8|9])([0-9]{3,4})([0-9]{4})$/;
315
+ return regExpWithHyphen.test(phoneNumber) || regExpWithoutHyphen.test(phoneNumber);
316
+ }
317
+ var Validate = {
318
+ email: isEmail,
319
+ phoneNumber: isPhoneNumber
320
+ };
321
+
322
+ // src/Spacing.tsx
323
+ var import_react4 = require("react");
324
+ var import_styled_components3 = require("styled-components");
325
+ var import_jsx_runtime5 = require("react/jsx-runtime");
326
+ var Spacing = (0, import_react4.memo)(function Spacing2(props) {
327
+ const { direction = "horizontal", size, ...restProps } = props;
328
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SpacingContainer, { $direction: direction, $size: size, ...restProps });
329
+ });
330
+ var SpacingContainer = import_styled_components3.styled.div`
331
+ flex: none;
332
+ width: ${({ $direction, $size }) => $direction === "horizontal" ? coerceCssPixelValue($size) : void 0};
333
+ height: ${({ $direction, $size }) => $direction === "vertical" ? coerceCssPixelValue($size) : void 0};
334
+ `;
335
+
336
+ // src/useSafeArea.ts
337
+ var useSafeArea = ({
338
+ top: T = 0,
339
+ bottom: B = 0,
340
+ left: L = 0,
341
+ right: R = 0
342
+ } = {}) => {
343
+ const top = `max(${coerceCssPixelValue(T)}, env(safe-area-inset-top))`;
344
+ const bottom = `max(${coerceCssPixelValue(B)}, env(safe-area-inset-bottom))`;
345
+ const left = `max(${coerceCssPixelValue(L)}, env(safe-area-inset-left))`;
346
+ const right = `max(${coerceCssPixelValue(R)}, env(safe-area-inset-right))`;
347
+ return { top, bottom, left, right };
348
+ };
349
+
350
+ // src/SafeArea.tsx
351
+ var import_react5 = require("react");
352
+ var import_jsx_runtime6 = require("react/jsx-runtime");
353
+ var SafeArea = ({
354
+ as,
355
+ children,
356
+ ...props
357
+ }) => {
358
+ const Component = as || "div";
359
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(Component, { ...props, children: [
360
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SafeAreaTop, {}),
361
+ children,
362
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(SafeAreaBottom, {})
363
+ ] });
364
+ };
365
+ var SafeAreaTop = (0, import_react5.memo)(function SafeAreaTop2(props) {
366
+ const { top } = useSafeArea();
367
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spacing, { ...props, size: top });
368
+ });
369
+ var SafeAreaBottom = (0, import_react5.memo)(function SafeAreaBottom2(props) {
370
+ const { bottom } = useSafeArea();
371
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Spacing, { ...props, size: bottom });
372
+ });
373
+ SafeArea.Top = SafeAreaTop;
374
+ SafeArea.Bottom = SafeAreaBottom;
375
+
376
+ // src/queryString.ts
377
+ function createSearchParamString(params) {
378
+ return new URLSearchParams(
379
+ Object.entries(params).filter(([, value]) => value != null).map(([key, value]) => {
380
+ if (Array.isArray(value)) {
381
+ return value.map((x) => [key, x]);
382
+ }
383
+ return [[key, value]];
384
+ }).flat()
385
+ ).toString().replace(/\+/g, "%20");
386
+ }
387
+ function createQueryString(params) {
388
+ const queryString2 = createSearchParamString(params);
389
+ if (queryString2 === "") {
390
+ return "";
391
+ }
392
+ return `?${queryString2}`;
393
+ }
394
+ function fromEntries(iterable) {
395
+ const result = {};
396
+ for (const [key, value] of Array.from(iterable)) {
397
+ if (result[key]) {
398
+ if (Array.isArray(result[key])) {
399
+ result[key].push(value);
400
+ } else {
401
+ result[key] = [result[key], value];
402
+ }
403
+ } else {
404
+ result[key] = value;
405
+ }
406
+ }
407
+ return result;
408
+ }
409
+ function parseQueryString(queryString2 = typeof location !== "undefined" ? location.search : "") {
410
+ const query = queryString2.trim().replace(/^[?#&]/, "");
411
+ return fromEntries(new URLSearchParams(query));
412
+ }
413
+ function getQueryString(name, parser) {
414
+ const value = queryString.parse()[name];
415
+ if (parser == null || value == null) {
416
+ return value;
417
+ } else {
418
+ return parser(value);
419
+ }
420
+ }
421
+ function setQueryString({
422
+ qs,
423
+ key,
424
+ value
425
+ }) {
426
+ const parsed = parseQueryString(qs);
427
+ return createQueryString({
428
+ ...parsed,
429
+ [key]: value
430
+ });
431
+ }
432
+ var queryString = {
433
+ create: createQueryString,
434
+ parse: parseQueryString,
435
+ get: getQueryString,
436
+ set: setQueryString
437
+ };
438
+ // Annotate the CommonJS export names for ESM import in node:
439
+ 0 && (module.exports = {
440
+ Choose,
441
+ Flex,
442
+ If,
443
+ SafeArea,
444
+ Spacing,
445
+ Validate,
446
+ composeEventHandlers,
447
+ createContext,
448
+ ellipsis,
449
+ getVar,
450
+ hexToRgba,
451
+ josa,
452
+ multiLineEllipsis,
453
+ queryString,
454
+ useSafeArea
455
+ });
456
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/Choose.tsx","../src/composeEventHandlers.ts","../src/createContext.tsx","../src/getVar.ts","../src/If.tsx","../src/Flex.tsx","../src/coerceCssPixelValue.ts","../src/ellipsis.ts","../src/hexToRgba.ts","../src/constants/josa.ts","../src/hasBatchim.ts","../src/josa.ts","../src/Validate.ts","../src/Spacing.tsx","../src/useSafeArea.ts","../src/SafeArea.tsx","../src/queryString.ts"],"sourcesContent":["export {\n Choose,\n type ChooseWhenProps,\n type ChooseProps,\n type ChooseOtherwiseProps,\n} from './Choose';\n\nexport { composeEventHandlers } from './composeEventHandlers';\n\nexport { createContext } from './createContext';\n\nexport { getVar, type VariableType } from './getVar';\n\nexport { If, type IfProps } from './If';\n\nexport { Flex, type FlexProps } from './Flex';\n\nexport {\n ellipsis,\n multiLineEllipsis,\n type MultiLineEllipsisProps,\n} from './ellipsis';\n\nexport { hexToRgba, type HexToRgbaProps } from './hexToRgba';\n\nexport { josa, type JosaProps } from './josa';\n\nexport { Validate } from './Validate';\n\nexport { Spacing, type SpacingProps } from './Spacing';\n\nexport { useSafeArea, type SafeAreaCssValueProps } from './useSafeArea';\n\nexport { SafeArea, type SafeAreaProps } from './SafeArea';\n\nexport { queryString } from './queryString';\n","import { isValidElement, type ReactNode, type FC, Children } from 'react';\n\nexport type ChooseWhenProps = {\n condition: boolean;\n children: ReactNode;\n};\n\nexport type ChooseProps = {\n children: ReactNode;\n};\n\nexport type ChooseOtherwiseProps = {\n children: ReactNode;\n};\n\nexport function Choose({ children }: ChooseProps) {\n const validChildren = Children.toArray(children);\n\n const matchingChild = validChildren.find(\n (child) =>\n isValidElement<ChooseWhenProps>(child) &&\n child.type === Choose.When &&\n child.props.condition\n );\n\n if (matchingChild) {\n return matchingChild;\n }\n\n const otherwiseChild = validChildren.find(\n (child) => isValidElement(child) && child.type === Choose.Otherwise\n );\n\n return otherwiseChild || <></>;\n}\n\nconst ChooseWhen: FC<ChooseWhenProps> = ({ children }) => <>{children}</>;\nChooseWhen.displayName = 'Choose.When';\n\nconst ChooseOtherwise: FC<ChooseOtherwiseProps> = ({ children }) => (\n <>{children}</>\n);\n\nChoose.When = ChooseWhen;\nChoose.Otherwise = ChooseOtherwise;\n","// @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","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","export type VariableType = `--${string}`;\n\nexport function getVar(variable: VariableType, defaultValue?: string) {\n if (defaultValue) {\n return `var(${variable}, ${defaultValue})`;\n }\n\n return `var(${variable})`;\n}\n","import { type ReactNode } from 'react';\n\nexport type IfProps = {\n condition: boolean;\n children: ReactNode;\n};\n\nexport function If(props: IfProps) {\n const { condition, children } = props;\n\n return condition ? <>{children}</> : null;\n}\n","import { memo, type CSSProperties, type HTMLAttributes } from 'react';\nimport { styled } from 'styled-components';\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\n $gap={gap}\n $justify={justify}\n $align={align}\n $direction={direction}\n {...restProps}\n >\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","export type CSSPixelValue = string | number;\n\nexport function coerceCssPixelValue(value: CSSPixelValue): string {\n return typeof value === 'string' ? value : `${value}px`;\n}\n","import { css } from 'styled-components';\n\nexport type MultiLineEllipsisProps = {\n line: number;\n};\n\nexport const ellipsis = css`\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\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","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","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","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","import { hasBatchim } from './hasBatchim';\n\ntype JosaOption = '이/가' | '을/를' | '은/는';\n\ntype ExtractJosaOption<T> = T extends `${infer A}/${infer B}` ? A | B : never;\n\nexport type JosaProps<U extends JosaOption> = {\n word: string;\n josa: U;\n};\n\n/**\n * 주어진 단어와 조사 옵션을 기반으로 올바른 조사를 반환합니다.\n * @returns 단어와 올바른 조사가 결합된 문자열\n */\nexport function josa<U extends JosaOption>(\n props: JosaProps<U>\n): `${JosaProps<U>['word']}${ExtractJosaOption<U>}` {\n const { word, josa } = props;\n\n if (!word) {\n return word as `${JosaProps<U>['word']}${ExtractJosaOption<U>}`;\n }\n\n return `${word}${josaPicker({\n word,\n josa,\n })}` as `${JosaProps<U>['word']}${ExtractJosaOption<U>}`;\n}\n\n/**\n * 주어진 단어와 조사 옵션을 기반으로 올바른 조사를 선택합니다.\n * @returns 올바른 조사\n */\nfunction josaPicker<U extends JosaOption>(\n props: JosaProps<U>\n): ExtractJosaOption<U> {\n const { word, josa } = props;\n\n if (!word) {\n return josa.split('/')[0] as ExtractJosaOption<U>;\n }\n\n const has받침 = hasBatchim(word);\n const index = has받침 ? 0 : 1;\n\n return josa.split('/')[index] as ExtractJosaOption<U>;\n}\n\njosa.pick = josaPicker;\n","/**\n *\n * @see 이메일 주소가 RFC 5322 표준을 따르는지 검사합니다. {@link https://emailregex.com/}\n */\nfunction isEmail(email: string) {\n const regExp =\n /^(([^<>()\\[\\]\\\\.,;:\\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,}))$/;\n return regExp.test(email);\n}\n\nfunction isPhoneNumber(phoneNumber: string) {\n // 하이픈 있는 형식\n const regExpWithHyphen = /^01([0|1|6|7|8|9])-([0-9]{3,4})-([0-9]{4})$/;\n // 하이픈 없는 형식\n const regExpWithoutHyphen = /^01([0|1|6|7|8|9])([0-9]{3,4})([0-9]{4})$/;\n\n return (\n regExpWithHyphen.test(phoneNumber) || regExpWithoutHyphen.test(phoneNumber)\n );\n}\n\nexport const Validate = {\n email: isEmail,\n phoneNumber: isPhoneNumber,\n};\n","import { memo, type HTMLAttributes } from 'react';\nimport { styled } from 'styled-components';\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 = 'horizontal', size, ...restProps } = props;\n\n return (\n <SpacingContainer $direction={direction} $size={size} {...restProps} />\n );\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","import { coerceCssPixelValue, type CSSPixelValue } from './coerceCssPixelValue';\n\nexport type SafeAreaCssValueProps = {\n top?: CSSPixelValue;\n bottom?: CSSPixelValue;\n left?: CSSPixelValue;\n right?: CSSPixelValue;\n};\n\nconst useSafeArea = ({\n top: T = 0,\n bottom: B = 0,\n left: L = 0,\n right: R = 0,\n}: SafeAreaCssValueProps = {}) => {\n const top = `max(${coerceCssPixelValue(T)}, env(safe-area-inset-top))`;\n const bottom = `max(${coerceCssPixelValue(B)}, env(safe-area-inset-bottom))`;\n const left = `max(${coerceCssPixelValue(L)}, env(safe-area-inset-left))`;\n const right = `max(${coerceCssPixelValue(R)}, env(safe-area-inset-right))`;\n\n return { top, bottom, left, right };\n};\n\nexport { useSafeArea };\n","import React, {\n memo,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\n\nimport { Spacing } from './Spacing';\nimport { useSafeArea } from './useSafeArea';\n\nexport type SafeAreaProps<T extends React.ElementType = 'div'> = {\n as?: T;\n children: ReactNode;\n} & ComponentPropsWithoutRef<T>;\n\nexport const SafeArea = <T extends React.ElementType = 'div'>({\n as,\n children,\n ...props\n}: SafeAreaProps<T>) => {\n const Component = as || 'div';\n\n return (\n <Component {...props}>\n <SafeAreaTop />\n {children}\n <SafeAreaBottom />\n </Component>\n );\n};\n\nconst SafeAreaTop = memo(function SafeAreaTop(\n props: Omit<ComponentPropsWithoutRef<typeof Spacing>, 'size'>\n) {\n const { top } = useSafeArea();\n return <Spacing {...props} size={top} />;\n});\n\nconst SafeAreaBottom = memo(function SafeAreaBottom(\n props: Omit<ComponentPropsWithoutRef<typeof Spacing>, 'size'>\n) {\n const { bottom } = useSafeArea();\n return <Spacing {...props} size={bottom} />;\n});\n\nSafeArea.Top = SafeAreaTop;\nSafeArea.Bottom = SafeAreaBottom;\n","/**\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]>(\n iterable: Iterable<T>\n) {\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>(\n name: string,\n parser: (val: string) => T\n): T | undefined;\nfunction getQueryString<T = string>(name: string, parser?: (val: string) => T) {\n const value = queryString.parse<{ [name: string]: string | undefined }>()[\n name\n ];\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({\n qs,\n key,\n value,\n}: {\n qs: string;\n key: string;\n value: string;\n}) {\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":"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","names":["import_react","import_jsx_runtime","createContextRaw","useContextRaw","import_jsx_runtime","import_react","import_jsx_runtime","Flex","import_styled_components","josa","import_react","import_styled_components","import_jsx_runtime","Spacing","import_react","import_jsx_runtime","SafeAreaTop","SafeAreaBottom","queryString"]}