@edu-tosel/design 1.0.4 → 1.0.6

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 (241) hide show
  1. package/.eslintrc.cjs +17 -0
  2. package/Dockerfile +16 -0
  3. package/LICENCE +19 -0
  4. package/README.md +20 -0
  5. package/docs/README.md +47 -0
  6. package/index.html +13 -0
  7. package/package.json +49 -28
  8. package/postcss.config.js +6 -0
  9. package/public/images/daeng.jpg +0 -0
  10. package/public/images/faker.jpg +0 -0
  11. package/public/images/haerin.png +0 -0
  12. package/public/images/haewon.png +0 -0
  13. package/public/images/hani.png +0 -0
  14. package/public/images/home/admin.png +0 -0
  15. package/public/images/home/dashboard.png +0 -0
  16. package/public/images/home/detection.png +0 -0
  17. package/public/images/home/homepage.png +0 -0
  18. package/public/images/home/olympiad.png +0 -0
  19. package/public/images/home/partner.png +0 -0
  20. package/public/images/home/report.png +0 -0
  21. package/public/images/home/space.png +0 -0
  22. package/public/images/home/sun.png +0 -0
  23. package/public/images/info.png +0 -0
  24. package/public/images/itc.png +0 -0
  25. package/public/images/jenkins.png +0 -0
  26. package/public/images/minji.png +0 -0
  27. package/public/images/seulgi.png +0 -0
  28. package/public/images/test-full.png +0 -0
  29. package/public/images/test-image.png +0 -0
  30. package/public/images/test-paper.png +0 -0
  31. package/public/images/tosel-blue-lab-spiral.png +0 -0
  32. package/public/images/tosel.png +0 -0
  33. package/public/images/yujin.png +0 -0
  34. package/public/videos/loading.gif +0 -0
  35. package/public/vite.svg +1 -0
  36. package/setupPackage.js +78 -0
  37. package/src/App.tsx +32 -0
  38. package/src/_components/asset/interface.ts +2 -0
  39. package/src/_components/asset/links.ts +17 -0
  40. package/src/_components/asset/mock/academies.ts +52 -0
  41. package/src/_components/asset/mock/chartData.ts +104 -0
  42. package/src/_components/asset/mock/exams.ts +42 -0
  43. package/src/_components/asset/mock/index.ts +2 -0
  44. package/src/_components/asset/mock/people.ts +291 -0
  45. package/src/_components/asset/mock/test.ts +67 -0
  46. package/src/_components/asset/navigation.ts +17 -0
  47. package/src/_components/asset/people.ts +226 -0
  48. package/src/_components/asset/planets.ts +49 -0
  49. package/src/_components/controller/store.ts +11 -0
  50. package/src/_components/hook/useRoute.ts +47 -0
  51. package/src/_components/hook/useTyping.ts +46 -0
  52. package/src/_components/types/Level.ts +1 -0
  53. package/src/_components/view/Explore.tsx +16 -0
  54. package/src/_components/view/Home.tsx +180 -0
  55. package/src/_components/view/LottiePlayer.tsx +17 -0
  56. package/src/app/admin/exam/page.tsx +36 -0
  57. package/src/app/admin/grade/page.tsx +5 -0
  58. package/src/app/admin/layout.tsx +56 -0
  59. package/src/app/admin/news/page.tsx +15 -0
  60. package/src/app/admin/page.tsx +42 -0
  61. package/src/app/admin/rnd/monthly-test/page.tsx +5 -0
  62. package/src/app/admin/rnd/page.tsx +17 -0
  63. package/src/app/admin/statistics/page.tsx +5 -0
  64. package/src/app/admin/user/page.tsx +147 -0
  65. package/src/app/agency/exam/page.tsx +5 -0
  66. package/src/app/agency/group/page.tsx +5 -0
  67. package/src/app/agency/layout.tsx +55 -0
  68. package/src/app/agency/page.tsx +68 -0
  69. package/src/app/agency/sales/page.tsx +5 -0
  70. package/src/app/convention/page.tsx +58 -0
  71. package/src/app/page.tsx +4 -0
  72. package/src/asset/fonts/Kostar.ttf +0 -0
  73. package/src/asset/fonts/Megrim.ttf +0 -0
  74. package/src/asset/fonts/NicoMoji.ttf +0 -0
  75. package/src/asset/fonts/Pretendard-Medium.otf +0 -0
  76. package/{board/index.d.ts → src/board/index.tsx} +4 -3
  77. package/src/board/template/CanvasBoard.tsx +17 -0
  78. package/src/board/template/ManageBoard.tsx +56 -0
  79. package/src/board/widget/Board.tsx +28 -0
  80. package/src/board/widget/DataField.tsx +70 -0
  81. package/src/board/widget/Header.tsx +63 -0
  82. package/src/board/widget/Tab.tsx +36 -0
  83. package/src/board/widget/Tags.tsx +81 -0
  84. package/{card/index.d.ts → src/card/index.tsx} +6 -5
  85. package/src/card/template/ChartCard.tsx +42 -0
  86. package/src/card/template/InfoCard.tsx +22 -0
  87. package/src/card/template/ProfileCard.tsx +36 -0
  88. package/src/card/template/RowCard.tsx +91 -0
  89. package/src/card/template/TableCard.tsx +41 -0
  90. package/src/card/template/TrumpCard.tsx +46 -0
  91. package/src/card/widget/Card.tsx +53 -0
  92. package/src/deck/Deck.tsx +46 -0
  93. package/{deck/index.d.ts → src/deck/index.tsx} +1 -1
  94. package/{index.d.ts → src/index.tsx} +11 -11
  95. package/src/interaction/Exception.tsx +10 -0
  96. package/src/interaction/LoadingSpinner.tsx +10 -0
  97. package/src/interaction/NoData.tsx +5 -0
  98. package/{interaction/index.d.ts → src/interaction/index.tsx} +2 -2
  99. package/src/interface/Board.ts +55 -0
  100. package/src/interface/Card.ts +66 -0
  101. package/src/interface/HTMLElement.ts +27 -0
  102. package/src/interface/Interaction.ts +4 -0
  103. package/src/interface/Menu.ts +5 -0
  104. package/src/interface/Modal.ts +19 -0
  105. package/{interface/Property.d.ts → src/interface/Property.ts} +46 -34
  106. package/src/interface/Widget.ts +4 -0
  107. package/{interface/index.d.ts → src/interface/index.ts} +3 -2
  108. package/src/layout/dashboard/Header.tsx +56 -0
  109. package/src/layout/dashboard/index.tsx +38 -0
  110. package/{layout/index.d.ts → src/layout/index.tsx} +1 -1
  111. package/src/main.tsx +10 -0
  112. package/src/menu/SideMenu.tsx +104 -0
  113. package/{menu/index.d.ts → src/menu/index.tsx} +1 -1
  114. package/src/modal/AlertModal.tsx +24 -0
  115. package/src/modal/ControllerModal.tsx +17 -0
  116. package/src/modal/Modal.tsx +66 -0
  117. package/src/modal/TestModal.tsx +19 -0
  118. package/{modal/index.d.ts → src/modal/index.tsx} +3 -3
  119. package/src/navigation/Navigation.tsx +37 -0
  120. package/{navigation/index.d.ts → src/navigation/index.tsx} +1 -1
  121. package/src/shelf/Shelf.tsx +3 -0
  122. package/{shelf/index.d.ts → src/shelf/index.tsx} +1 -1
  123. package/src/store/index.ts +66 -0
  124. package/src/text/LineBreaks.tsx +13 -0
  125. package/{text/index.d.ts → src/text/index.tsx} +1 -1
  126. package/src/util/classNames.ts +4 -0
  127. package/src/util/colors.ts +11 -0
  128. package/src/util/display.ts +31 -0
  129. package/src/util/displayResponsive.ts +17 -0
  130. package/{util/index.d.ts → src/util/index.ts} +7 -7
  131. package/src/util/pattern.ts +18 -0
  132. package/src/util/position.ts +43 -0
  133. package/src/util/shape.ts +3 -0
  134. package/src/vite-env.d.ts +1 -0
  135. package/tsconfig.build.json +42 -0
  136. package/tsconfig.json +28 -0
  137. package/tsconfig.node.json +10 -0
  138. package/vite.config.ts +10 -0
  139. package/board/index.js +0 -3
  140. package/board/template/CanvasBoard.d.ts +0 -2
  141. package/board/template/CanvasBoard.js +0 -10
  142. package/board/template/ManageBoard.d.ts +0 -4
  143. package/board/template/ManageBoard.js +0 -28
  144. package/board/widget/Board.d.ts +0 -2
  145. package/board/widget/Board.js +0 -16
  146. package/board/widget/DataField.d.ts +0 -6
  147. package/board/widget/DataField.js +0 -24
  148. package/board/widget/Header.d.ts +0 -2
  149. package/board/widget/Header.js +0 -22
  150. package/board/widget/Tab.d.ts +0 -4
  151. package/board/widget/Tab.js +0 -17
  152. package/board/widget/Tags.d.ts +0 -3
  153. package/board/widget/Tags.js +0 -30
  154. package/card/index.js +0 -5
  155. package/card/template/ChartCard.d.ts +0 -2
  156. package/card/template/ChartCard.js +0 -6
  157. package/card/template/ProfileCard.d.ts +0 -14
  158. package/card/template/ProfileCard.js +0 -8
  159. package/card/template/RowCard.d.ts +0 -5
  160. package/card/template/RowCard.js +0 -26
  161. package/card/template/TableCard.d.ts +0 -2
  162. package/card/template/TableCard.js +0 -12
  163. package/card/template/TrumpCard.d.ts +0 -2
  164. package/card/template/TrumpCard.js +0 -19
  165. package/card/widget/Card.d.ts +0 -2
  166. package/card/widget/Card.js +0 -45
  167. package/deck/Deck.d.ts +0 -16
  168. package/deck/Deck.js +0 -15
  169. package/deck/index.js +0 -1
  170. package/index.js +0 -11
  171. package/interaction/Exception.d.ts +0 -2
  172. package/interaction/Exception.js +0 -9
  173. package/interaction/LoadingSpinner.d.ts +0 -1
  174. package/interaction/LoadingSpinner.js +0 -5
  175. package/interaction/index.js +0 -2
  176. package/interface/Board.d.ts +0 -57
  177. package/interface/Board.js +0 -1
  178. package/interface/Card.d.ts +0 -73
  179. package/interface/Card.js +0 -1
  180. package/interface/HTMLElement.d.ts +0 -13
  181. package/interface/HTMLElement.js +0 -1
  182. package/interface/Interaction.d.ts +0 -5
  183. package/interface/Interaction.js +0 -1
  184. package/interface/Modal.d.ts +0 -18
  185. package/interface/Modal.js +0 -1
  186. package/interface/Property.js +0 -14
  187. package/interface/Widget.d.ts +0 -4
  188. package/interface/Widget.js +0 -1
  189. package/interface/index.js +0 -2
  190. package/layout/dashboard/Header.d.ts +0 -5
  191. package/layout/dashboard/Header.js +0 -19
  192. package/layout/dashboard/index.d.ts +0 -7
  193. package/layout/dashboard/index.js +0 -10
  194. package/layout/index.js +0 -1
  195. package/menu/SideMenu.d.ts +0 -1
  196. package/menu/SideMenu.js +0 -14
  197. package/menu/index.js +0 -1
  198. package/modal/AlertModal.d.ts +0 -2
  199. package/modal/AlertModal.js +0 -8
  200. package/modal/ControllerModal.d.ts +0 -6
  201. package/modal/ControllerModal.js +0 -6
  202. package/modal/Modal.d.ts +0 -2
  203. package/modal/Modal.js +0 -31
  204. package/modal/TestModal.d.ts +0 -8
  205. package/modal/TestModal.js +0 -6
  206. package/modal/index.js +0 -3
  207. package/navigation/Navigation.d.ts +0 -5
  208. package/navigation/Navigation.js +0 -24
  209. package/navigation/index.js +0 -1
  210. package/shelf/Shelf.d.ts +0 -4
  211. package/shelf/Shelf.js +0 -4
  212. package/shelf/index.js +0 -1
  213. package/store/index.d.ts +0 -16
  214. package/store/index.js +0 -39
  215. package/text/LineBreaks.d.ts +0 -4
  216. package/text/LineBreaks.js +0 -5
  217. package/text/index.js +0 -1
  218. package/util/classNames.d.ts +0 -1
  219. package/util/classNames.js +0 -4
  220. package/util/colors.d.ts +0 -10
  221. package/util/colors.js +0 -10
  222. package/util/display.d.ts +0 -25
  223. package/util/display.js +0 -25
  224. package/util/displayResponsive.d.ts +0 -3
  225. package/util/displayResponsive.js +0 -15
  226. package/util/index.js +0 -7
  227. package/util/pattern.d.ts +0 -7
  228. package/util/pattern.js +0 -15
  229. package/util/position.d.ts +0 -14
  230. package/util/position.js +0 -44
  231. package/util/shape.d.ts +0 -1
  232. package/util/shape.js +0 -3
  233. package/version.txt +0 -1
  234. /package/{asset → public}/fonts/Kostar.ttf +0 -0
  235. /package/{asset → public}/fonts/Megrim.ttf +0 -0
  236. /package/{asset → public}/fonts/NicoMoji.ttf +0 -0
  237. /package/{asset → public}/fonts/Pretendard-Medium.otf +0 -0
  238. /package/{asset → src/asset}/json/credit-lottie.json +0 -0
  239. /package/{asset → src/asset}/json/loading-lottie.json +0 -0
  240. /package/{asset → src/asset}/json/test.svg +0 -0
  241. /package/{globals.css → src/globals.css} +0 -0
