@edu-tosel/design 1.0.5 → 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 (243) 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/NoData.d.ts +0 -1
  176. package/interaction/NoData.js +0 -4
  177. package/interaction/index.js +0 -2
  178. package/interface/Board.d.ts +0 -57
  179. package/interface/Board.js +0 -1
  180. package/interface/Card.d.ts +0 -73
  181. package/interface/Card.js +0 -1
  182. package/interface/HTMLElement.d.ts +0 -13
  183. package/interface/HTMLElement.js +0 -1
  184. package/interface/Interaction.d.ts +0 -5
  185. package/interface/Interaction.js +0 -1
  186. package/interface/Modal.d.ts +0 -18
  187. package/interface/Modal.js +0 -1
  188. package/interface/Property.js +0 -14
  189. package/interface/Widget.d.ts +0 -4
  190. package/interface/Widget.js +0 -1
  191. package/interface/index.js +0 -2
  192. package/layout/dashboard/Header.d.ts +0 -5
  193. package/layout/dashboard/Header.js +0 -19
  194. package/layout/dashboard/index.d.ts +0 -7
  195. package/layout/dashboard/index.js +0 -10
  196. package/layout/index.js +0 -1
  197. package/menu/SideMenu.d.ts +0 -1
  198. package/menu/SideMenu.js +0 -14
  199. package/menu/index.js +0 -1
  200. package/modal/AlertModal.d.ts +0 -2
  201. package/modal/AlertModal.js +0 -8
  202. package/modal/ControllerModal.d.ts +0 -6
  203. package/modal/ControllerModal.js +0 -6
  204. package/modal/Modal.d.ts +0 -2
  205. package/modal/Modal.js +0 -31
  206. package/modal/TestModal.d.ts +0 -8
  207. package/modal/TestModal.js +0 -6
  208. package/modal/index.js +0 -3
  209. package/navigation/Navigation.d.ts +0 -5
  210. package/navigation/Navigation.js +0 -24
  211. package/navigation/index.js +0 -1
  212. package/shelf/Shelf.d.ts +0 -4
  213. package/shelf/Shelf.js +0 -4
  214. package/shelf/index.js +0 -1
  215. package/store/index.d.ts +0 -16
  216. package/store/index.js +0 -39
  217. package/text/LineBreaks.d.ts +0 -4
  218. package/text/LineBreaks.js +0 -5
  219. package/text/index.js +0 -1
  220. package/util/classNames.d.ts +0 -1
  221. package/util/classNames.js +0 -4
  222. package/util/colors.d.ts +0 -10
  223. package/util/colors.js +0 -10
  224. package/util/display.d.ts +0 -25
  225. package/util/display.js +0 -25
  226. package/util/displayResponsive.d.ts +0 -3
  227. package/util/displayResponsive.js +0 -15
  228. package/util/index.js +0 -7
  229. package/util/pattern.d.ts +0 -7
  230. package/util/pattern.js +0 -15
  231. package/util/position.d.ts +0 -14
  232. package/util/position.js +0 -44
  233. package/util/shape.d.ts +0 -1
  234. package/util/shape.js +0 -3
  235. package/version.txt +0 -1
  236. /package/{asset → public}/fonts/Kostar.ttf +0 -0
  237. /package/{asset → public}/fonts/Megrim.ttf +0 -0
  238. /package/{asset → public}/fonts/NicoMoji.ttf +0 -0
  239. /package/{asset → public}/fonts/Pretendard-Medium.otf +0 -0
  240. /package/{asset → src/asset}/json/credit-lottie.json +0 -0
  241. /package/{asset → src/asset}/json/loading-lottie.json +0 -0
  242. /package/{asset → src/asset}/json/test.svg +0 -0
  243. /package/{globals.css → src/globals.css} +0 -0
