@jho951/ui-components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,401 @@
1
+ /* ui/icon/Icon.module.css */
2
+ .icon {
3
+ display: inline-block;
4
+ vertical-align: middle;
5
+ flex: 0 0 auto;
6
+ }
7
+ .registry {
8
+ }
9
+ .remote {
10
+ }
11
+ .placeholder {
12
+ border-radius: 6px;
13
+ background: currentColor;
14
+ opacity: 0.12;
15
+ }
16
+
17
+ /* ui/arrow/Arrow.module.css */
18
+ .container {
19
+ display: inline-flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ transition: transform 0.3s ease-in-out;
23
+ transform: rotate(var(--arrow-rotation, 0deg));
24
+ }
25
+ .rotate {
26
+ transform: rotate(180deg);
27
+ }
28
+
29
+ /* ui/backdrop/BackDrop.module.css */
30
+ .backdrop {
31
+ position: fixed;
32
+ top: 0;
33
+ left: 0;
34
+ right: 0;
35
+ bottom: 0;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ z-index: calc(var(--z-index, 1000) + 5);
40
+ opacity: 0;
41
+ visibility: hidden;
42
+ transition: opacity 0.3s ease, visibility 0.3s ease;
43
+ will-change: opacity, backdrop-filter;
44
+ }
45
+ .backdrop.is-active {
46
+ opacity: 1;
47
+ visibility: visible;
48
+ pointer-events: auto;
49
+ }
50
+ .blur {
51
+ background-color: rgba(var(--color-black-rgb, 0, 0, 0), 0.4);
52
+ -webkit-backdrop-filter: blur(var(--blur, 8px)) saturate(160%);
53
+ backdrop-filter: blur(var(--blur, 8px)) saturate(160%);
54
+ }
55
+ .transparent {
56
+ background-color: transparent;
57
+ -webkit-backdrop-filter: none;
58
+ backdrop-filter: none;
59
+ }
60
+
61
+ /* ui/spinner/Spinner.module.css */
62
+ .spinner {
63
+ display: inline-flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ animation: spin 1s linear infinite;
67
+ }
68
+ @keyframes spin {
69
+ from {
70
+ transform: rotate(0deg);
71
+ }
72
+ to {
73
+ transform: rotate(360deg);
74
+ }
75
+ }
76
+ @media (prefers-reduced-motion: reduce) {
77
+ .spinner {
78
+ animation-duration: 2s;
79
+ }
80
+ }
81
+
82
+ /* ui/button/Button.module.css */
83
+ .button {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ border: none;
88
+ border-radius: var(--border-radius, 2rem);
89
+ color: var(--color-white, #ffffff);
90
+ transition: background-color 0.3s ease, transform 0.2s ease;
91
+ cursor: pointer;
92
+ }
93
+ .primary {
94
+ background-color: var(--color-primary, #f0f0f0);
95
+ }
96
+ .secondary {
97
+ background-color: var(--color-second-gray, #f0f0f0);
98
+ color: var(--color-white, #ffffff);
99
+ }
100
+ .ghost {
101
+ background-color: transparent;
102
+ color: var(--color-primary, #f0f0f0);
103
+ border: 1px solid var(--color-primary, #f0f0f0);
104
+ }
105
+ .text {
106
+ background-color: transparent;
107
+ color: var(--color-black, #f0f0f0);
108
+ }
109
+ .disabled {
110
+ background-color: var(--color-gray, #e6e9ef);
111
+ cursor: not-allowed;
112
+ }
113
+ .s {
114
+ font-size: var(--font-s, 1.4rem);
115
+ padding: var(--button-size-s, 0.5rem 1rem);
116
+ }
117
+ .m {
118
+ font-size: var(--font-m, 1.6rem);
119
+ padding: var(--button-size-m, 0.7rem 1.8rem);
120
+ }
121
+ .l {
122
+ font-size: var(--font-l, 1.8rem);
123
+ padding: var(--button-size-l, 0.9rem 2.5rem);
124
+ }
125
+
126
+ /* ui/card/Card.module.css */
127
+ .card {
128
+ display: flex;
129
+ flex-direction: column;
130
+ padding: 2rem;
131
+ border-radius: 1.2rem;
132
+ }
133
+ .header {
134
+ margin-bottom: 1rem;
135
+ font-weight: bold;
136
+ font-size: 1.8rem;
137
+ }
138
+ .footer {
139
+ margin-top: 1.5rem;
140
+ display: flex;
141
+ justify-content: flex-end;
142
+ gap: 1rem;
143
+ }
144
+
145
+ /* ui/label/Label.module.css */
146
+ .label {
147
+ display: block;
148
+ font-size: 0.95rem;
149
+ font-weight: 500;
150
+ color: var(--color-text);
151
+ margin-bottom: 0.4rem;
152
+ }
153
+ .required {
154
+ color: var(--color-danger);
155
+ margin-left: 0.25rem;
156
+ }
157
+ .default {
158
+ text-align: left;
159
+ }
160
+ .inline {
161
+ display: inline-block;
162
+ margin-bottom: 0;
163
+ margin-right: 0.5rem;
164
+ vertical-align: middle;
165
+ }
166
+ .capsule {
167
+ display: inline-block;
168
+ background: rgba(var(--color-primary-rgb), 0.1);
169
+ color: var(--color-primary);
170
+ padding: 0.2rem 0.6rem;
171
+ border-radius: 999px;
172
+ font-size: 0.75rem;
173
+ font-weight: 600;
174
+ }
175
+ .error {
176
+ color: var(--color-danger);
177
+ }
178
+ .floating {
179
+ position: absolute;
180
+ top: 0.5rem;
181
+ left: 1rem;
182
+ font-size: 0.75rem;
183
+ color: var(--color-secondary-gray);
184
+ pointer-events: none;
185
+ transition: 0.2s ease;
186
+ }
187
+ .filled {
188
+ display: block;
189
+ background: var(--color-surface, #f5f7fb);
190
+ color: var(--color-primary, #414e92);
191
+ border-radius: 0.5rem 0.5rem 0 0;
192
+ padding: 0.5rem 1rem 0.25rem 1rem;
193
+ font-weight: 600;
194
+ }
195
+ .outlined {
196
+ display: block;
197
+ color: var(--color-primary, #414e92);
198
+ border: 1.5px solid var(--color-primary, #414e92);
199
+ border-radius: 0.5rem;
200
+ padding: 0.45rem 1rem 0.3rem 1rem;
201
+ background: transparent;
202
+ font-weight: 600;
203
+ }
204
+
205
+ /* ui/checkbox/CheckBox.module.css */
206
+ .container {
207
+ display: inline-flex;
208
+ align-items: center;
209
+ cursor: pointer;
210
+ gap: 1rem;
211
+ }
212
+ .checkBox {
213
+ width: 18px;
214
+ height: 18px;
215
+ border: 2px solid #d9d9d9;
216
+ border-radius: 2px;
217
+ display: flex;
218
+ align-items: center;
219
+ justify-content: center;
220
+ transition: all 0.2s;
221
+ background-color: #fff;
222
+ }
223
+ .checked + .checkBox,
224
+ .indeterminate + .checkBox {
225
+ background-color: #1890ff;
226
+ border-color: #1890ff;
227
+ }
228
+ .error {
229
+ border-color: var(--error-color);
230
+ }
231
+ .disabled {
232
+ cursor: not-allowed;
233
+ opacity: 0.5;
234
+ }
235
+
236
+ /* ui/divider/Divider.module.css */
237
+ .divider {
238
+ height: 0.1rem;
239
+ background: var(--color-border, 0.1rem);
240
+ margin: 0.2rem 0.6rem;
241
+ opacity: 0.7;
242
+ }
243
+
244
+ /* ui/form/Form.module.css */
245
+ .container {
246
+ width: 100%;
247
+ display: flex;
248
+ flex-direction: column;
249
+ gap: var(--gap);
250
+ }
251
+
252
+ /* ui/modal/Modal.module.css */
253
+ .container {
254
+ position: fixed;
255
+ inset: 0;
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ z-index: calc(var(--z-index) + 100);
260
+ pointer-events: none;
261
+ }
262
+ .overlay {
263
+ pointer-events: auto;
264
+ }
265
+ .modal {
266
+ width: 90%;
267
+ max-height: 85vh;
268
+ display: flex;
269
+ flex-direction: column;
270
+ background-color: var(--color-bg);
271
+ border-radius: var(--radius);
272
+ box-shadow: 0 20px 25px -5px rgba(var(--color-text), 0.1), 0 10px 10px -5px rgba(var(--color-text), 0.04);
273
+ opacity: 0;
274
+ transform: scale(0.95) translateY(10px);
275
+ transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), opacity 0.2s ease;
276
+ pointer-events: auto;
277
+ }
278
+ .modal.show {
279
+ opacity: 1;
280
+ transform: scale(1) translateY(0);
281
+ }
282
+ .small {
283
+ max-width: 400px;
284
+ }
285
+ .medium {
286
+ max-width: 640px;
287
+ }
288
+ .large {
289
+ max-width: 1024px;
290
+ }
291
+ .full {
292
+ width: 100vw;
293
+ height: 100vh;
294
+ max-height: 100vh;
295
+ border-radius: 0;
296
+ }
297
+ .header {
298
+ padding: 1rem 1.5rem;
299
+ display: flex;
300
+ align-items: center;
301
+ justify-content: space-between;
302
+ border-bottom: 1px solid var(--color-border);
303
+ }
304
+ .title {
305
+ font-size: 1.25rem;
306
+ font-weight: 600;
307
+ margin: 0;
308
+ }
309
+ .content {
310
+ padding: 1.5rem;
311
+ overflow-y: auto;
312
+ flex: 1;
313
+ }
314
+ .closeBtn {
315
+ padding: 4px;
316
+ border-radius: 6px;
317
+ transition: background 0.2s;
318
+ }
319
+ .closeBtn:hover {
320
+ background-color: var(--color-gray-hover);
321
+ }
322
+
323
+ /* ui/tag/Tag.module.css */
324
+ .tag {
325
+ display: inline-flex;
326
+ align-items: center;
327
+ padding: 0.2em 0.8em;
328
+ font-size: 0.88rem;
329
+ font-weight: 500;
330
+ border-radius: 1em;
331
+ background: var(--color-tag-bg, #f3f4f7);
332
+ color: var(--color-tag-text, #444);
333
+ margin: 0 0.2em 0.2em 0;
334
+ transition: background 0.18s, color 0.18s;
335
+ cursor: default;
336
+ }
337
+ .default {
338
+ background: var(--color-tag-bg, #f3f4f7);
339
+ color: var(--color-tag-text, #444);
340
+ }
341
+ .primary {
342
+ background: var(--color-primary-bg, #eaf1fb);
343
+ color: var(--color-primary, #2955c7);
344
+ }
345
+ .secondary {
346
+ background: var(--color-secondary-bg, #f1eaff);
347
+ color: var(--color-secondary, #6f3ed4);
348
+ }
349
+ .danger {
350
+ background: var(--color-danger-bg, #ffe7e7);
351
+ color: var(--color-danger, #e74c3c);
352
+ }
353
+ .active {
354
+ box-shadow: 0 0 0 2px var(--color-primary, #2955c7);
355
+ background: var(--color-active-bg, #e3edfd);
356
+ color: var(--color-primary-dark, #1a305d);
357
+ }
358
+
359
+ /* ui/textarea/Textarea.module.css */
360
+ .textarea {
361
+ width: 100%;
362
+ padding: 0.6rem 1.5rem;
363
+ border: 1px solid var(--color-bg);
364
+ background-color: rgba(var(--color-gray-rgb), 0.4);
365
+ border-radius: var(--base-radius);
366
+ outline: none;
367
+ transition: border-color 0.2s ease;
368
+ font-family: inherit;
369
+ font-size: 1.2rem;
370
+ resize: vertical;
371
+ }
372
+ .textarea:focus {
373
+ border: 1px solid var(--color-primary);
374
+ background: #fff;
375
+ }
376
+ .textarea.error {
377
+ border-color: var(--color-danger);
378
+ outline-color: var(--color-danger);
379
+ }
380
+ .textarea:disabled {
381
+ background: #f5f5f5;
382
+ color: #bbb;
383
+ cursor: not-allowed;
384
+ opacity: 0.7;
385
+ }
386
+ .textarea::placeholder {
387
+ color: var(--color-secondary-gray);
388
+ font-size: inherit;
389
+ }
390
+ .textarea.sm {
391
+ font-size: 1.2rem;
392
+ }
393
+ .textarea.md {
394
+ font-size: 1.6rem;
395
+ }
396
+ .textarea.lg {
397
+ font-size: 2rem;
398
+ }
399
+ .autoResize {
400
+ resize: none;
401
+ }
@@ -0,0 +1,211 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React$1 from 'react';
3
+ import React__default, { ButtonHTMLAttributes, ReactNode, HTMLAttributes, ForwardRefExoticComponent, RefAttributes, FC, SVGAttributes, LabelHTMLAttributes, TextareaHTMLAttributes } from 'react';
4
+ export { SVG_ASSETS } from '../assert/index.js';
5
+
6
+ type ArrowDirection = 'up' | 'down' | 'left' | 'right';
7
+ interface ArrowProps {
8
+ size?: number;
9
+ direction?: ArrowDirection;
10
+ className?: string;
11
+ }
12
+
13
+ declare const Arrow: ({ size, direction, className }: ArrowProps) => react_jsx_runtime.JSX.Element;
14
+
15
+ declare const DIRECTION_MAP: Record<ArrowDirection, string>;
16
+
17
+ declare const BackDrop: ({ visible, onClick, className, variant }: BackDropProps) => react_jsx_runtime.JSX.Element | null;
18
+
19
+ interface BackDropProps {
20
+ /** 백드롭 표시 여부 */
21
+ visible?: boolean;
22
+ /** 클릭 시 실행될 핸들러 (보통 닫기 기능) */
23
+ onClick?: (event: React__default.MouseEvent<HTMLDivElement>) => void;
24
+ /** 커스텀 클래스 */
25
+ className?: string;
26
+ /** 투명도 조절 여부 (선택 사항) */
27
+ variant?: 'dark' | 'transparent' | 'blur';
28
+ }
29
+
30
+ /** 버튼 타입 정의 */
31
+ type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'text';
32
+ /** 버튼 크기 정의 */
33
+ type ButtonSize = 's' | 'm' | 'l';
34
+ /**
35
+ * 공통 버튼 속성 정의 (버튼/링크 모두 공유)
36
+ * 실제 button 엘리먼트에 필요한 props까지 확장
37
+ */
38
+ interface BaseButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
39
+ /** 버튼의 텍스트 또는 요소 */
40
+ children: ReactNode;
41
+ /** 버튼의 시각적 스타일 지정 */
42
+ variant?: ButtonVariant;
43
+ /** 버튼의 크기 선택 */
44
+ size?: ButtonSize;
45
+ /** 커스텀 클래스 이름을 추가하여 스타일을 확장합니다. */
46
+ className?: string;
47
+ /** 버튼 활성화 여부 */
48
+ disabled?: boolean;
49
+ }
50
+ interface ButtonProps extends BaseButtonProps {
51
+ isLoading?: boolean;
52
+ loadingText?: string;
53
+ leftIcon?: ReactNode;
54
+ rightIcon?: ReactNode;
55
+ }
56
+
57
+ /**
58
+ * Button (실제 사용될 인터페이스 컴포넌트)
59
+ * 비즈니스 로직(로딩 시 Spinner 렌더링)을 캡슐화합니다.
60
+ */
61
+ declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
62
+
63
+ declare const BUTTON_SIZES: ButtonSize[];
64
+ declare const BUTTON_VARIANTS: ButtonVariant[];
65
+
66
+ /**
67
+ * 카드 섹션을 생성하는 팩토리 함수입니다. (캡슐화)
68
+ * @param name 섹션의 이름 (Header, Body, Footer 등)
69
+ */
70
+ declare const createCardSection: (name: CardSectionType) => React__default.FC<SectionProps>;
71
+
72
+ declare const Card: CardComponent;
73
+
74
+ type CardSectionType = 'Header' | 'Body' | 'Footer';
75
+ type SectionProps = HTMLAttributes<HTMLElement> & {
76
+ className?: string;
77
+ children?: ReactNode;
78
+ };
79
+ interface CardProps extends HTMLAttributes<HTMLElement> {
80
+ className?: string;
81
+ children?: ReactNode;
82
+ }
83
+ interface CardComponent extends ForwardRefExoticComponent<CardProps & RefAttributes<HTMLElement>> {
84
+ Header: FC<SectionProps>;
85
+ Body: FC<SectionProps>;
86
+ Footer: FC<SectionProps>;
87
+ }
88
+ interface FormCardProps extends CardProps {
89
+ onSubmit?: (e: React.FormEvent) => void;
90
+ }
91
+
92
+ declare const Checkbox: React__default.ForwardRefExoticComponent<CheckboxProps & React__default.RefAttributes<HTMLInputElement>>;
93
+
94
+ interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {
95
+ label?: string;
96
+ error?: boolean;
97
+ indeterminate?: boolean;
98
+ }
99
+
100
+ declare const Divider: () => react_jsx_runtime.JSX.Element;
101
+
102
+ declare const Form: ({ children, onSubmit, className, ...rest }: FormProps) => react_jsx_runtime.JSX.Element;
103
+
104
+ interface FormProps extends React__default.FormHTMLAttributes<HTMLFormElement> {
105
+ children: React__default.ReactNode;
106
+ onSubmit: (e: React__default.FormEvent<HTMLFormElement>) => void;
107
+ className?: string;
108
+ }
109
+
110
+ type IconSource = "registry" | "url" | "auto";
111
+ type IconName = string;
112
+ type SvgTag = "path" | "rect" | "circle" | "ellipse" | "line" | "polyline" | "polygon";
113
+ type IconElement = {
114
+ el: SvgTag;
115
+ } & SVGAttributes<SVGElement>;
116
+ interface IconData {
117
+ vb: string;
118
+ g?: IconElement[];
119
+ raw?: string;
120
+ src?: string;
121
+ }
122
+ type IconRegistry = Record<string, IconData>;
123
+ type IconProps = {
124
+ name: IconName;
125
+ size?: number;
126
+ title?: string;
127
+ color?: string;
128
+ /** registry/url/auto */
129
+ source?: IconSource;
130
+ /** url 모드에서 직접 경로 지정 */
131
+ src?: string;
132
+ /** 기본: "/assert/icons" (프로젝트가 assert에 svg 넣는 컨벤션) */
133
+ basePath?: string;
134
+ ext?: string;
135
+ /** (옵션) 레지스트리 주입 */
136
+ icons?: IconRegistry;
137
+ } & Omit<SVGAttributes<SVGSVGElement>, "children">;
138
+
139
+ declare const Icon: ({ name, size, title, color, source, src, basePath, ext, icons, className, style, ...rest }: IconProps) => react_jsx_runtime.JSX.Element;
140
+
141
+ declare function getRegistryIcon(name: string, registry?: IconRegistry | null): IconData | undefined;
142
+ declare function isExternalSvgPath(p: string): boolean;
143
+ declare function resolveIconSrc(name: string, src?: string, basePath?: string, ext?: string): string;
144
+ declare function getAriaProps(title?: string): {
145
+ readonly role: "img";
146
+ readonly "aria-label": string;
147
+ readonly "aria-hidden"?: undefined;
148
+ } | {
149
+ readonly "aria-hidden": true;
150
+ readonly role?: undefined;
151
+ readonly "aria-label"?: undefined;
152
+ };
153
+ declare function useInlineSvg(src?: string): string | null;
154
+ declare function extractSvgInner(svgText: string): string;
155
+ declare function extractViewBox(svgText: string, fallback?: string): string;
156
+
157
+ declare const Label: ({ className, children, htmlFor, required, variant, ...rest }: LabelProps) => react_jsx_runtime.JSX.Element;
158
+
159
+ type LabelVariant = 'default' | 'inline' | 'capsule' | 'error' | 'floating' | 'filled' | 'outlined';
160
+ interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {
161
+ required?: boolean;
162
+ variant?: LabelVariant;
163
+ }
164
+
165
+ interface ModalProps {
166
+ isOpen: boolean;
167
+ content: string;
168
+ onClose: () => void;
169
+ title?: string;
170
+ size?: 'small' | 'medium' | 'large' | 'full';
171
+ }
172
+
173
+ declare const Modal: ({ isOpen, content, onClose, title, size }: ModalProps) => React$1.ReactPortal | null;
174
+
175
+ /**
176
+ * `Spinner` 컴포넌트는 시스템의 로딩 상태를 시각적으로 나타냅니다.
177
+ * - `Icon` 컴포넌트의 'spinner' 아이콘을 기반으로 작동합니다.
178
+ * - CSS 애니메이션을 통해 무한 회전하며, 접근성을 고려하여 `role="status"`를 포함합니다.
179
+ *
180
+ * ### 사용 예시
181
+ * ```tsx
182
+ * <Spinner size={32} label="데이터 불러오는 중" />
183
+ * ```
184
+ */
185
+ declare const Spinner: ({ size, className, label }: SpinnerProps) => react_jsx_runtime.JSX.Element;
186
+
187
+ interface SpinnerProps {
188
+ /** 아이콘 크기(px) */
189
+ size?: number;
190
+ /** 추가 클래스명 */
191
+ className?: string;
192
+ /** 스크린리더용 라벨 (기본: "Loading") */
193
+ label?: string;
194
+ }
195
+
196
+ declare const Tag: ({ active, color, children }: TagProps) => react_jsx_runtime.JSX.Element;
197
+
198
+ type TagColor = 'default' | 'primary' | 'secondary' | 'danger';
199
+ interface TagProps {
200
+ children: React__default.ReactNode;
201
+ active?: boolean;
202
+ color?: TagColor;
203
+ }
204
+
205
+ declare const Textarea: React__default.ForwardRefExoticComponent<TextareaProps & React__default.RefAttributes<HTMLTextAreaElement>>;
206
+
207
+ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
208
+ autoResize?: boolean;
209
+ }
210
+
211
+ export { Arrow, type ArrowDirection, type ArrowProps, BUTTON_SIZES, BUTTON_VARIANTS, BackDrop, type BackDropProps, type BaseButtonProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Card, type CardComponent, type CardProps, type CardSectionType, Checkbox, type CheckboxProps, DIRECTION_MAP, Divider, Form, type FormCardProps, type FormProps, Icon, type IconData, type IconElement, type IconName, type IconProps, type IconRegistry, type IconSource, Label, type LabelProps, type LabelVariant, Modal, type ModalProps, type SectionProps, Spinner, type SpinnerProps, type SvgTag, Tag, type TagColor, type TagProps, Textarea, type TextareaProps, createCardSection, extractSvgInner, extractViewBox, getAriaProps, getRegistryIcon, isExternalSvgPath, resolveIconSrc, useInlineSvg };
@@ -0,0 +1,58 @@
1
+ import {
2
+ Arrow,
3
+ BUTTON_SIZES,
4
+ BUTTON_VARIANTS,
5
+ BackDrop,
6
+ Button,
7
+ Card,
8
+ Checkbox,
9
+ DIRECTION_MAP,
10
+ Divider,
11
+ Form,
12
+ Icon,
13
+ Label,
14
+ Modal,
15
+ Spinner,
16
+ Tag,
17
+ Textarea,
18
+ createCardSection,
19
+ extractSvgInner,
20
+ extractViewBox,
21
+ getAriaProps,
22
+ getRegistryIcon,
23
+ isExternalSvgPath,
24
+ resolveIconSrc,
25
+ useInlineSvg
26
+ } from "../chunk-SOIXNSFH.js";
27
+ import {
28
+ SVG_ASSETS
29
+ } from "../chunk-PLGHTHAJ.js";
30
+ import "../chunk-VRIA2QTM.js";
31
+ import "../chunk-Q55QXUNN.js";
32
+ export {
33
+ Arrow,
34
+ BUTTON_SIZES,
35
+ BUTTON_VARIANTS,
36
+ BackDrop,
37
+ Button,
38
+ Card,
39
+ Checkbox,
40
+ DIRECTION_MAP,
41
+ Divider,
42
+ Form,
43
+ Icon,
44
+ Label,
45
+ Modal,
46
+ SVG_ASSETS,
47
+ Spinner,
48
+ Tag,
49
+ Textarea,
50
+ createCardSection,
51
+ extractSvgInner,
52
+ extractViewBox,
53
+ getAriaProps,
54
+ getRegistryIcon,
55
+ isExternalSvgPath,
56
+ resolveIconSrc,
57
+ useInlineSvg
58
+ };
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@jho951/ui-components",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist/**",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "sideEffects": [
15
+ "**/*.css"
16
+ ],
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./ui": {
23
+ "types": "./dist/ui/index.d.ts",
24
+ "import": "./dist/ui/index.js"
25
+ },
26
+ "./assert": {
27
+ "types": "./dist/assert/index.d.ts",
28
+ "import": "./dist/assert/index.js"
29
+ },
30
+ "./theme.css": "./dist/assert/style/theme.css",
31
+ "./reset.css": "./dist/assert/style/reset.css",
32
+ "./utils.css": "./dist/assert/style/class.css"
33
+ },
34
+ "peerDependencies": {
35
+ "react": "^18",
36
+ "react-dom": "^18"
37
+ },
38
+ "scripts": {
39
+ "build": "tsup",
40
+ "prepublishOnly": "pnpm run build"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.11.30",
44
+ "@types/react": "^18.3.27",
45
+ "@types/react-dom": "^18.3.1",
46
+ "tsup": "^8.5.1",
47
+ "typescript": "^5.9.3"
48
+ },
49
+ "license": "MIT",
50
+ "publishConfig": {
51
+ "access": "public"
52
+ }
53
+ }