@loword/loword-design-system 0.0.5 → 0.0.7

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 (74) hide show
  1. package/dist/components/Icon/LucideIcon.d.ts.map +1 -1
  2. package/dist/components/Icon/LucideIcon.js +9 -1
  3. package/dist/components/LDAnchor/AnchorBase.d.ts +24 -0
  4. package/dist/components/LDAnchor/AnchorBase.d.ts.map +1 -0
  5. package/dist/components/LDAnchor/AnchorBase.js +69 -0
  6. package/dist/components/LDAnchor/LDAnchor.d.ts +10 -0
  7. package/dist/components/LDAnchor/LDAnchor.d.ts.map +1 -0
  8. package/dist/components/LDAnchor/LDAnchor.js +14 -0
  9. package/dist/components/LDAutoComplete/AutoCompleteBase.d.ts +36 -0
  10. package/dist/components/LDAutoComplete/AutoCompleteBase.d.ts.map +1 -0
  11. package/dist/components/LDAutoComplete/AutoCompleteBase.js +175 -0
  12. package/dist/components/LDAutoComplete/LDAutoComplete.d.ts +19 -0
  13. package/dist/components/LDAutoComplete/LDAutoComplete.d.ts.map +1 -0
  14. package/dist/components/LDAutoComplete/LDAutoComplete.js +7 -0
  15. package/dist/components/LDEditor/EditorBase.js +1 -1
  16. package/dist/components/LDEditor/LDEditor.d.ts.map +1 -1
  17. package/dist/components/LDEditor/LDEditor.js +1 -1
  18. package/dist/components/LDFileUpload/FileUploadBase.d.ts +52 -0
  19. package/dist/components/LDFileUpload/FileUploadBase.d.ts.map +1 -0
  20. package/dist/components/LDFileUpload/FileUploadBase.js +186 -0
  21. package/dist/components/LDFileUpload/LDFileUpload.d.ts +16 -0
  22. package/dist/components/LDFileUpload/LDFileUpload.d.ts.map +1 -0
  23. package/dist/components/LDFileUpload/LDFileUpload.js +8 -0
  24. package/dist/components/LDFileUpload/LDFileUploadList.d.ts +17 -0
  25. package/dist/components/LDFileUpload/LDFileUploadList.d.ts.map +1 -0
  26. package/dist/components/LDFileUpload/LDFileUploadList.js +8 -0
  27. package/dist/components/LDFileUpload/LDImageUpload.d.ts +16 -0
  28. package/dist/components/LDFileUpload/LDImageUpload.d.ts.map +1 -0
  29. package/dist/components/LDFileUpload/LDImageUpload.js +8 -0
  30. package/dist/components/LDFileUpload/LDImageUploadList.d.ts +17 -0
  31. package/dist/components/LDFileUpload/LDImageUploadList.d.ts.map +1 -0
  32. package/dist/components/LDFileUpload/LDImageUploadList.js +8 -0
  33. package/dist/components/LDInput/LDInput.d.ts +2 -1
  34. package/dist/components/LDInput/LDInput.d.ts.map +1 -1
  35. package/dist/components/LDInput/LDInput.js +6 -6
  36. package/dist/constants/file.d.ts +1 -0
  37. package/dist/constants/file.d.ts.map +1 -1
  38. package/dist/constants/file.js +1 -0
  39. package/dist/index.css +248 -4
  40. package/dist/index.d.ts +8 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +10 -2
  43. package/dist/utils/file.d.ts +2 -0
  44. package/dist/utils/file.d.ts.map +1 -1
  45. package/dist/utils/file.js +35 -2
  46. package/package.json +5 -2
  47. package/src/styles/carousel.css +9 -0
  48. package/src/styles/color.css +185 -0
  49. package/src/styles/components/auto-complete.css +72 -0
  50. package/src/styles/components/badge.css +41 -0
  51. package/src/styles/components/bread-crumb.css +23 -0
  52. package/src/styles/components/button.css +183 -0
  53. package/src/styles/components/editor.css +147 -0
  54. package/src/styles/components/icon.css +29 -0
  55. package/src/styles/components/index.css +10 -0
  56. package/src/styles/components/input.css +52 -0
  57. package/src/styles/components/modal.css +25 -0
  58. package/src/styles/components/shared.css +52 -0
  59. package/src/styles/components/spinner.css +38 -0
  60. package/src/styles/focus.css +12 -0
  61. package/src/styles/gradient.css +41 -0
  62. package/src/styles/layout.css +19 -0
  63. package/src/styles/motion.css +235 -0
  64. package/src/styles/radius.css +8 -0
  65. package/src/styles/responsive.css +42 -0
  66. package/src/styles/scrollbar.css +59 -0
  67. package/src/styles/slider.css +65 -0
  68. package/src/styles/spacing.css +592 -0
  69. package/src/styles/text-utils.css +7 -0
  70. package/src/styles/typography.css +171 -0
  71. package/src/theme.css +19 -0
  72. package/dist/components/LDFileUpload/LDFileUploadBase.d.ts +0 -50
  73. package/dist/components/LDFileUpload/LDFileUploadBase.d.ts.map +0 -1
  74. package/dist/components/LDFileUpload/LDFileUploadBase.js +0 -102