@@ -0,0 +1,38 @@
1
+ import { Fragment } from "react";
2
+ import { NavigationContainer } from "../../navigation";
3
+ import { Header } from "./Header";
4
+ import { cn } from "../../util";
5
+
6
+ export function DashboardLayout({
7
+ subject,
8
+ colors,
9
+ navigations,
10
+ children,
11
+ }: {
12
+ subject: [string, string, string];
13
+ colors?: [string, string];
14
+ navigations: React.ReactNode[];
15
+ children: React.ReactNode;
16
+ }) {
17
+ const [title, image, imageUrl] = subject ?? ["", "", ""];
18
+ const [bgColor, textColor] = colors ?? ["white", "black"];
19
+ return (
20
+ <div
21
+ className={cn(
22
+ `bg-${bgColor}`,
23
+ `text-${textColor}`,
24
+ `min-h-screen h-screen xl:h-auto font-pretendard-medium`
25
+ )}
26
+ >
27
+ <Header title={title} image={[image, imageUrl]} />
28
+ <div className="h-full flex gap-12 pt-20 xl:gap-8 xl:pl-2 2xl:px-9 xl:pt-10 xl:m-0 ">
29
+ <NavigationContainer>
30
+ {navigations.map((nav, index) => (
31
+ <Fragment key={index}>{nav}</Fragment>
32
+ ))}
33
+ </NavigationContainer>
34
+ {children}
35
+ </div>
36
+ </div>
37
+ );
38
+ }
@@ -1 +1 @@
1
- export * from "./dashboard";
1
+ export * from "./dashboard";
package/src/main.tsx ADDED
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import App from "./App.tsx";
4
+ import "./globals.css";
5
+
6
+ ReactDOM.createRoot(document.getElementById("root")!).render(
7
+ <React.StrictMode>
8
+ <App />
9
+ </React.StrictMode>
10
+ );
@@ -0,0 +1,104 @@
1
+ import { Dispatch, useEffect } from "react";
2
+ import { useWidgetStore } from "../store";
3
+ import { cn } from "../util";
4
+ import { HTMLElementType } from "../interface";
5
+ import { SideMenuProps } from "../interface/Menu";
6
+
7
+ export default function SideMenu<K extends string, T extends string | number>({
8
+ log,
9
+ setting,
10
+ }: SideMenuProps<K, T>) {
11
+ const { tempData, setTempData, clearTempData, events, removeView } =
12
+ useWidgetStore();
13
+ const isOpen = events.some(({ event }) => event === "sideMenu");
14
+ const positions = "absolute top-20 right-0";
15
+ const paddings = "pt-8";
16
+ const sizes = `${isOpen ? "w-160" : "w-0"} h-full`;
17
+ const styles = `${
18
+ isOpen ? "opacity-100 z-30" : "opacity-0 z-0"
19
+ } bg-gray-200 duration-500`;
20
+ const { prints, logs } = log ?? {};
21
+
22
+ return (
23
+ <div className={cn(positions, sizes, styles, paddings)}>
24
+ <div
25
+ className={`relative w-full h-full flex flex-col items-center gap-12 ${
26
+ isOpen ? "block" : "hidden"
27
+ }`}
28
+ >
29
+ <div className="w-9/10 border-2 border-black p-2 h-80">
30
+ <div className="grid grid-cols-2">
31
+ {Object.entries(setting).map(([key, value]) => (
32
+ <div key={key} className="text-base font-bold flex gap-2">
33
+ <div className="w-16">{value["label"]}:</div>
34
+ <HTMLElement
35
+ type={value["type"]}
36
+ value={tempData[key]}
37
+ options={value["options"]}
38
+ onChange={(value) =>
39
+ setTempData({
40
+ ...tempData,
41
+ [key]: value,
42
+ })
43
+ }
44
+ />
45
+ </div>
46
+ ))}
47
+ </div>
48
+ </div>
49
+ <div className="border-2 border-black w-9/10 p-2 h-48 overflow-y-scroll">
50
+ {logs?.map((log, i) => (
51
+ <div key={i} className="text-base flex gap-2">
52
+ {prints?.map((print) => (
53
+ <div key={print} className="">
54
+ {log[print]}
55
+ </div>
56
+ ))}
57
+ </div>
58
+ ))}
59
+ </div>
60
+ <button
61
+ onClick={() => {
62
+ clearTempData();
63
+ return removeView("sideMenu");
64
+ }}
65
+ className="absolute left-0 top-2/5 text-3xl font-bold"
66
+ >
67
+ {">"}
68
+ </button>
69
+ </div>
70
+ </div>
71
+ );
72
+ }
73
+
74
+ function HTMLElement({
75
+ type,
76
+ value,
77
+ options,
78
+ onChange,
79
+ }: {
80
+ type: HTMLElementType;
81
+ value: string | number;
82
+ options?: [string, string][];
83
+ onChange?: Dispatch<string>;
84
+ }) {
85
+ if (type === "text") return <div>{value}</div>;
86
+ if (type === "input")
87
+ return (
88
+ <input
89
+ className="w-32"
90
+ value={value}
91
+ onChange={(e) => onChange?.(e.target.value)}
92
+ />
93
+ );
94
+ if (type === "select")
95
+ return (
96
+ <select value={value} onChange={(e) => onChange?.(e.target.value)}>
97
+ {options?.map(([value, label]) => (
98
+ <option key={value} value={value}>
99
+ {label}
100
+ </option>
101
+ ))}
102
+ </select>
103
+ );
104
+ }
@@ -1 +1 @@
1
- export { default as SideMenu } from "./SideMenu";
1
+ export { default as SideMenu } from "./SideMenu";
@@ -0,0 +1,24 @@
1
+ import { AlertModalProps } from "../interface/Modal";
2
+ import { col } from "../util";
3
+ import { Modal } from "./Modal";
4
+
5
+ export default function AlertModal({
6
+ title,
7
+ scripts,
8
+ options,
9
+ }: AlertModalProps) {
10
+ const { script, subScript } = scripts ?? {};
11
+ const { buttons } = options ?? {};
12
+
13
+ return (
14
+ <Modal options={{ buttons }}>
15
+ <div className={col(3) + "pl-25 pt-18 h-full pb-12"}>
16
+ <div className={col(6)}>
17
+ <div className="text-3xl font-bold">{title}</div>
18
+ <div className="h-2 w-14 rounded-full bg-pale-lavender" />
19
+ <div className="text-xl font-bold">{script}</div>
20
+ </div>
21
+ </div>
22
+ </Modal>
23
+ );
24
+ }
@@ -0,0 +1,17 @@
1
+ import { Button } from "../interface";
2
+ import { Modal } from "./Modal";
3
+
4
+ export default function ControllerModal({
5
+ options,
6
+ }: {
7
+ options?: {
8
+ buttons?: Button[];
9
+ };
10
+ }) {
11
+ const { buttons } = options ?? {};
12
+ return (
13
+ <Modal options={{ width: "lg", height: "xl", buttons }}>
14
+ <div className="w-full h-120 border-2 "></div>
15
+ </Modal>
16
+ );
17
+ }
@@ -0,0 +1,66 @@
1
+ import { ModalProps } from "../interface/Modal";
2
+ import { useWidgetStore } from "../store";
3
+ import { absolute, cn } from "../util";
4
+
5
+ const background =
6
+ "z-50 flex min-h-screen w-full items-center justify-center bg-black/10 backdrop-blur-sm fixed top-0 left-0";
7
+
8
+ const widthSize = {
9
+ xs: "w-2/3 min-w-76 max-w-176",
10
+ sm: "w-2/3 min-w-76 max-w-176",
11
+ md: "w-2/3 min-w-76 max-w-176",
12
+ lg: "w-full min-w-76 max-w-360",
13
+ xl: "w-2/3 min-w-76 max-w-176",
14
+ "2xl": "w-2/3 min-w-76 max-w-176",
15
+ full: "w-full",
16
+ };
17
+ const heightSize = {
18
+ xs: "",
19
+ sm: "h-100",
20
+ md: "h-72 sm:h-48",
21
+ lg: "h-120",
22
+ xl: "h-180",
23
+ "2xl": "w-2/3 min-w-76 max-w-176",
24
+ full: "h-full",
25
+ };
26
+
27
+ export function Modal({ children, options }: ModalProps) {
28
+ const { buttons, width, height } = options ?? {};
29
+ const { clearModal } = useWidgetStore();
30
+
31
+ const sizes = `${heightSize[height ?? "sm"]} ${widthSize[width ?? "md"]}`;
32
+ const paddings = "pt-18 px-25";
33
+ const styles = "rounded-xl bg-white relative overflow-hidden";
34
+
35
+ return (
36
+ <div className={background}>
37
+ <div className={cn(sizes, styles, paddings)}>
38
+ {children}
39
+ <>
40
+ {buttons ? (
41
+ <div className={`${absolute.br(8, 10)} flex justify-end gap-4`}>
42
+ {buttons.map(([text, onClick]) => (
43
+ <button
44
+ key={text}
45
+ className="rounded-2xl bg-black px-8 py-2 text-2xl font-bold text-white"
46
+ onClick={onClick}
47
+ >
48
+ {text}
49
+ </button>
50
+ ))}
51
+ </div>
52
+ ) : null}
53
+ </>
54
+ <button
55
+ className={
56
+ absolute.tl(5, 7) +
57
+ "bg-black rounded-full h-9 w-9 flex justify-center items-center"
58
+ }
59
+ onClick={clearModal}
60
+ >
61
+ <div className="x-shape" />
62
+ </button>
63
+ </div>
64
+ </div>
65
+ );
66
+ }
@@ -0,0 +1,19 @@
1
+ import { Button } from "../interface";
2
+ import { Modal } from "./Modal";
3
+
4
+ export default function TestModal({
5
+ children,
6
+ options,
7
+ }: {
8
+ children: React.ReactNode;
9
+ options?: {
10
+ buttons?: Button[];
11
+ };
12
+ }) {
13
+ const { buttons } = options ?? {};
14
+ return (
15
+ <Modal options={{ width: "lg", height: "xl", buttons }}>
16
+ <div className="pt-18 pl-25">{children}</div>
17
+ </Modal>
18
+ );
19
+ }
@@ -1,3 +1,3 @@
1
- export { default as TestModal } from "./TestModal";
2
- export { default as AlertModal } from "./AlertModal";
3
- export { default as ControllerModal } from "./ControllerModal";
1
+ export { default as TestModal } from "./TestModal";
2
+ export { default as AlertModal } from "./AlertModal";
3
+ export { default as ControllerModal } from "./ControllerModal";
@@ -0,0 +1,37 @@
1
+ import { center, cn } from "../util";
2
+
3
+ export const buttonClassNames = (
4
+ href: string,
5
+ nowPath: string,
6
+ color?: [string, string]
7
+ ) => {
8
+ const [bg, text] = color ?? ["white", "black"];
9
+ const classNames = [
10
+ center.row(6),
11
+ `text-${text}`,
12
+ "font-bold w-full xl:w-50 h-11 xl:rounded-2xl flex justify-center xl:justify-start xl:pl-5",
13
+ ].join(" ");
14
+
15
+ const checkPathMatch = (href: string, nowPath: string) => {
16
+ return href.split("/").pop() === nowPath.split("/").pop();
17
+ };
18
+
19
+ const toggle = checkPathMatch(href, nowPath)
20
+ ? `bg-${bg}`
21
+ : "bg-gray-500 xl:bg-transparent";
22
+ return [classNames, toggle].join(" ");
23
+ };
24
+
25
+ export function NavigationContainer({
26
+ children,
27
+ }: {
28
+ children: React.ReactNode;
29
+ }) {
30
+ const displays = "flex flex-row xl:flex-col z-40";
31
+ const positions = "fixed bottom-0 left-0 xl:static";
32
+ const sizes = "w-full xl:w-auto";
33
+ const styles = "";
34
+ return (
35
+ <div className={cn(displays, positions, sizes, styles)}>{children}</div>
36
+ );
37
+ }
@@ -1 +1 @@
1
- export * from "./Navigation";
1
+ export * from "./Navigation";
@@ -0,0 +1,3 @@
1
+ export default function Shelf({ children }: { children: React.ReactNode }) {
2
+ return <div className="inline-flex flex-col gap-8 xl:w-auto">{children}</div>;
3
+ }
@@ -1 +1 @@
1
- export { default as Shelf } from "./Shelf";
1
+ export { default as Shelf } from "./Shelf";
@@ -0,0 +1,66 @@
1
+ import { create } from "zustand";
2
+ import { WidgetEvent } from "../interface/Widget";
3
+
4
+ interface WidgetProps {
5
+ events: WidgetEvent[];
6
+ setView: (prop: string) => void;
7
+ removeView: (prop: string) => void;
8
+ setModal: (prop: string) => void;
9
+ removeModal: (prop: string) => void;
10
+ clearModal: () => void;
11
+
12
+ // order for widgets
13
+ order: [string, "asc" | "desc"];
14
+ setOrder: (prop: string) => void;
15
+
16
+ // Temporary data for widgets
17
+ tempData: Record<string, string | number>;
18
+ setTempData: (prop: Record<string, string | number>) => void;
19
+ clearTempData: () => void;
20
+ }
21
+
22
+ export const useWidgetStore = create<WidgetProps>((set) => ({
23
+ events: [],
24
+ setView: (prop) =>
25
+ set((state) => ({
26
+ events: [...state.events, { event: prop, type: "view" }],
27
+ })),
28
+ removeView: (prop) => {
29
+ set((state) => ({
30
+ events: state.events.filter(({ event }) => event !== prop),
31
+ }));
32
+ },
33
+
34
+ order: ["", "asc"],
35
+ setOrder: (prop) => {
36
+ set((state) => {
37
+ if (state.order[0] !== prop) {
38
+ return {
39
+ order: [prop, "asc"],
40
+ };
41
+ }
42
+ return {
43
+ order: [prop, state.order[1] === "asc" ? "desc" : "asc"],
44
+ };
45
+ });
46
+ },
47
+
48
+ setModal: (prop) =>
49
+ set((state) => ({
50
+ events: [...state.events, { event: prop, type: "modal" }],
51
+ })),
52
+ removeModal: (prop) => {
53
+ set((state) => ({
54
+ events: state.events.filter(({ event }) => event !== prop),
55
+ }));
56
+ },
57
+ clearModal: () =>
58
+ set((state) => ({
59
+ events: state.events.filter(({ type }) => type !== "modal"),
60
+ })),
61
+
62
+ tempData: {},
63
+ setTempData: (prop) =>
64
+ set((state) => ({ tempData: { ...state.tempData, ...prop } })),
65
+ clearTempData: () => set({ tempData: {} }),
66
+ }));
@@ -0,0 +1,13 @@
1
+ import { col } from "../util";
2
+
3
+ export function LineBreaks({ texts, gap }: { texts: string[]; gap?: number }) {
4
+ return (
5
+ <div className={col(gap)}>
6
+ {texts.map((text, index) => (
7
+ <div key={index} className="leading-tight">
8
+ {text}
9
+ </div>
10
+ ))}
11
+ </div>
12
+ );
13
+ }
@@ -1 +1 @@
1
- export * from "./LineBreaks";
1
+ export * from "./LineBreaks";
@@ -0,0 +1,4 @@
1
+ export default function classNames(...props: string[]) {
2
+ const array = props.map((prop) => prop.split(" "));
3
+ return array.flat().join(" ");
4
+ }
@@ -0,0 +1,11 @@
1
+ export const colorsByLevel = {
2
+ PS: "ps-pink",
3
+ ST: "st-orange",
4
+ BA: "ba-yellow",
5
+ JR: "jr-blue",
6
+ HJ: "hj-blue",
7
+ };
8
+
9
+ export const gradient = {
10
+ lab: "gradient-to-br from-violet-light/20 to-blue-sky/40 ",
11
+ };
@@ -0,0 +1,31 @@
1
+ export const row = (gap = 8) => `flex flex-row gap-${gap} `;
2
+ export const col = (gap = 8, width?: number | string) =>
3
+ `flex flex-col gap-${gap} ${width ? `w-${width}` : "w-full"} `;
4
+
5
+ export const between = {
6
+ row: "flex flex-row justify-between items-center ",
7
+ col: "flex flex-col justify-between items-center ",
8
+ };
9
+
10
+ export const center = {
11
+ col: (gap = 0) => `gap-${gap} flex flex-col items-center `,
12
+ row: (gap = 0) => `gap-${gap} flex flex-row items-center `,
13
+ colO: (gap = 0) => `gap-${gap} flex flex-col justify-center items-center `,
14
+ rowO: (gap = 0) => `gap-${gap} flex flex-row justify-center items-center `,
15
+ screen: {
16
+ default:
17
+ "flex justify-center items-center min-h-screen w-full overflow-hidden min-h-screen relative ",
18
+ col: (gap = 0) => `gap-${gap} flex flex-col justify-center items-center min-h-screen w-full `,
19
+ row: (gap = 0) => `gap-${gap} flex flex-row justify-center items-center min-h-screen w-full `,
20
+ },
21
+ };
22
+
23
+ export const grid = {
24
+ col: (col: number, gap = 12) => `grid grid-cols-${col} gap-${gap} `,
25
+ row: (row: number, gap = 12) => `grid grid-rows-${row} gap-${gap}`,
26
+ };
27
+
28
+ export const box = {
29
+ row: (height: number, gap?: number) => `h-${height} gap-${gap} flex flex-row `,
30
+ col: (width: number, gap?: number) => `w-${width} gap-${gap} flex flex-col `,
31
+ };
@@ -0,0 +1,17 @@
1
+ export const responsiveColToRow = () => {
2
+ const df = "flex flex-col";
3
+ const mark = "md:flex-row";
4
+ return [df, mark].join(" ");
5
+ };
6
+
7
+ export const responsiveRowToCol = () => {
8
+ const df = "flex flex-row";
9
+ const md = "md:flex-col";
10
+ return [df, md].join(" ");
11
+ };
12
+
13
+ export const responsiveGridToCol = (gridCell: number) => {
14
+ const df = `grid grid-cols-${gridCell}`;
15
+ const md = "md:flex md:flex-col";
16
+ return [df, md].join(" ");
17
+ };
@@ -1,7 +1,7 @@
1
- export { default as cn } from "./classNames";
2
- export * from "./colors";
3
- export * from "./display";
4
- export * from "./displayResponsive";
5
- export * from "./pattern";
6
- export * from "./position";
7
- export * from "./shape";
1
+ export { default as cn } from "./classNames";
2
+ export * from "./colors";
3
+ export * from "./display";
4
+ export * from "./displayResponsive";
5
+ export * from "./pattern";
6
+ export * from "./position";
7
+ export * from "./shape";
@@ -0,0 +1,18 @@
1
+ type Color = [string, string];
2
+ export const buttonStyle = {
3
+ default: (colorSet: [Color, Color] | [Color], size?: { width: number }) => {
4
+ const [colors, hoverColors] = colorSet;
5
+ const [bgColor, textColor] = colors;
6
+ const [bgHoverColor, textHoverColor] = hoverColors || ["", ""];
7
+ const { width } = size || { width: 32 };
8
+
9
+ const classNames = [
10
+ `w-${width}`,
11
+ `bg-${bgColor} ${bgHoverColor ? `hover:bg-${bgHoverColor}` : ""}`,
12
+ `text-${textColor} ${textHoverColor ? `hover:text-${textHoverColor}` : ""}`,
13
+ "font-bold py-2 px-4 rounded",
14
+ ];
15
+
16
+ return classNames.join(" ");
17
+ },
18
+ };
@@ -0,0 +1,43 @@
1
+ export const fixed = {
2
+ tl: (top: number | string, left: number | string) => `fixed top-${top} left-${left} z-50 `,
3
+ br: (bottom: number | string, right: number | string) =>
4
+ `fixed bottom-${bottom} right-${right} z-50 `,
5
+ };
6
+
7
+ export const absolute = {
8
+ tl: (top?: number | string, left?: number | string) => {
9
+ const topClass = () => {
10
+ if (typeof top === "number" && top < 0) return `-top-${Math.abs(top)}`;
11
+ return `top-${top}`;
12
+ };
13
+ const leftClass = () => {
14
+ if (typeof left === "number" && left < 0) return `-left-${Math.abs(left)}`;
15
+ return `left-${left}`;
16
+ };
17
+ return `absolute ${topClass()} ${leftClass()} `;
18
+ },
19
+ tr: (top?: number | string, right?: number | string) => {
20
+ const topClass = () => {
21
+ if (typeof top === "number" && top < 0) return `-top-${Math.abs(top)} `;
22
+ return `top-${top}`;
23
+ };
24
+ const rightClass = () => {
25
+ if (typeof right === "number" && right < 0) return `-right-${Math.abs(right)} `;
26
+ return `right-${right}`;
27
+ };
28
+ return `absolute ${topClass()} ${rightClass()} `;
29
+ },
30
+ br: (bottom = 0, right = 0) => `absolute bottom-${bottom} right-${right} `,
31
+ bl: (bottom = 0, left = 0) => `absolute bottom-${bottom} left-${left} `,
32
+ full: {
33
+ tl: (top?: number | string, left?: number | string) => {
34
+ if (!(typeof top === "number") || !(typeof left === "number"))
35
+ return `absolute top-${top} left-${left} w-full `;
36
+ const topClass = top >= 0 ? `top-${top}` : `-top-${Math.abs(top)}`;
37
+ const leftClass = left >= 0 ? `left-${left}` : `-left-${Math.abs(left)}`;
38
+ return `absolute w-full ${topClass} ${leftClass} `;
39
+ },
40
+ bl: (bottom?: number | string, left?: number | string) =>
41
+ `absolute bottom-${bottom ?? 0} left-${left ?? 0} w-full `,
42
+ },
43
+ };
@@ -0,0 +1,3 @@
1
+ export const circle = (radius: number) => {
2
+ return `rounded-full w-${radius} h-${radius} overflow-hidden `;
3
+ };
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,42 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "resolveJsonModule": true,
12
+ "isolatedModules": true,
13
+ "declaration": true,
14
+ "noEmit": true,
15
+ "jsx": "react-jsx",
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": false,
20
+ "noUnusedParameters": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+
23
+ /* Build */
24
+ "outDir": "./dist"
25
+ },
26
+ "include": ["src", "./eslintrc.json"],
27
+ "exclude": [
28
+ "src/app/**/*",
29
+ "src/_components/**/*",
30
+ "__test__/**/*",
31
+ "build/**/*",
32
+ "src/App.tsx",
33
+ "src/vite-env.d.ts",
34
+ "src/main.tsx",
35
+ "src/**/*.test.ts",
36
+ "src/**/*.test.tsx",
37
+ "src/setupPackage.js",
38
+ "src/setupTests.ts",
39
+ "src/reportWebVitals.ts"
40
+ ],
41
+ "references": [{ "path": "./tsconfig.node.json" }]
42
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+
9
+ /* Bundler mode */
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "noEmit": true,
15
+ "jsx": "react-jsx",
16
+
17
+ /* Linting */
18
+ "strict": true,
19
+ "noUnusedLocals": false,
20
+ "noUnusedParameters": true,
21
+ "noFallthroughCasesInSwitch": true,
22
+
23
+ /* Build */
24
+ "outDir": "./build",
25
+ },
26
+ "include": ["src", "./eslintrc.json", "tailwind.config.ts", "setupPackage.js"],
27
+ "references": [{ "path": "./tsconfig.node.json" }]
28
+ }