@@ -0,0 +1,91 @@
1
+ import { Card } from "../widget/Card";
2
+ import { useWidgetStore } from "../../store";
3
+ import { Dispatch, useId, useState } from "react";
4
+
5
+ export default function RowCard<T extends Record<string, any>>({
6
+ row,
7
+ fields,
8
+ sizes,
9
+ }: {
10
+ row: T;
11
+ fields: Partial<Record<keyof T, "text" | ["select", [string, string][]]>>;
12
+ sizes: Partial<Record<keyof T, string>>;
13
+ }) {
14
+ const [rowState, setRowState] = useState<T>(row);
15
+ const { setView, setTempData } = useWidgetStore();
16
+ const entries = Object.entries(fields).map(
17
+ ([key, type]) => [type, key, rowState[key]] as const
18
+ );
19
+
20
+ return (
21
+ <Card
22
+ options={{
23
+ width: "full",
24
+ height: "xs",
25
+ boundary: "none",
26
+ rounded: "none",
27
+ }}
28
+ >
29
+ <div className="flex items-center h-full">
30
+ {entries.map(([type, key, value]) => (
31
+ <div key={key} className={`w-${`${sizes[key]}/100` ?? "auto"}`}>
32
+ {Array.isArray(type) && type[0] === "select" ? (
33
+ <Select
34
+ key={key + type + value.toString()}
35
+ type={type}
36
+ entry={[key, value]}
37
+ row={rowState}
38
+ setRow={setRowState}
39
+ />
40
+ ) : (
41
+ <div key={key + value.toString()} className="w-full truncate">
42
+ {value ?? "No Data"}
43
+ </div>
44
+ )}
45
+ </div>
46
+ ))}
47
+ <button
48
+ onClick={() => {
49
+ setTempData(row);
50
+ setView("sideMenu");
51
+ }}
52
+ >
53
+ click
54
+ </button>
55
+ </div>
56
+ </Card>
57
+ );
58
+ }
59
+
60
+ function Select<T>({
61
+ type,
62
+ entry,
63
+ row,
64
+ setRow,
65
+ }: {
66
+ type: ["select", [string, string][]];
67
+ entry: [string, string];
68
+ row: T;
69
+ setRow: Dispatch<T>;
70
+ }) {
71
+ const id = useId();
72
+ const [key, value] = entry;
73
+ return (
74
+ <select
75
+ key={id}
76
+ value={value}
77
+ onChange={(e) =>
78
+ setRow({
79
+ ...row,
80
+ [key]: e.target.value,
81
+ })
82
+ }
83
+ >
84
+ {type[1].map(([value, title]) => (
85
+ <option key={id + value} value={value}>
86
+ {title}
87
+ </option>
88
+ ))}
89
+ </select>
90
+ );
91
+ }
@@ -0,0 +1,41 @@
1
+ import { TableCardProps } from "../../interface/Card";
2
+ import { Card } from "../widget/Card";
3
+
4
+ export default function TableCard({
5
+ data,
6
+ fields,
7
+ sizes,
8
+ options,
9
+ }: TableCardProps) {
10
+ const { color } = options ?? {};
11
+ const { background: bgColor, text: textColor } = color ?? {};
12
+ const keys = Object.keys(fields);
13
+
14
+ const fieldsClassNames = [
15
+ `flex h-11 items-center font-bold pl-4`,
16
+ `bg-${bgColor ?? "gray-300"} text-${textColor ?? "black"}`,
17
+ ].join(" ");
18
+
19
+ return (
20
+ <Card options={{ width: "lg", height: "lg" }}>
21
+ <div className="overflow-hidden text-xs xs:text-sm sm:text-base">
22
+ <div className={fieldsClassNames}>
23
+ {keys.map((key) => (
24
+ <div key={key} className={`w-${sizes[key]}`}>
25
+ {fields[key]}
26
+ </div>
27
+ ))}
28
+ </div>
29
+ {data.map((row, index) => (
30
+ <div key={index} className="flex items-center pl-4 h-11 ">
31
+ {keys.map((key) => (
32
+ <div key={key} className={`truncate w-${sizes[key] ?? "auto"}`}>
33
+ {row[key]}
34
+ </div>
35
+ ))}
36
+ </div>
37
+ ))}
38
+ </div>
39
+ </Card>
40
+ );
41
+ }
@@ -0,0 +1,46 @@
1
+ import { TrumpCardProps } from "../../interface/Card";
2
+ import { LineBreaks } from "../../text";
3
+ import { Card } from "../widget/Card";
4
+
5
+ export default function TrumpCard({ titles, options }: TrumpCardProps) {
6
+ const { title, subTitle, color: titleColor } = titles;
7
+ const { onClick, width, image, subButton } = options ?? {};
8
+ const [buttonText, buttonBgColor, buttonAction] = subButton ?? [
9
+ null,
10
+ "red-crimson",
11
+ () => {},
12
+ ];
13
+ const { path, size } = image ?? { size: "sub" };
14
+
15
+ const imageClassNames = () => {
16
+ if (size === "full") return "w-full h-full object-cover";
17
+ return "absolute bottom-0 right-0 w-full xs:w-auto max-w-120 z-0 max-h-44 object-contain";
18
+ };
19
+
20
+ return (
21
+ <Card options={{ width: width ?? "xs", onClick: onClick }}>
22
+ <div
23
+ className={`absolute top-8 left-8 w-48 flex flex-col gap-2 z-10 text-${titleColor}`}
24
+ >
25
+ <div className="text-xl font-bold">{title}</div>
26
+ <LineBreaks gap={0} texts={subTitle ?? [""]} />
27
+ {subButton ? (
28
+ <button
29
+ className={`text-white rounded-md bg-${buttonBgColor} w-45 h-11 flex justify-center items-center`}
30
+ onClick={buttonAction}
31
+ >
32
+ {buttonText}
33
+ </button>
34
+ ) : null}
35
+ </div>
36
+ {path ? (
37
+ <img
38
+ src={path}
39
+ alt="trump-image"
40
+ loading="lazy"
41
+ className={imageClassNames()}
42
+ />
43
+ ) : null}
44
+ </Card>
45
+ );
46
+ }
@@ -0,0 +1,53 @@
1
+ import { cn } from "../../util";
2
+ import { CardProps } from "../../interface/Card";
3
+
4
+ const widthSize = {
5
+ xs: "w-full md:w-60",
6
+ sm: "w-full md:w-90",
7
+ md: "w-full md:w-112.5",
8
+ lg: "w-full md:w-127.5",
9
+ xl: "w-full lg:w-187.5",
10
+ "2xl": "w-full lg:w-247.5",
11
+ full: "w-full",
12
+ };
13
+
14
+ const heightSize: Record<string, string> = {
15
+ xs: "min-h-16",
16
+ sm: "h-72 sm:h-48",
17
+ md: "h-72 sm:h-48",
18
+ lg: "h-80",
19
+ xl: "h-125",
20
+ "2xl": "",
21
+ };
22
+
23
+ export function Card({ children, options }: CardProps) {
24
+ const { boundary, rounded, height, width, text, onClick } = options ?? {};
25
+ const { size: textSize, color: textColor } = text ?? {};
26
+
27
+ const setBoundary = () => {
28
+ if (boundary === "shadow") return "box-shadow";
29
+ if (boundary === "border") return "border-2";
30
+ if (boundary === "none") return "";
31
+ return "box-shadow";
32
+ };
33
+
34
+ const sizes = [
35
+ `${heightSize[height ?? "sm"]}`,
36
+ `${widthSize[width ?? "sm"]}`,
37
+ ].join(" ");
38
+
39
+ const positions = "relative";
40
+ const styles = [
41
+ `${onClick ? "cursor-pointer" : ""}`,
42
+ `text-${textSize ?? "base"}`,
43
+ setBoundary(),
44
+ `rounded-${rounded ?? "xl"}`,
45
+ `bg-white/80 duration-500 overflow-hidden`,
46
+ ].join(" ");
47
+
48
+ return (
49
+ <div onClick={onClick} className={cn(sizes, positions, styles)}>
50
+ {children}
51
+ </div>
52
+ );
53
+ }
@@ -0,0 +1,46 @@
1
+ import { cn } from "../util";
2
+
3
+ export function Deck<T extends string | number>({
4
+ children,
5
+ titles,
6
+ options,
7
+ }: {
8
+ children: React.ReactNode;
9
+ titles?: {
10
+ title: string;
11
+ subTitle?: string;
12
+ gapTitle?: number;
13
+ };
14
+ options?: {
15
+ overflowScroll?: boolean;
16
+ width?: T;
17
+ height?: number;
18
+ gapX?: number;
19
+ gapY?: number;
20
+ };
21
+ }) {
22
+ const { title, subTitle, gapTitle } = titles ?? {};
23
+ const { height, gapX, gapY, overflowScroll } = options ?? {};
24
+
25
+ const container = {
26
+ positions: `flex flex-col gap-${gapTitle ?? 4}`,
27
+ sizes: `sm:w-full h-${height ?? "auto"} `,
28
+ };
29
+
30
+ const body = {
31
+ positions: `flex flex-col sm:flex-row sm:w-full gap-x-${
32
+ gapX ?? 7.5
33
+ } gap-y-${gapY ?? 5}`,
34
+ styles: `${overflowScroll ? "overflow-x-scroll" : ""} duration-500`,
35
+ };
36
+
37
+ return (
38
+ <div className={cn(container.positions, container.sizes)}>
39
+ <div className="pl-1">
40
+ <div className="text-xl xl:text-2xl font-bold">{title}</div>
41
+ <div className="">{subTitle}</div>
42
+ </div>
43
+ <div className={cn(body.positions, body.styles)}>{children}</div>
44
+ </div>
45
+ );
46
+ }
@@ -1 +1 @@
1
- export * from "./Deck";
1
+ export * from "./Deck";
@@ -1,11 +1,11 @@
1
- import "./globals.css";
2
- export * from "./board";
3
- export * from "./card";
4
- export * from "./deck";
5
- export * from "./layout";
6
- export * from "./interaction";
7
- export * from "./menu";
8
- export * from "./modal";
9
- export * from "./navigation";
10
- export * from "./shelf";
11
- export * from "./text";
1
+ import "./globals.css";
2
+ export * from "./board";
3
+ export * from "./card";
4
+ export * from "./deck";
5
+ export * from "./layout";
6
+ export * from "./interaction";
7
+ export * from "./menu";
8
+ export * from "./modal";
9
+ export * from "./navigation";
10
+ export * from "./shelf";
11
+ export * from "./text";
@@ -0,0 +1,10 @@
1
+ import { ExceptionProps } from "../interface/Interaction";
2
+
3
+ export default function Exception({ exceptions, children }: ExceptionProps) {
4
+ if (!exceptions) return <>{children}</>;
5
+ const trueComponents = exceptions
6
+ .filter(([exception]) => exception)
7
+ .map(([, component]) => component);
8
+
9
+ return <>{trueComponents.length > 0 ? trueComponents : children}</>;
10
+ }
@@ -0,0 +1,10 @@
1
+ // NOTE: This is Prototype code and should be replaced with a proper loading spinner
2
+ export default function LoadingSpinner() {
3
+ return (
4
+ <div className="w-full h-full flex items-center justify-center">
5
+ <div className="h-16 w-16 animate-spin rounded-full border-6 border-black border-r-transparent flex justify-center items-center">
6
+ <div className="h-12 w-12 animate-spin rounded-full border-6 border-red-500 border-r-transparent " />
7
+ </div>
8
+ </div>
9
+ );
10
+ }
@@ -0,0 +1,5 @@
1
+ export default function NoData() {
2
+ return (
3
+ <div className="w-full h-full flex items-center justify-center">NoData</div>
4
+ );
5
+ }
@@ -1,2 +1,2 @@
1
- export { default as Exception } from "./Exception";
2
- export { default as LoadingSpinner } from "./LoadingSpinner";
1
+ export { default as Exception } from "./Exception";
2
+ export { default as LoadingSpinner } from "./LoadingSpinner";
@@ -0,0 +1,55 @@
1
+ import { Dispatch } from "react";
2
+ import { Button, Size } from "./Property";
3
+
4
+ interface OptionsProps {
5
+ color?: string;
6
+ }
7
+
8
+ interface WidgetsProps {
9
+ exceptions?: [boolean, React.ReactNode][];
10
+ components?: [boolean | string, React.ReactNode][];
11
+ tabs?: Button[];
12
+ }
13
+
14
+ export interface BoardProps {
15
+ children?: React.ReactNode;
16
+ widgets?: WidgetsProps;
17
+ options?: OptionsProps;
18
+ }
19
+ export interface BoardHeaderProps {
20
+ title?: string;
21
+ tags?: {
22
+ selects?: {
23
+ title: string;
24
+ onChange: Dispatch<string>;
25
+ options: [string | number, string][];
26
+ width?: Size;
27
+ }[];
28
+ inputs?: {
29
+ title: string;
30
+ onChange: Dispatch<string>;
31
+ placeholder: string;
32
+ width?: Size;
33
+ }[];
34
+ };
35
+ options?: {
36
+ colors?: { bgColor?: string; textColor?: string };
37
+ };
38
+ }
39
+
40
+ export interface ManageBoardProps<T> extends BoardProps {
41
+ data: {
42
+ dataSets: {
43
+ title?: string;
44
+ items: T[] | undefined;
45
+ renderItem: (items: T) => React.ReactNode;
46
+ }[];
47
+ dataField?: {
48
+ fields: Record<string, string>;
49
+ sizes: Record<string, string>;
50
+ };
51
+ gap?: number;
52
+ };
53
+ header?: BoardHeaderProps;
54
+ widgets?: { menu?: React.ReactNode } & WidgetsProps;
55
+ }
@@ -0,0 +1,66 @@
1
+ import { ImageSize, Size } from "./Property";
2
+
3
+ /**
4
+ * CardProps is an interface.
5
+ * @interface CardProps
6
+ * @property {React.ReactNode} children
7
+ * @property {object} options
8
+ * @property {Size} options.height
9
+ * @property {Size} options.width
10
+ * @property {object} options.text
11
+ * @property {string} options.text.size
12
+ * @property {string} options.text.color
13
+ * @property {() => unknown | (() => Promise<unknown>)} options.onClick
14
+ */
15
+
16
+ export interface CardProps {
17
+ children: React.ReactNode;
18
+ options?: {
19
+ boundary?: "shadow" | "border" | "none";
20
+ rounded?: string;
21
+ height?: Size;
22
+ width?: Size;
23
+ text?: { size?: string; color?: string };
24
+ onClick?: () => unknown | (() => Promise<unknown>);
25
+ overflow?: "hiden" | "auto";
26
+ };
27
+ }
28
+
29
+ export interface ChartCardProps {
30
+ data: Record<string, string | number>[];
31
+ xAxis: string;
32
+ yAxis: string;
33
+ lines?: { dataKey: string; stroke: string }[];
34
+ bars?: { dataKey: string; fill: string }[];
35
+ areas?: { dataKey: string; fill: string }[];
36
+ }
37
+
38
+ export interface TableCardProps {
39
+ data: Record<string, string | number>[];
40
+ fields: Record<string, string>;
41
+ sizes: Record<string, string>;
42
+ options?: {
43
+ color?: {
44
+ background: string;
45
+ text: string;
46
+ };
47
+ };
48
+ }
49
+
50
+ export interface TrumpCardProps {
51
+ titles: {
52
+ title: string;
53
+ subTitle?: string[];
54
+ color?: string;
55
+ };
56
+ options?: {
57
+ width?: Size;
58
+ image?: { path: string; size?: ImageSize };
59
+ onClick?: () => unknown | (() => Promise<unknown>);
60
+ subButton?: [string, string, () => unknown | (() => Promise<unknown>)];
61
+ };
62
+ }
63
+
64
+ export interface InfoCardProps {
65
+ type: "information" | "profile" | "prpfileSmall";
66
+ }
@@ -0,0 +1,27 @@
1
+ import { Dispatch } from "react";
2
+ import { Size } from "./Property";
3
+
4
+ export type HTMLElementType = "text" | "input" | "select";
5
+
6
+ export interface HTMLElement {
7
+ title: string;
8
+ onChange: Dispatch<string>;
9
+ width?: Size;
10
+ }
11
+
12
+ export interface HTMLElementSetting {
13
+ [key: string]: {
14
+ label: string;
15
+ type: HTMLElementType;
16
+ placeholder?: string;
17
+ options?: [string, string][];
18
+ onChnage?: Dispatch<string>;
19
+ };
20
+ }
21
+
22
+ export interface HTMLSelectElement extends HTMLElement {
23
+ selectOptions?: [string | number, string][];
24
+ }
25
+ export interface HTMLInputElement extends HTMLElement {
26
+ placeholder?: string;
27
+ }
@@ -0,0 +1,4 @@
1
+ export interface ExceptionProps {
2
+ exceptions?: [boolean, React.ReactNode][];
3
+ children: React.ReactNode;
4
+ }
@@ -0,0 +1,5 @@
1
+ import { Log, HTMLElementSetting } from "../interface";
2
+ export interface SideMenuProps<K extends string, T extends string | number> {
3
+ log: Log<K, T>;
4
+ setting: HTMLElementSetting;
5
+ }
@@ -0,0 +1,19 @@
1
+ import { Button, Scripts, Size } from "./Property";
2
+
3
+ export interface ModalProps {
4
+ children: React.ReactNode;
5
+ options?: {
6
+ width?: Size;
7
+ height?: Size;
8
+ padding?: boolean;
9
+ buttons?: Button[];
10
+ };
11
+ }
12
+
13
+ export interface AlertModalProps {
14
+ title: string;
15
+ scripts: Scripts;
16
+ options?: {
17
+ buttons?: Button[];
18
+ };
19
+ }
@@ -1,34 +1,46 @@
1
- /**
2
- * Size type
3
- * @enum {string}
4
- * @readonly
5
- * @description - Size type for the component
6
- * @property {"xs"} xs - Extra small size
7
- * @property {"sm"} sm - Small size
8
- * @property {"md"} md - Medium size
9
- * @property {"lg"} lg - Large size
10
- * @property {"xl"} xl - Extra large size
11
- * @property {"2xl"} 2xl - Double extra large size
12
- * @property {"full"} full - Full size
13
- */
14
- export type Size = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
15
- /**
16
- * Image size type
17
- * @enum {string}
18
- * @readonly
19
- * @description - Size type for the image
20
- * @property {"sub"} sub - Sub size
21
- * @property {"full"} full - Full size
22
- */
23
- export type ImageSize = "sub" | "full";
24
- export type OnClick = () => unknown | Promise<unknown>;
25
- export type Button = [string, OnClick];
26
- export type Scripts = {
27
- script: string;
28
- subScript?: string;
29
- };
30
- export type Titles = {
31
- title: string;
32
- subTitle?: string[];
33
- color?: string;
34
- };
1
+ /**
2
+ * Size type
3
+ * @enum {string}
4
+ * @readonly
5
+ * @description - Size type for the component
6
+ * @property {"xs"} xs - Extra small size
7
+ * @property {"sm"} sm - Small size
8
+ * @property {"md"} md - Medium size
9
+ * @property {"lg"} lg - Large size
10
+ * @property {"xl"} xl - Extra large size
11
+ * @property {"2xl"} 2xl - Double extra large size
12
+ * @property {"full"} full - Full size
13
+ */
14
+
15
+ export type Size = "xs" | "sm" | "md" | "lg" | "xl" | "2xl" | "full";
16
+
17
+ /**
18
+ * Image size type
19
+ * @enum {string}
20
+ * @readonly
21
+ * @description - Size type for the image
22
+ * @property {"sub"} sub - Sub size
23
+ * @property {"full"} full - Full size
24
+ */
25
+
26
+ export type ImageSize = "sub" | "full";
27
+
28
+ export type OnClick = () => unknown | Promise<unknown>;
29
+
30
+ export type Button = [string, OnClick];
31
+
32
+ export type Scripts = {
33
+ script: string;
34
+ subScript?: string;
35
+ };
36
+
37
+ export type Titles = {
38
+ title: string;
39
+ subTitle?: string[];
40
+ color?: string;
41
+ };
42
+
43
+ export interface Log<K extends string, T extends string | number> {
44
+ prints: K[];
45
+ logs: { [p in K]: T }[] | undefined;
46
+ }
@@ -0,0 +1,4 @@
1
+ export interface WidgetEvent {
2
+ event: string;
3
+ type: "view" | "modal";
4
+ }
@@ -1,2 +1,3 @@
1
- export * from "./Property";
2
- export * from "./Widget";
1
+ export * from "./HTMLElement";
2
+ export * from "./Property";
3
+ export * from "./Widget";
@@ -0,0 +1,56 @@
1
+ import "../../globals.css";
2
+ import { useState } from "react";
3
+ import { circle, cn } from "../../util";
4
+
5
+ export function Header({
6
+ title,
7
+ image,
8
+ }: {
9
+ title: string;
10
+ image?: [string, string];
11
+ }) {
12
+ const [isOpen, setIsOpen] = useState<boolean>(false);
13
+ const [src, href] = image ?? [];
14
+
15
+ return (
16
+ <div className="fixed top-0 left-0 xl:relative flex h-20 w-full items-center justify-between bg-white px-9 shadow-black/10 shadow-b-md z-40">
17
+ <div className="flex h-12 items-center gap-12">
18
+ {src && href ? (
19
+ <a href={href}>
20
+ <img src={src} alt="logo" className="h-12 w-50" />
21
+ </a>
22
+ ) : (
23
+ <div className="text-2xl">TOSEL</div>
24
+ )}
25
+ <div className="text-3xl font-bold ">{title}</div>
26
+ </div>
27
+ {/* <div className="relative">
28
+ <button
29
+ onClick={() => setIsOpen(!isOpen)}
30
+ className={circle(9) + "border-2"}
31
+ >
32
+ +
33
+ </button>
34
+ <Menu flag={isOpen} />
35
+ </div> */}
36
+ </div>
37
+ );
38
+ }
39
+
40
+ function Menu({ flag }: { flag: boolean }) {
41
+ const positions = "absolute right-0 z-40 ";
42
+ const layouts = "w-48 overflow-hidden";
43
+ const styles = "shadow-md bg-white";
44
+
45
+ const animations = () => {
46
+ const height = flag ? "h-80" : "h-0";
47
+ return [height, "duration-500"].join(" ");
48
+ };
49
+
50
+ return (
51
+ <div className={cn(positions, layouts, styles, animations())}>
52
+ <div>ㅎㅇ</div>
53
+ <div>ㅎㅇ</div>
54
+ </div>
55
+ );
56
+ }