@@ -0,0 +1,171 @@
1
+ @theme {
2
+ --font-pretendard: 'var(--font-pretendard)', sans-serif;
3
+
4
+ /* typography */
5
+ --text-display10: 10px;
6
+ --leading-display10: 14px;
7
+ --tracking-display10: -1px;
8
+
9
+ --text-display12: 12px;
10
+ --leading-display12: 16px;
11
+ --tracking-display12: -1px;
12
+
13
+ --text-display14: 14px;
14
+ --leading-display14: 18px;
15
+ --tracking-display14: -1px;
16
+
17
+ --text-display16: 16px;
18
+ --leading-display16: 20px;
19
+ --tracking-display16: -1px;
20
+
21
+ --text-display18: 18px;
22
+ --leading-display18: 22px;
23
+ --tracking-display18: -1px;
24
+
25
+ --text-display20: 20px;
26
+ --leading-display20: 24px;
27
+ --tracking-display20: -1px;
28
+
29
+ --text-display24: 24px;
30
+ --leading-display24: 28px;
31
+ --tracking-display24: -1px;
32
+
33
+ --text-display28: 28px;
34
+ --leading-display28: 32px;
35
+ --tracking-display28: -1px;
36
+
37
+ --text-display30: 30px;
38
+ --leading-display30: 36px;
39
+ --tracking-display30: -1px;
40
+
41
+ --text-display32: 32px;
42
+ --leading-display32: 38px;
43
+ --tracking-display32: -1px;
44
+
45
+ --text-display36: 36px;
46
+ --leading-display36: 42px;
47
+ --tracking-display36: -1px;
48
+
49
+ --text-display40: 40px;
50
+ --leading-display40: 48px;
51
+ --tracking-display40: -1px;
52
+
53
+ --text-display64: 64px;
54
+ --leading-display64: 72px;
55
+ --tracking-display64: -1px;
56
+
57
+ --text-display80: 80px;
58
+ --leading-display80: 88px;
59
+ --tracking-display80: -1px;
60
+
61
+ --text-display120: 120px;
62
+ --leading-display120: 128px;
63
+ --tracking-display120: -1px;
64
+
65
+ /* font-weight */
66
+ --font-light: 300;
67
+ --font-regular: 400;
68
+ --font-medium: 500;
69
+ --font-semibold: 550;
70
+ --font-bold: 600;
71
+ --font-extrabold: 700;
72
+ --font-black: 900;
73
+ }
74
+
75
+ @utility display10 {
76
+ font-size: var(--text-display10);
77
+ line-height: var(--leading-display10);
78
+ letter-spacing: var(--tracking-display10);
79
+ }
80
+ @utility display12 {
81
+ font-size: var(--text-display12);
82
+ line-height: var(--leading-display12);
83
+ letter-spacing: var(--tracking-display12);
84
+ }
85
+ @utility display14 {
86
+ font-size: var(--text-display14);
87
+ line-height: var(--leading-display14);
88
+ letter-spacing: var(--tracking-display14);
89
+ }
90
+ @utility display16 {
91
+ font-size: var(--text-display16);
92
+ line-height: var(--leading-display16);
93
+ letter-spacing: var(--tracking-display16);
94
+ }
95
+ @utility display18 {
96
+ font-size: var(--text-display18);
97
+ line-height: var(--leading-display18);
98
+ letter-spacing: var(--tracking-display18);
99
+ }
100
+ @utility display20 {
101
+ font-size: var(--text-display20);
102
+ line-height: var(--leading-display20);
103
+ letter-spacing: var(--tracking-display20);
104
+ }
105
+ @utility display24 {
106
+ font-size: var(--text-display24);
107
+ line-height: var(--leading-display24);
108
+ letter-spacing: var(--tracking-display24);
109
+ }
110
+ @utility display28 {
111
+ font-size: var(--text-display28);
112
+ line-height: var(--leading-display28);
113
+ letter-spacing: var(--tracking-display28);
114
+ }
115
+ @utility display30 {
116
+ font-size: var(--text-display30);
117
+ line-height: var(--leading-display30);
118
+ letter-spacing: var(--tracking-display30);
119
+ }
120
+ @utility display32 {
121
+ font-size: var(--text-display32);
122
+ line-height: var(--leading-display32);
123
+ letter-spacing: var(--tracking-display32);
124
+ }
125
+ @utility display36 {
126
+ font-size: var(--text-display36);
127
+ line-height: var(--leading-display36);
128
+ letter-spacing: var(--tracking-display36);
129
+ }
130
+ @utility display40 {
131
+ font-size: var(--text-display40);
132
+ line-height: var(--leading-display40);
133
+ letter-spacing: var(--tracking-display40);
134
+ }
135
+ @utility display64 {
136
+ font-size: var(--text-display64);
137
+ line-height: var(--leading-display64);
138
+ letter-spacing: var(--tracking-display64);
139
+ }
140
+ @utility display80 {
141
+ font-size: var(--text-display80);
142
+ line-height: var(--leading-display80);
143
+ letter-spacing: var(--tracking-display80);
144
+ }
145
+ @utility display120 {
146
+ font-size: var(--text-display120);
147
+ line-height: var(--leading-display120);
148
+ letter-spacing: var(--tracking-display120);
149
+ }
150
+
151
+ @utility light {
152
+ font-weight: var(--font-light);
153
+ }
154
+ @utility regular {
155
+ font-weight: var(--font-regular);
156
+ }
157
+ @utility medium {
158
+ font-weight: var(--font-medium);
159
+ }
160
+ @utility semibold {
161
+ font-weight: var(--font-semibold);
162
+ }
163
+ @utility bold {
164
+ font-weight: var(--font-bold);
165
+ }
166
+ @utility extrabold {
167
+ font-weight: var(--font-extrabold);
168
+ }
169
+ @utility black {
170
+ font-weight: var(--font-black);
171
+ }
package/src/theme.css ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * theme.css — 소비처(ledu-mono 등)의 Tailwind 컴파일러가 직접 처리하는
3
+ * raw @theme/@utility 진입점.
4
+ *
5
+ * 컴파일된 dist/index.css(styles.css)와 달리 토큰·유틸 정의가 원문 그대로 남아있어,
6
+ * 소비처가 자기 코드에 대해 `display40`, `bg-mono600` 같은 클래스를 on-demand로 생성할 수 있다.
7
+ *
8
+ * 주의:
9
+ * - `@import 'tailwindcss'`를 넣지 않는다. 소비처가 이미 import하므로 중복되면 충돌난다.
10
+ * - 컴포넌트 스타일(components/*, slider/carousel 등)은 포함하지 않는다 — styles.css가 담당.
11
+ */
12
+ @import './styles/color.css';
13
+ @import './styles/typography.css';
14
+ @import './styles/text-utils.css';
15
+ @import './styles/radius.css';
16
+ @import './styles/spacing.css';
17
+ @import './styles/layout.css';
18
+ @import './styles/gradient.css';
19
+ @import './styles/motion.css';
@@ -1,50 +0,0 @@
1
- import { Dispatch, type ReactNode, SetStateAction } from 'react';
2
- import { TMimeType } from '../../constants/file.js';
3
- import { type LDButtonProps } from '../../components/LDButton/LDButton.js';
4
- import { IFile } from '../../utils/file.js';
5
- interface FileUploadContextType {
6
- recommendedSize?: {
7
- width: number;
8
- height: number;
9
- };
10
- maxSize: number;
11
- allowedExtensions: TMimeType[];
12
- fileList: IFile[];
13
- setFileList: Dispatch<SetStateAction<IFile[]>>;
14
- maxFileCount: number;
15
- }
16
- export declare const useFileUploadContext: () => FileUploadContextType;
17
- interface RootProps {
18
- recommendedSize?: {
19
- width: number;
20
- height: number;
21
- };
22
- maxSize: number;
23
- allowedExtensions: TMimeType[];
24
- fileList: IFile[] | [];
25
- setFileList: Dispatch<SetStateAction<IFile[] | []>>;
26
- maxFileCount?: number;
27
- className?: string;
28
- children?: ReactNode;
29
- }
30
- interface LDInputProps extends LDButtonProps<'button'> {
31
- onChangeFile: ({ fileName, fileBase64, file, }: {
32
- fileName: string;
33
- fileBase64: string;
34
- file: File;
35
- }) => Promise<string | void>;
36
- label?: string;
37
- }
38
- export declare const LDFileUploadBase: {
39
- Root: ({ recommendedSize, maxSize, allowedExtensions, maxFileCount, fileList, setFileList, className, children, }: RootProps) => import("react/jsx-runtime").JSX.Element;
40
- LDInput: ({ onChangeFile, label, ...props }: LDInputProps) => import("react/jsx-runtime").JSX.Element;
41
- CardList: ({ emptyContent, className, }: {
42
- emptyContent?: ReactNode;
43
- className?: string;
44
- }) => import("react/jsx-runtime").JSX.Element | null;
45
- Description: ({ className }: {
46
- className?: string;
47
- }) => import("react/jsx-runtime").JSX.Element;
48
- };
49
- export default LDFileUploadBase;
50
- //# sourceMappingURL=LDFileUploadBase.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LDFileUploadBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDFileUpload/LDFileUploadBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,QAAQ,EACR,KAAK,SAAS,EACd,cAAc,EAGf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAmB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAiB,EACf,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAGL,KAAK,EAKN,MAAM,kBAAkB,CAAC;AAG1B,UAAU,qBAAqB;IAC7B,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/C,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,oBAAoB,6BAUhC,CAAC;AAEF,UAAU,SAAS;IACjB,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvB,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA8BD,UAAU,YAAa,SAAQ,aAAa,CAAC,QAAQ,CAAC;IACpD,YAAY,EAAE,CAAC,EACb,QAAQ,EACR,UAAU,EACV,IAAI,GACL,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC;KACZ,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmJD,eAAO,MAAM,gBAAgB;uHAjL1B,SAAS;iDAoCT,YAAY;6CA2EZ;QACD,YAAY,CAAC,EAAE,SAAS,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;iCA6CmC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAuBzD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,102 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { createContext, useContext, } from 'react';
4
- import cn from '../../utils/cn.js';
5
- import { FILE_EXTENSIONS } from '../../constants/file.js';
6
- import LDButton from '../../components/LDButton/LDButton.js';
7
- import { fileToBase64, getFileSizeUnit, isImage, validAllowedExtesions, validFileSize, validImageSize, } from '../../utils/file.js';
8
- import LDToast from '../../components/LDToast/LDToast.js';
9
- const FileUploadContext = createContext(null);
10
- export const useFileUploadContext = () => {
11
- const fileUploadContext = useContext(FileUploadContext);
12
- if (!fileUploadContext) {
13
- throw new Error('LDFileUploadBase 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
14
- }
15
- return fileUploadContext;
16
- };
17
- const Root = ({ recommendedSize, maxSize, allowedExtensions, maxFileCount, fileList, setFileList, className, children, }) => {
18
- // const [file, setFile] = useState<IFile | null>(null);
19
- return (_jsx(FileUploadContext.Provider, { value: {
20
- recommendedSize,
21
- maxSize,
22
- allowedExtensions,
23
- maxFileCount: maxFileCount ?? 1,
24
- fileList,
25
- setFileList,
26
- }, children: _jsx("div", { className: cn('w-full', className), children: children }) }));
27
- };
28
- const LDInput = ({ onChangeFile, label = '파일 선택', ...props }) => {
29
- const { allowedExtensions, maxSize, fileList, setFileList, maxFileCount } = useFileUploadContext();
30
- const getFileError = async (file) => {
31
- if (!validAllowedExtesions(file, allowedExtensions)) {
32
- const allowed = allowedExtensions
33
- .map((item) => FILE_EXTENSIONS[item].toUpperCase())
34
- .join(', ');
35
- return `지원하지 않는 파일 형식입니다. ${allowed} 파일만 업로드 가능합니다.`;
36
- }
37
- if (!validFileSize(file, maxSize)) {
38
- return `파일 크기가 너무 큽니다. ${getFileSizeUnit(maxSize)} 이하 파일을 선택해주세요.`;
39
- }
40
- if (isImage(file.name) && !(await validImageSize(file))) {
41
- return '이미지 해상도가 너무 큽니다. 더 작은 크기의 이미지를 선택해주세요.';
42
- }
43
- return null;
44
- };
45
- const handleFile = async (e) => {
46
- const files = e.target.files;
47
- if (!files)
48
- return;
49
- for (const file of files) {
50
- const error = await getFileError(file);
51
- if (error) {
52
- LDToast.error(error);
53
- return;
54
- }
55
- }
56
- for (const file of files) {
57
- try {
58
- const data = await fileToBase64(file);
59
- const src = await onChangeFile({ ...data, file });
60
- if (src) {
61
- setFileList((prev) => [...prev, { ...data, src }]);
62
- }
63
- }
64
- catch (error) {
65
- if (error instanceof Error) {
66
- LDToast.error(error.message);
67
- return;
68
- }
69
- LDToast.error('파일 업로드 중 문제가 발생했습니다. 잠시후 다시 시도해주세요.');
70
- }
71
- }
72
- };
73
- return (_jsxs(LDButton, { as: "label", ...props, children: [label, _jsx("input", { type: "file", multiple: maxFileCount > 1, onClick: (e) => (e.currentTarget.value = ''), onChange: (e) => handleFile(e), className: "sr-only" })] }));
74
- };
75
- const CardList = ({ emptyContent, className, }) => {
76
- /*
77
- 이미지인 경우
78
- 이미지가 아닌 파일인 경우
79
- */
80
- const { fileList } = useFileUploadContext();
81
- if (fileList.length <= 0)
82
- return emptyContent ? _jsx(_Fragment, { children: emptyContent }) : null;
83
- return (_jsxs(_Fragment, { children: [_jsx(_Fragment, { children: JSON.stringify(fileList, null, 2) }), _jsx(_Fragment, { children: 'length: ' + fileList.length }), _jsx("div", { className: cn('flex flex-row', className), children: fileList?.map((file, idx) => (_jsx("div", { className: "size-12 overflow-hidden", children: _jsx("img", { src: file?.src, alt: file?.fileName, className: "object-cover" }) }, `${file.fileName}_${idx}`))) })] }));
84
- };
85
- // const CardList = ({}) => {
86
- // return <></>;
87
- // };
88
- const Description = ({ className }) => {
89
- const { recommendedSize, maxSize, allowedExtensions } = useFileUploadContext();
90
- const recommendedSizeText = recommendedSize &&
91
- `권장 사이즈 ${recommendedSize.width}x${recommendedSize.height}, `;
92
- const requiredText = `최대 크기 ${getFileSizeUnit(maxSize)}`;
93
- const extensionsText = ` (${allowedExtensions.map((item) => FILE_EXTENSIONS[item]).join(', ')})`;
94
- return (_jsxs("p", { className: cn('display14 text-neutral400 semibold', className), children: [recommendedSizeText, requiredText, extensionsText] }));
95
- };
96
- export const LDFileUploadBase = {
97
- Root,
98
- LDInput,
99
- CardList,
100
- Description,
101
- };
102
- export default LDFileUploadBase;