@edu-tosel/design 1.0.207 → 1.0.210

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 (31) hide show
  1. package/asset/url.d.ts +5 -0
  2. package/asset/url.js +7 -0
  3. package/asset/url.ts +10 -0
  4. package/interaction/template/ErrorPage.js +2 -1
  5. package/layout/template/Event/One.js +1 -1
  6. package/layout/template/Legacy/Integrate.js +2 -1
  7. package/layout/template/Legacy/Table.js +2 -2
  8. package/layout/template/Regexam/Banner.js +2 -1
  9. package/layout/template/Regexam/OfflineExam.js +2 -1
  10. package/layout/template/Regexam/Types.js +7 -7
  11. package/layout/template/Transcript/design/Transcript.js +4 -4
  12. package/layout/template/Transcript/design/TranscriptAdvanced.design.js +9 -2
  13. package/layout/template/Transcript/design/atom/CardTitle.js +1 -1
  14. package/layout/template/Transcript/design/molecule/BarGraphDuo.d.ts +7 -0
  15. package/layout/template/Transcript/design/molecule/BarGraphDuo.js +6 -0
  16. package/layout/template/Transcript/design/molecule/LSWRChart.d.ts +11 -0
  17. package/layout/template/Transcript/design/molecule/LSWRChart.js +43 -0
  18. package/layout/template/Transcript/design/molecule/OCIChart.d.ts +1 -0
  19. package/layout/template/Transcript/design/molecule/OCIChart.js +60 -0
  20. package/layout/template/Transcript/design/molecule/RadarGraph.d.ts +10 -0
  21. package/layout/template/Transcript/design/molecule/RadarGraph.js +5 -0
  22. package/layout/template/Transcript/design/organism/BarCardCol.js +3 -3
  23. package/layout/template/Transcript/design/organism/OCICard.d.ts +4 -0
  24. package/layout/template/Transcript/design/organism/OCICard.js +17 -0
  25. package/layout/template/Transcript/design/organism/RadarCard.d.ts +7 -0
  26. package/layout/template/Transcript/design/organism/RadarCard.js +54 -0
  27. package/layout/template/Transcript/interface.d.ts +17 -0
  28. package/layout/template/home/layout/Footer.js +2 -1
  29. package/package.json +2 -1
  30. package/tailwind.config.ts +5 -0
  31. package/version.txt +1 -1
package/asset/url.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ declare const urlAsset: {
2
+ homepage: (pathname?: string) => string;
3
+ resource: (pathname?: string) => string;
4
+ };
5
+ export default urlAsset;
package/asset/url.js ADDED
@@ -0,0 +1,7 @@
1
+ const homepage = (pathname) => ["https://new.tosel.org", pathname].filter((v) => v).join("");
2
+ const resource = (pathname) => ["https://resource.tosel.co.kr", pathname].filter((v) => v).join("");
3
+ const urlAsset = {
4
+ homepage,
5
+ resource,
6
+ };
7
+ export default urlAsset;
package/asset/url.ts ADDED
@@ -0,0 +1,10 @@
1
+ const homepage = (pathname?: string) =>
2
+ ["https://new.tosel.org", pathname].filter((v) => v).join("");
3
+ const resource = (pathname?: string) =>
4
+ ["https://resource.tosel.co.kr", pathname].filter((v) => v).join("");
5
+
6
+ const urlAsset = {
7
+ homepage,
8
+ resource,
9
+ };
10
+ export default urlAsset;
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import urlAsset from "../../asset/url";
2
3
  import { LineBreaks } from "../../text";
3
4
  export default function ErrorPage({ message, statusCode, button, }) {
4
- return (_jsx("div", { className: "flex justify-center items-center w-full h-screen", children: _jsxs("div", { className: "flex flex-col justify-center items-center", children: [_jsx("div", { className: "w-full h-fit flex justify-center items-center mb-5 text-green-dark", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", "stroke-width": "1.5", stroke: "currentColor", className: "md:size-10 size-6", children: _jsx("path", { "stroke-linecap": "round", "stroke-linejoin": "round", d: "M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" }) }) }), _jsx(LineBreaks, { texts: message, className: "w-full text-center text-sm md:text-base font-medium text-gray-dark" }), _jsxs("div", { className: "relative flex justify-center items-center md:size-80 size-40", children: [_jsx("div", { className: "absolute flex justify-center items-center left-0 top-0 w-full h-full overflow-visible", children: _jsx("div", { className: "font-medium md:text-[200px] text-[100px] text-green-dark", children: statusCode }) }), _jsx("div", { className: "absolute flex justify-center items-center left-0 top-0 w-full h-full overflow-visible", children: _jsx("img", { src: "https://resource.tosel.co.kr/images/img-character-cocoon-main-new.png", alt: "", className: "size-40 md:size-80 z-10 hover:scale-105 duration-300" }) })] }), _jsx("div", { className: "w-full text-center text-base font-medium text-gray-dark", children: _jsx("button", { onClick: () => button?.onClick ? button.onClick() : window.history.back(), className: "font-medium text-green-dark w-fit h-fit bg-green-light px-4 py-3 rounded-lg hover:shadow-green duration-300 text-sm hover:bg-white", children: button?.title ?? "이전 페이지로 돌아가기" }) })] }) }));
5
+ return (_jsx("div", { className: "flex justify-center items-center w-full h-screen", children: _jsxs("div", { className: "flex flex-col justify-center items-center", children: [_jsx("div", { className: "w-full h-fit flex justify-center items-center mb-5 text-green-dark", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", "stroke-width": "1.5", stroke: "currentColor", className: "md:size-10 size-6", children: _jsx("path", { "stroke-linecap": "round", "stroke-linejoin": "round", d: "M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" }) }) }), _jsx(LineBreaks, { texts: message, className: "w-full text-center text-sm md:text-base font-medium text-gray-dark" }), _jsxs("div", { className: "relative flex justify-center items-center md:size-80 size-40", children: [_jsx("div", { className: "absolute flex justify-center items-center left-0 top-0 w-full h-full overflow-visible", children: _jsx("div", { className: "font-medium md:text-[200px] text-[100px] text-green-dark", children: statusCode }) }), _jsx("div", { className: "absolute flex justify-center items-center left-0 top-0 w-full h-full overflow-visible", children: _jsx("img", { src: urlAsset.resource("/images/img-character-cocoon-main-new.png"), alt: "", className: "size-40 md:size-80 z-10 hover:scale-105 duration-300" }) })] }), _jsx("div", { className: "w-full text-center text-base font-medium text-gray-dark", children: _jsx("button", { onClick: () => button?.onClick ? button.onClick() : window.history.back(), className: "font-medium text-green-dark w-fit h-fit bg-green-light px-4 py-3 rounded-lg hover:shadow-green duration-300 text-sm hover:bg-white", children: button?.title ?? "이전 페이지로 돌아가기" }) })] }) }));
5
6
  }
@@ -48,5 +48,5 @@ export default function One({ event }) {
48
48
  : event.button?.title;
49
49
  return (_jsxs("div", { className: "flex flex-col mmd:flex-row", children: [_jsx("div", { className: "min-w-[320px] h-auto p-5 mmd:sticky mmd:top-20 mmd:self-start", children: _jsxs("div", { className: "w-full h-auto rounded-xl sm:flex mmd:flex-col", children: [_jsx("div", { className: "w-full mmd:h-50 overflow-hidden", children: _jsx("img", { src: event.thumbnail, alt: event.title, className: "rounded-xl h-full object-cover w-full" }) }), _jsxs("div", { className: "w-full h-auto pt-5 sm:p-5 mmd:p-0 mmd:pt-5 gap-3 flex flex-col", children: [_jsx("div", { className: "flex items-center", children: _jsx(StatusText, { event: event }) }), _jsx("div", { className: "text-sm font-bold text-gray-dark flex flex-col items-start mb-2", children: lines.map((line, index) => (_jsxs("span", { children: [line, _jsx("br", {})] }, index))) }), event.button && (_jsx("div", { className: cn(button), onClick: () => {
50
50
  event.button?.onClick && event.button.onClick();
51
- }, children: buttonText }))] })] }, event.id) }), _jsxs("div", { className: "flex-grow p-5", children: [_jsx("div", { children: isHTMLString(event.content) ? (_jsx("div", { dangerouslySetInnerHTML: { __html: event.content }, className: "w-full rounded-xl object-cover overflow-hidden max-w-[810px]" })) : (_jsx("div", { children: event.content })) }), _jsx("button", { onClick: () => history.back(), className: "mt-8 p-5 bg-green-dark/5 text-green-dark rounded-xl flex items-center justify-center hover:bg-green-dark/20 transition-all", children: "\uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" })] })] }));
51
+ }, children: buttonText }))] })] }, event.id) }), _jsxs("div", { className: "flex-grow p-5", children: [_jsx("div", { className: "w-full rounded-xl object-cover overflow-hidden max-w-[810px]", children: isHTMLString(event.content) ? (_jsx("div", { dangerouslySetInnerHTML: { __html: event.content } })) : (_jsx("div", { children: event.content })) }), _jsx("button", { onClick: () => history.back(), className: "mt-8 p-5 bg-green-dark/5 text-green-dark rounded-xl flex items-center justify-center hover:bg-green-dark/20 transition-all", children: "\uBAA9\uB85D\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30" })] })] }));
52
52
  }
@@ -4,6 +4,7 @@ import { Input, Label } from "../../../widget";
4
4
  import Action from "../Action";
5
5
  import { Loading } from "../../../interaction";
6
6
  import { LineBreaks } from "../../../text";
7
+ import urlAsset from "../../../asset/url";
7
8
  export default function Integrate({ isLoading, isUser, usernameState: [oldUsername, setUsername], passwordState: [oldPassword, setPassword], submit, }) {
8
9
  const container = {
9
10
  displays: "flex justify-center items-center",
@@ -36,5 +37,5 @@ export default function Integrate({ isLoading, isUser, usernameState: [oldUserna
36
37
  height: "md",
37
38
  text: "text-white",
38
39
  background: "bg-crimson-burgundy",
39
- } })] }), _jsx("button", { onClick: () => (window.location.href = "https://new.tosel.org/legacy"), className: "flex justify-end text-xs sm:text-sm text-gray-medium mt-3", children: "\uC5F0\uB3D9\uC774 \uC774\uBBF8 \uC644\uB8CC\uB418\uC5C8\uB098\uC694? \uBC14\uB85C \uC131\uC801\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694! (\uD074\uB9AD)" })] }) }) }));
40
+ } })] }), _jsx("button", { onClick: () => (window.location.href = urlAsset.homepage("/legacy")), className: "flex justify-end text-xs sm:text-sm text-gray-medium mt-3", children: "\uC5F0\uB3D9\uC774 \uC774\uBBF8 \uC644\uB8CC\uB418\uC5C8\uB098\uC694? \uBC14\uB85C \uC131\uC801\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694! (\uD074\uB9AD)" })] }) }) }));
40
41
  }
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../../../util";
3
3
  import Action from "../Action";
4
4
  import { useState } from "react";
5
+ import urlAsset from "../../../asset/url";
5
6
  export default function Table({ exams }) {
6
7
  const container = {
7
8
  displays: "flex flex-col lg:flex-row gap-x-16",
@@ -100,8 +101,7 @@ export default function Table({ exams }) {
100
101
  };
101
102
  return (_jsxs("div", { className: cn(container), children: [_jsxs("div", { className: cn(inputBoxWrapperWeb), children: [_jsxs("div", { className: cn(titleWrapperWeb), children: [_jsx("div", { className: cn(mainTitle), children: "\uC774\uC804 \uC131\uC801 \uC870\uD68C\uD558\uAE30" }), _jsx("div", { className: cn(subTitle), children: "85\uD68C \uC774\uC804\uC758 \uC131\uC801\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4." })] }), _jsx("input", { type: "text", className: cn(inputBox), onChange: (e) => {
102
103
  setFilterKey(e.target.value);
103
- }, placeholder: "\uC2DC\uD5D8 \uC774\uB984\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694" }), _jsxs("div", { className: cn(buttonSetWrapper), children: [_jsx("div", { className: "text-xs text-green-dark", children: "\uB2E4\uB978 \uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD558\uACE0 \uC2F6\uB098\uC694?" }), _jsxs("div", { className: cn(buttonSet), children: [_jsx("div", { className: cn(linkButton), onClick: () => (window.location.href = "https://new.tosel.org/"), children: "\uD648\uC73C\uB85C" }), _jsx("div", { className: cn(linkButton), onClick: () => (window.location.href =
104
- "https://new.tosel.org/legacy/integrate"), children: "\uC5F0\uB3D9 \uACC4\uC815 \uCD94\uAC00\uD558\uAE30" }), _jsx("div", { className: cn(linkButton), onClick: () => (window.location.href = "https://tosel.org/HallofFame/main"), children: "\uBA85\uC608\uC758 \uC804\uB2F9" })] })] })] }), _jsxs("div", { className: cn(cardDeckWrapper), children: [_jsx("div", { className: cn(scrollWrapper), children: _jsxs("div", { className: cn(examsWrapper), children: [_jsxs("div", { className: cn(titleWrapperMobile), children: [_jsx("div", { className: cn(mainTitle), children: "\uC774\uC804 \uC131\uC801 \uC870\uD68C\uD558\uAE30" }), _jsx("div", { className: cn(subTitle), children: "85\uD68C \uC774\uC804\uC758 \uC131\uC801\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4." })] }), _jsxs(Action.Replace, { actions: [
104
+ }, placeholder: "\uC2DC\uD5D8 \uC774\uB984\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694" }), _jsxs("div", { className: cn(buttonSetWrapper), children: [_jsx("div", { className: "text-xs text-green-dark", children: "\uB2E4\uB978 \uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD558\uACE0 \uC2F6\uB098\uC694?" }), _jsxs("div", { className: cn(buttonSet), children: [_jsx("div", { className: cn(linkButton), onClick: () => (window.location.href = urlAsset.homepage()), children: "\uD648\uC73C\uB85C" }), _jsx("div", { className: cn(linkButton), onClick: () => (window.location.href = urlAsset.homepage("/legacy/integrate")), children: "\uC5F0\uB3D9 \uACC4\uC815 \uCD94\uAC00\uD558\uAE30" }), _jsx("div", { className: cn(linkButton), onClick: () => (window.location.href = "https://tosel.org/HallofFame/main"), children: "\uBA85\uC608\uC758 \uC804\uB2F9" })] })] })] }), _jsxs("div", { className: cn(cardDeckWrapper), children: [_jsx("div", { className: cn(scrollWrapper), children: _jsxs("div", { className: cn(examsWrapper), children: [_jsxs("div", { className: cn(titleWrapperMobile), children: [_jsx("div", { className: cn(mainTitle), children: "\uC774\uC804 \uC131\uC801 \uC870\uD68C\uD558\uAE30" }), _jsx("div", { className: cn(subTitle), children: "85\uD68C \uC774\uC804\uC758 \uC131\uC801\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4." })] }), _jsxs(Action.Replace, { actions: [
105
105
  [
106
106
  filteredExam.length === 0,
107
107
  _jsxs("div", { className: cn(noResultWrapper), children: [_jsx("div", { className: cn(noResultImg), children: _jsx("img", { src: "/images/legacy/img-legacy-noresult.png", alt: "\uACB0\uACFC \uC5C6\uC74C" }) }), _jsx("div", { className: "text-sm text-center w-full font-medium", children: "\uC774\uB7F0, \uAC80\uC0C9\uACB0\uACFC\uAC00 \uC5C6\uC5B4\uC694" })] }),
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../../../util";
3
3
  import { useState, useEffect } from "react";
4
+ import urlAsset from "../../../asset/url";
4
5
  export default function Banner() {
5
6
  const [isHidden, setIsHidden] = useState(false);
6
7
  useEffect(() => {
@@ -84,7 +85,7 @@ export default function Banner() {
84
85
  backgrounds: "bg-white group hover:bg-green-dark",
85
86
  other: "animate-bounce bg-white p-1 w-10 h-10 ring-1 ring-slate-900/5 shadow-lg rounded-full flex items-center justify-center",
86
87
  };
87
- return (_jsxs("div", { className: cn(container), children: [_jsxs("div", { className: "flex flex-col md:flex-row w-full max-w-6xl justify-between items-center", children: [_jsxs("div", { className: "flex flex-col w-full md:w-fit h-full shrink-0 justify-start", children: [_jsx("div", { className: cn(brandTextSub), children: "about" }), _jsx("div", { className: cn(brandTextCore), children: _jsx("img", { src: "/images/logos/logo-tosel-main.svg", alt: "", className: "h-full" }) }), _jsxs("div", { className: cn(explainer), children: ["15,000\uC5EC\uAC1C\uC758 \uD559\uAD50\uC640 \uD559\uC6D0\uC774 \uC120\uD0DD\uD55C ", _jsx("br", {}), "\uB300\uD55C\uBBFC\uAD6D \uB300\uD45C \uC601\uC5B4 \uC778\uC99D\uC2DC\uD5D8"] }), _jsxs("div", { onClick: () => (window.location.href = `https://new.tosel.org/dashboard`), className: cn(AdvertButton), children: [_jsx("div", { className: cn(buttonBackground1) }), _jsx("div", { className: cn(buttonBackground2) }), _jsx("div", { className: cn(buttonText), children: "\uC9C0\uAE08 \uC811\uC218\uD558\uAE30" })] })] }), _jsx("div", { className: cn(carouselWrapper), children: _jsx(InfiniteCarousel, {}) })] }), _jsxs("div", { className: cn(scrollGuideWrapper), children: [_jsx("div", { className: cn(scrollGuideText), children: "\uC790\uC138\uD55C \uB0B4\uC6A9\uC744 \uBCF4\uB824\uBA74 \uC544\uB798\uB85C \uC2A4\uD06C\uB864 \uD574\uBCF4\uC138\uC694" }), _jsx("div", { className: cn(scrollGuideButton), onClick: handleScroll, children: _jsx("svg", { className: "w-6 h-6 text-green-dark group-hover:text-white", fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { d: "M19 14l-7 7m0 0l-7-7m7 7V3" }) }) })] })] }));
88
+ return (_jsxs("div", { className: cn(container), children: [_jsxs("div", { className: "flex flex-col md:flex-row w-full max-w-6xl justify-between items-center", children: [_jsxs("div", { className: "flex flex-col w-full md:w-fit h-full shrink-0 justify-start", children: [_jsx("div", { className: cn(brandTextSub), children: "about" }), _jsx("div", { className: cn(brandTextCore), children: _jsx("img", { src: "/images/logos/logo-tosel-main.svg", alt: "", className: "h-full" }) }), _jsxs("div", { className: cn(explainer), children: ["15,000\uC5EC\uAC1C\uC758 \uD559\uAD50\uC640 \uD559\uC6D0\uC774 \uC120\uD0DD\uD55C ", _jsx("br", {}), "\uB300\uD55C\uBBFC\uAD6D \uB300\uD45C \uC601\uC5B4 \uC778\uC99D\uC2DC\uD5D8"] }), _jsxs("div", { onClick: () => (window.location.href = urlAsset.homepage("/dashboard")), className: cn(AdvertButton), children: [_jsx("div", { className: cn(buttonBackground1) }), _jsx("div", { className: cn(buttonBackground2) }), _jsx("div", { className: cn(buttonText), children: "\uC9C0\uAE08 \uC811\uC218\uD558\uAE30" })] })] }), _jsx("div", { className: cn(carouselWrapper), children: _jsx(InfiniteCarousel, {}) })] }), _jsxs("div", { className: cn(scrollGuideWrapper), children: [_jsx("div", { className: cn(scrollGuideText), children: "\uC790\uC138\uD55C \uB0B4\uC6A9\uC744 \uBCF4\uB824\uBA74 \uC544\uB798\uB85C \uC2A4\uD06C\uB864 \uD574\uBCF4\uC138\uC694" }), _jsx("div", { className: cn(scrollGuideButton), onClick: handleScroll, children: _jsx("svg", { className: "w-6 h-6 text-green-dark group-hover:text-white", fill: "none", "stroke-linecap": "round", "stroke-linejoin": "round", "stroke-width": "2", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { d: "M19 14l-7 7m0 0l-7-7m7 7V3" }) }) })] })] }));
88
89
  }
89
90
  const InfiniteCarousel = () => {
90
91
  const slides = [
@@ -4,6 +4,7 @@ import { gsap } from "gsap";
4
4
  import { ScrollTrigger } from "gsap/ScrollTrigger";
5
5
  import { cn } from "../../../util";
6
6
  import { useResponsive } from "../../../hook";
7
+ import urlAsset from "../../../asset/url";
7
8
  gsap.registerPlugin(ScrollTrigger);
8
9
  export default function OfflineExam() {
9
10
  const isMD = useResponsive("md");
@@ -95,7 +96,7 @@ export default function OfflineExam() {
95
96
  sizes: "w-full h-0.5 mt-1",
96
97
  colors: "bg-gradient-to-r from-crimson-burgundy to-green-dark flex-shrink-0",
97
98
  };
98
- return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(mainWrapper), children: [_jsxs("div", { className: cn(titleWrapper), ref: scrollWrapperRef, children: [_jsx("div", { className: cn(sectionTitle), children: "\uC815\uAE30\uC2DC\uD5D8 \uC548\uB0B4" }), _jsx("div", { className: cn(sectionSubTitle), children: "\uC5F0 4\uD68C, \uC624\uD504\uB77C\uC778\uC73C\uB85C \uAC1C\uCD5C\uB418\uB294 \uD1A0\uC140 \uC815\uAE30\uC2DC\uD5D8\uC785\uB2C8\uB2E4." }), isMD && (_jsxs("div", { onClick: () => (window.location.href = `https://olympiad.tosel.co.kr/dashboard`), className: cn(AdvertButton), children: [_jsx("div", { className: cn(buttonBackground1) }), _jsx("div", { className: cn(buttonBackground2) }), _jsx("div", { className: cn(buttonText), children: "\uC9C0\uAE08 \uC811\uC218\uD558\uAE30" })] }))] }), _jsxs("div", { className: cn(scrollWrapper), children: [_jsxs("div", { className: cn(miniBox), children: [_jsx("div", { className: cn(miniTitle), children: "\uC2DC\uD5D8\uAD6C\uC131" }), _jsx("div", { className: cn(miniDivider) }), _jsx("div", { className: "h-full w-full mt-5", children: _jsx(TableComponent, {}) })] }), _jsxs("div", { className: cn(miniBox), children: [_jsx("div", { className: cn(miniTitle), children: "\uC5F0\uAC04 \uC2DC\uD5D8 \uC77C\uC815" }), _jsx("div", { className: cn(miniDivider) }), _jsx("div", { className: "h-full w-full mt-5", children: _jsx(AnnualTableComponent, {}) })] }), _jsxs("div", { className: cn(miniBox), children: [_jsx("div", { className: cn(miniTitle), children: "\uB2F9\uC77C \uC138\uBD80\uC77C\uC815" }), _jsx("div", { className: cn(miniDivider) }), _jsx("div", { className: "h-full w-full mt-5", children: _jsx(TimeTableComponent, {}) }), _jsxs("div", { className: "flex flex-col mt-4", children: [_jsx("div", { className: "text-gray-medium font-medium text-sm", children: "*\uACE0\uC0AC\uC7A5 \uB0B4\uBD80\uC5D0\uB294 \uD559\uBD80\uBAA8\uC758 \uCD9C\uC785\uC774 \uC81C\uD55C\uB429\uB2C8\uB2E4." }), _jsx("div", { className: "text-gray-medium font-medium text-sm", children: "*\uC785\uC2E4\uB9C8\uAC10(13\uC2DC 10\uBD84)\uC2DC\uAC04\uC744 \uC900\uC218\uD574\uC8FC\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4." })] })] })] }), !isMD && (_jsxs("div", { onClick: () => (window.location.href = `https://new.tosel.org/dashboard`), className: cn(AdvertButton), children: [_jsx("div", { className: cn(buttonBackground1) }), _jsx("div", { className: cn(buttonBackground2) }), _jsx("div", { className: cn(buttonText), children: "\uC9C0\uAE08 \uC811\uC218\uD558\uAE30" })] }))] }) }));
99
+ return (_jsx("div", { className: cn(container), children: _jsxs("div", { className: cn(mainWrapper), children: [_jsxs("div", { className: cn(titleWrapper), ref: scrollWrapperRef, children: [_jsx("div", { className: cn(sectionTitle), children: "\uC815\uAE30\uC2DC\uD5D8 \uC548\uB0B4" }), _jsx("div", { className: cn(sectionSubTitle), children: "\uC5F0 4\uD68C, \uC624\uD504\uB77C\uC778\uC73C\uB85C \uAC1C\uCD5C\uB418\uB294 \uD1A0\uC140 \uC815\uAE30\uC2DC\uD5D8\uC785\uB2C8\uB2E4." }), isMD && (_jsxs("div", { onClick: () => (window.location.href = urlAsset.homepage("/dashboard")), className: cn(AdvertButton), children: [_jsx("div", { className: cn(buttonBackground1) }), _jsx("div", { className: cn(buttonBackground2) }), _jsx("div", { className: cn(buttonText), children: "\uC9C0\uAE08 \uC811\uC218\uD558\uAE30" })] }))] }), _jsxs("div", { className: cn(scrollWrapper), children: [_jsxs("div", { className: cn(miniBox), children: [_jsx("div", { className: cn(miniTitle), children: "\uC2DC\uD5D8\uAD6C\uC131" }), _jsx("div", { className: cn(miniDivider) }), _jsx("div", { className: "h-full w-full mt-5", children: _jsx(TableComponent, {}) })] }), _jsxs("div", { className: cn(miniBox), children: [_jsx("div", { className: cn(miniTitle), children: "\uC5F0\uAC04 \uC2DC\uD5D8 \uC77C\uC815" }), _jsx("div", { className: cn(miniDivider) }), _jsx("div", { className: "h-full w-full mt-5", children: _jsx(AnnualTableComponent, {}) })] }), _jsxs("div", { className: cn(miniBox), children: [_jsx("div", { className: cn(miniTitle), children: "\uB2F9\uC77C \uC138\uBD80\uC77C\uC815" }), _jsx("div", { className: cn(miniDivider) }), _jsx("div", { className: "h-full w-full mt-5", children: _jsx(TimeTableComponent, {}) }), _jsxs("div", { className: "flex flex-col mt-4", children: [_jsx("div", { className: "text-gray-medium font-medium text-sm", children: "*\uACE0\uC0AC\uC7A5 \uB0B4\uBD80\uC5D0\uB294 \uD559\uBD80\uBAA8\uC758 \uCD9C\uC785\uC774 \uC81C\uD55C\uB429\uB2C8\uB2E4." }), _jsx("div", { className: "text-gray-medium font-medium text-sm", children: "*\uC785\uC2E4\uB9C8\uAC10(13\uC2DC 10\uBD84)\uC2DC\uAC04\uC744 \uC900\uC218\uD574\uC8FC\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4." })] })] })] }), !isMD && (_jsxs("div", { onClick: () => (window.location.href = urlAsset.homepage("/dashboard")), className: cn(AdvertButton), children: [_jsx("div", { className: cn(buttonBackground1) }), _jsx("div", { className: cn(buttonBackground2) }), _jsx("div", { className: cn(buttonText), children: "\uC9C0\uAE08 \uC811\uC218\uD558\uAE30" })] }))] }) }));
99
100
  }
100
101
  export function TableComponent() {
101
102
  const data = [
@@ -5,6 +5,7 @@ import { useActionStore } from "../../../store";
5
5
  import Action from "../Action";
6
6
  import { ConfirmModal } from "../../../modal";
7
7
  import { useResponsive, useVisibilityObserver } from "../../../hook";
8
+ import urlAsset from "../../../asset/url";
8
9
  export default function Types() {
9
10
  const scrollContainerRef = useRef(null);
10
11
  const cardWidth = 400; // card width
@@ -78,9 +79,9 @@ const examStyles = {
78
79
  isHallofFame: true,
79
80
  report: "기본제공",
80
81
  certificate: "3,900원",
81
- link: "https://new.tosel.org/dashboard/user/applications",
82
+ link: urlAsset.homepage("/dashboard/user/applications"),
82
83
  majorColor: "text-crimson-burgundy bg-crimson-burgundy",
83
- imgSrc: "https://resource.tosel.co.kr/images/img-buidling-official.png",
84
+ imgSrc: urlAsset.resource("/images/img-buidling-official.png"),
84
85
  buttonText: "개인 접수하기",
85
86
  mainPrice: "33,000원",
86
87
  subPrice: "39,000원",
@@ -106,7 +107,7 @@ const examStyles = {
106
107
  isHallofFame: true,
107
108
  report: "기본제공",
108
109
  certificate: "기본제공",
109
- link: "https://new.tosel.org/dashboard/academy/applications",
110
+ link: urlAsset.homepage("/dashboard/academy/applications"),
110
111
  majorColor: "text-green-dark bg-green-dark",
111
112
  imgSrc: "https://resource.tosel.co.kr/images/img-buidling-official.png",
112
113
  buttonText: "단체 접수하기",
@@ -134,9 +135,9 @@ const examStyles = {
134
135
  isHallofFame: false,
135
136
  report: "기본제공",
136
137
  certificate: "미제공",
137
- link: "https://new.tosel.org/events/28",
138
+ link: urlAsset.homepage("/events/28"),
138
139
  majorColor: "text-green-dark bg-green-dark",
139
- imgSrc: "https://resource.tosel.co.kr/images/img-buidling-academy.png",
140
+ imgSrc: urlAsset.resource("/images/img-buidling-academy.png"),
140
141
  buttonText: "기관시험 신청하기",
141
142
  mainPrice: "33,000원",
142
143
  subPrice: "39,000원",
@@ -260,8 +261,7 @@ const ExamCard = ({ id, type, name, place, isHallofFame, report, certificate, ma
260
261
  {
261
262
  title: "등록하기",
262
263
  onClick: () => {
263
- window.location.href =
264
- "https://new.tosel.org/sign-up/academy";
264
+ window.location.href = urlAsset.homepage("/sign-up/academy");
265
265
  },
266
266
  option: {
267
267
  text: "font-pretendard-var font-medium text-green-dark",
@@ -49,12 +49,12 @@ export const example = {
49
49
  writingScript: { part5: "asd", part6: "qwe" },
50
50
  },
51
51
  oci: [
52
- { category: "Communicative Competency (CC)", average: 0.25, result: 0.75 },
53
- { category: "Problem-Solving Competency (PS)", average: 0.35, result: 0.9 },
52
+ { category: "Communicative Competency (CC)", average: 25, result: 75 },
53
+ { category: "Problem-Solving Competency (PS)", average: 35, result: 90 },
54
54
  {
55
55
  category: "Interpersonal/Social Competency (IS)",
56
- average: 0.45,
57
- result: 0.68,
56
+ average: 45,
57
+ result: 68,
58
58
  },
59
59
  ],
60
60
  };
@@ -1,9 +1,12 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { forwardRef } from "react";
3
3
  import { paperSize } from "../../../../style/size";
4
4
  import { cn } from "../../../../util";
5
5
  import IdCard from "./organism/IdCard";
6
6
  import { BarCardCol } from "./organism/BarCardCol";
7
+ import { RadarCard } from "./organism/RadarCard";
8
+ import { OCICard } from "./organism/OCICard";
9
+ import { OCIChart } from "./molecule/OCIChart";
7
10
  function TranscriptDesign({ props }, ref) {
8
11
  const { info, score, lswr, oci } = props;
9
12
  const section1Score = score.result.part1 +
@@ -36,7 +39,11 @@ function TranscriptDesign({ props }, ref) {
36
39
  spacings: "px-5 py-2",
37
40
  backgrounds: "bg-gradient-to-r from-crimson-burgundy to-green-dark",
38
41
  };
39
- return (_jsxs("div", { ref: ref, className: cn(container), children: [_jsxs("div", { className: cn(headerBox), children: [_jsx("img", { src: "https://resource.tosel.co.kr/images/header-logo2.png", alt: "\uD1A0\uC140 \uB85C\uACE0", className: "h-10 py-1" }), _jsx("div", { className: "text-white font-bold text-base", children: "Official Score Report" })] }), _jsx(IdCard, { info: info }), _jsx(BarCardCol, { section1: section1Data, section2: section2Data, theme: "red" })] }));
42
+ const RadarWrapper = {
43
+ displays: "flex flex-row gap-5",
44
+ siezs: "w-full h-fit",
45
+ };
46
+ return (_jsx(_Fragment, { children: _jsxs("div", { ref: ref, className: cn(container), children: [_jsxs("div", { className: cn(headerBox), children: [_jsx("img", { src: "https://resource.tosel.co.kr/images/header-logo2.png", alt: "\uD1A0\uC140 \uB85C\uACE0", className: "h-10 py-1" }), _jsx("div", { className: "text-white font-bold text-base", children: "Official Score Report" })] }), _jsx(IdCard, { info: info }), _jsx(BarCardCol, { section1: section1Data, section2: section2Data, theme: "red" }), _jsx(RadarCard, { data: lswr, theme: "red", title: "Section Scores" }), _jsxs("div", { className: cn("page-break"), children: [_jsx("div", { className: "w-full h-5 print:block" }), _jsxs("div", { className: cn(headerBox), children: [_jsx("img", { src: "https://resource.tosel.co.kr/images/header-logo2.png", alt: "\uD1A0\uC140 \uB85C\uACE0", className: "h-10 py-1" }), _jsx("div", { className: "text-white font-bold text-base", children: "Occupational Competency Index Report" })] }), _jsx(OCICard, { data: oci }), _jsx(OCIChart, {})] })] }) }));
40
47
  }
41
48
  function SectionBarGraphProps(title, score, total, script, subScripts, scale, subScore) {
42
49
  return {
@@ -6,7 +6,7 @@ export default function CardTitle({ title, theme, }) {
6
6
  sizes: "h-7 shrink-0 w-full",
7
7
  theme: theme == "green"
8
8
  ? "text-green-dark bg-green-light"
9
- : "text-crimson-burgundy bg-crimson-burgundy/10",
9
+ : "text-white bg-gradient-to-r from-crimson-burgundy to-green-dark",
10
10
  textStyles: "font-medium text-sm",
11
11
  };
12
12
  return _jsx("div", { className: cn(cardTitle), children: title });
@@ -0,0 +1,7 @@
1
+ interface DuoBarProps {
2
+ score: number;
3
+ subScore: number;
4
+ total: number;
5
+ }
6
+ export declare function BarGraphDuo({ score, subScore, total }: DuoBarProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function BarGraphDuo({ score, subScore, total }) {
3
+ const myWidthPercentage = (score / total) * 100;
4
+ const subWithPercentage = (subScore / total) * 100;
5
+ return (_jsxs("div", { className: "w-full h-fit flex flex-col gap-1 shrink-0 py-2 px-0 relative", children: [_jsx("div", { className: "h-fit text-[10px] bg-green-dark text-white text-start rounded-sm px-1", style: { width: `${myWidthPercentage}%` }, children: "My Score" }), _jsx("div", { className: "h-fit text-[10px] bg-crimson-burgundy text-white text-start px-1", style: { width: `${subWithPercentage}%` }, children: "Average" })] }));
6
+ }
@@ -0,0 +1,11 @@
1
+ interface LSWRCellProps {
2
+ data: {
3
+ subject: string;
4
+ A: number;
5
+ B: number;
6
+ fullMark: number;
7
+ partIndicies: number[];
8
+ }[];
9
+ }
10
+ export declare function LSWRChart({ data }: LSWRCellProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const partDescription = [
3
+ {
4
+ number: 1,
5
+ description: "Evaluates the ability to listen to and comprehend short conversations.",
6
+ },
7
+ {
8
+ number: 2,
9
+ description: "Evaluates the ability to comprehend short conversations and select the most appropriate picture.",
10
+ },
11
+ {
12
+ number: 3,
13
+ description: "Evaluates the ability to understand short conversations and answer questions about them.",
14
+ },
15
+ {
16
+ number: 4,
17
+ description: "Evaluates the ability to understand short talks and infer the intended meanings by answering questions.",
18
+ },
19
+ {
20
+ number: 5,
21
+ description: "Evaluates the ability to recognize topics and implications in various reading materials and select the best answers to questions about them.",
22
+ },
23
+ {
24
+ number: 6,
25
+ description: "Evaluates the ability to interpret sentence meanings and complete sentences using appropriate words, structure, and grammar.",
26
+ },
27
+ {
28
+ number: 7,
29
+ description: "Evaluates the ability to skim, analyze, and infer from practical reading materials and select the best answers to questions about them.",
30
+ },
31
+ {
32
+ number: 8,
33
+ description: "Evaluates the ability to recognize topics and implications in various reading materials and select the best answers to questions about them.",
34
+ },
35
+ ];
36
+ // const partDescriptionRecord = createRecord(partDescription, "number");
37
+ export function LSWRChart({ data }) {
38
+ return (_jsx("div", { className: "w-full h-full flex flex-col", children: data.map(({ partIndicies, subject, A, B }) => {
39
+ return (_jsxs("div", { className: "flex w-full h-full even:bg-white odd:bg-gray-light", children: [_jsx("div", { className: "p-2 font-bold bg-crimson-burgundy text-white w-10 shrink-0 text-center", children: subject }), _jsxs("div", { className: "w-16 shrink-0 flex flex-col justify-center items-center p-2 text-center leading-tight", children: [_jsxs("div", { className: "text-green-dark font-bold text-base", children: [A, "%"] }), _jsxs("div", { className: "text-crimson-burgundy font-medium text-xs leading-none", children: [B, "%"] })] }), _jsx("div", { className: "flex flex-col justify-center", children: partIndicies.map(() => {
40
+ return (_jsx("div", { className: "text-[10px] leading-tight p-1 ", children: _jsx("span", { className: "font-bold" }) }));
41
+ }) })] }));
42
+ }) }));
43
+ }
@@ -0,0 +1 @@
1
+ export declare function OCIChart(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../../../../util";
3
+ const ociDescription = [
4
+ {
5
+ name: "CC",
6
+ title: "Communicative Competency",
7
+ description: "The ability to communicate by understanding written and spoken texts through one's lexical knowledge, reading comprehension skills, and grammatical knowledge, as well as by comprehending topics, main points, and details in each text.",
8
+ profession: "Humanities and Social Sciences, Language Professions, Humanities Education, Writing",
9
+ },
10
+ {
11
+ name: "PS",
12
+ title: "Problem-Solving Competency",
13
+ description: "The ability to recognize a problem, propose and apply alternatives through creativity, logic, critical organization, classification, and synthesis of information, and to assess potential consequences.",
14
+ profession: "Accounting, IT, Legal, Social Activities",
15
+ },
16
+ {
17
+ name: "RM",
18
+ title: "Resource Management Competency",
19
+ description: "The ability to plan the use and allocation of resources in practical settings by identifying and gathering various resources, and by understanding and evaluating their relationships.",
20
+ profession: "Planning Services, Social Services, Educational Services",
21
+ },
22
+ {
23
+ name: "IS",
24
+ title: "Interpersonal / Social Competency",
25
+ description: "The ability to discover shared interests with individuals from diverse backgrounds, to connect with and lead others, and to collaborate effectively.",
26
+ profession: "Management, Sales-related Services, Office Work, General Services",
27
+ },
28
+ {
29
+ name: "IU",
30
+ title: "Information Utilization and Processing Competency",
31
+ description: "The ability to collect task-related information and to process it quickly and skillfully by performing cognitive tasks such as classifying or sorting information by type, characteristic, or size.",
32
+ profession: "Engineering, Video Technology, Web, Games, Animation",
33
+ },
34
+ {
35
+ name: "OP",
36
+ title: "Organizational Performance Competency",
37
+ description: "The ability to understand and design organizational systems, and to think logically by applying deductive and inductive reasoning, classifying, identifying, and explaining information.",
38
+ profession: "Educational Services, Planning, Sales-related Services, Finance, and Management",
39
+ },
40
+ {
41
+ name: "SS",
42
+ title: "Self-development and Self-regulation Competency",
43
+ description: "The ability to understand one's own characteristics, aptitudes, and interests, to acquire necessary qualifications through self-management, to self-motivate, and to foster positive learning experiences for ongoing personal development.",
44
+ profession: "Safety Professions, Medical Professions, Environmental Professions",
45
+ },
46
+ ];
47
+ export function OCIChart() {
48
+ const cellHeader = {
49
+ textStyles: "text-center text-white text-sm font-medium",
50
+ displays: "flex justify-center items-center",
51
+ spacings: "p-2",
52
+ };
53
+ const cellNormal = {
54
+ textStyles: "text-gray-dark",
55
+ displays: "flex justify-center items-center",
56
+ };
57
+ return (_jsx("div", { className: cn("overflow-auto w-full scrollbar-hidden rounded-lg mt-5 print:border print:border-gray-medium/70 cursor-default shadow-main print:shadow-none"), children: _jsxs("div", { className: "min-w-[172mm] w-full", children: [_jsxs("div", { className: "flex flex-row bg-gradient-to-r from-crimson-burgundy to-green-dark", children: [_jsx("div", { className: cn(cellHeader, "flex-[1] print:static sticky left-0 bg-crimson-burgundy"), children: "Category" }), _jsx("div", { className: cn(cellHeader, "flex-[5] p-2"), children: "Competency Category" }), _jsx("div", { className: cn(cellHeader, "flex-[2]"), children: "Professional Areas" })] }), ociDescription.map(({ description, profession, title }) => {
58
+ return (_jsxs("div", { className: "flex flex-row text-sm bg-white odd:bg-gray-light", children: [_jsx("div", { className: cn(cellNormal, "flex-[1] print:static sticky left-0 border-r-1 p-2 border-crimson-burgundy backdrop-blur-md text-[10px]"), children: title }), _jsx("div", { className: cn(cellNormal, "flex-[5] text-xs p-2"), children: description }), _jsx("div", { className: cn(cellNormal, "flex-[2] text-xs p-2"), children: profession })] }));
59
+ })] }) }));
60
+ }
@@ -0,0 +1,10 @@
1
+ interface RadarGraphProps {
2
+ data: {
3
+ subject: string;
4
+ A: number;
5
+ B: number;
6
+ fullMark: number;
7
+ }[];
8
+ }
9
+ export declare function RadarGraph({ data }: RadarGraphProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Radar, RadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, ResponsiveContainer, } from "recharts";
3
+ export function RadarGraph({ data }) {
4
+ return (_jsx("div", { className: "w-full aspect-square flex items-center justify-center relative", children: _jsx("div", { className: "absolute top-0 left-0 w-full", children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", aspect: 1, children: _jsxs(RadarChart, { cx: "50%", cy: "50%", outerRadius: "80%", data: data, width: 500, height: 500, children: [_jsx(PolarGrid, {}), _jsx(PolarAngleAxis, { dataKey: "subject" }), _jsx(PolarRadiusAxis, { angle: 30, domain: [0, 100] }), _jsx(Radar, { name: "My Score", dataKey: "A", stroke: "#105652", fill: "#105652", fillOpacity: 0.2 }), _jsx(Radar, { name: "Average", dataKey: "B", stroke: "#910023", fill: "#910023", fillOpacity: 0.1 })] }) }) }) }));
5
+ }
@@ -18,13 +18,13 @@ export function BarCardCol({ section1, section2, theme }) {
18
18
  displays: "flex justify-center items-center align-center",
19
19
  spacings: "px-5",
20
20
  sizes: "w-full h-full",
21
- textStyles: "text-sm break-keep",
21
+ textStyles: "break-keep leading-tight",
22
22
  };
23
23
  const subScriptStyles = {
24
24
  listStyles: "list-disc list-inside",
25
25
  sizes: "w-full",
26
26
  spacings: "p-5",
27
- textStyles: "leading-tight text-xs",
27
+ textStyles: "leading-tight text-[10px]",
28
28
  };
29
- return (_jsxs("div", { className: cn(cardWrapper, printBoxStyles), children: [_jsx(CardTitle, { title: "Grade and Average Score", theme: theme }), _jsxs("div", { className: "flex sm:flex-row flex-col sm:mt-0 mt-5", children: [_jsxs("div", { className: cn(SectionWrapper), children: [_jsx(BarGraph, { title: section1.title ? section1.title : "section1", score: section1.score, total: section1.total, subScore: section1.subScore, scale: section1.scale ? section1.scale : 10, theme: theme }), _jsx("div", { className: cn(ScriptStyles), children: section1.script }), _jsx("div", { className: cn(subScriptStyles), children: section1.subScripts?.map((text, index) => (_jsx("li", { children: text }, index))) })] }), _jsxs("div", { className: cn(SectionWrapper), children: [_jsx(BarGraph, { title: section2.title ? section2.title : "section2", score: section2.score, total: section2.total, subScore: section2.subScore, scale: section2.scale ? section2.scale : 10, theme: theme }), _jsx("div", { className: cn(ScriptStyles), children: section2.script }), _jsx("div", { className: cn(subScriptStyles), children: section2.subScripts?.map((text, index) => (_jsx("li", { children: text }, index))) })] })] })] }));
29
+ return (_jsxs("div", { className: cn(cardWrapper, printBoxStyles), children: [_jsx(CardTitle, { title: "Grade and Average Score", theme: theme }), _jsxs("div", { className: "flex sm:flex-row flex-col sm:mt-0 mt-5", children: [_jsxs("div", { className: cn(SectionWrapper), children: [_jsx(BarGraph, { title: section1.title ? section1.title : "section1", score: section1.score, total: section1.total, subScore: section1.subScore, scale: section1.scale ? section1.scale : 10, theme: theme }), _jsx("div", { className: cn(ScriptStyles, section1.subScripts ? "text-xs" : "text-sm"), children: section1.script }), _jsx("div", { className: cn(subScriptStyles), children: section1.subScripts?.map((text, index) => (_jsx("li", { children: text }, index))) })] }), _jsxs("div", { className: cn(SectionWrapper), children: [_jsx(BarGraph, { title: section2.title ? section2.title : "section2", score: section2.score, total: section2.total, subScore: section2.subScore, scale: section2.scale ? section2.scale : 10, theme: theme }), _jsx("div", { className: cn(ScriptStyles, section1.subScripts ? "text-xs" : "text-sm"), children: section2.script }), _jsx("div", { className: cn(subScriptStyles), children: section2.subScripts?.map((text, index) => (_jsx("li", { children: text }, index))) })] })] })] }));
30
30
  }
@@ -0,0 +1,4 @@
1
+ import { TranscriptAdvancedProps } from "../Transcript";
2
+ export declare function OCICard({ data }: {
3
+ data: TranscriptAdvancedProps["oci"];
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../../../../util";
3
+ import { BarGraphDuo } from "../molecule/BarGraphDuo";
4
+ export function OCICard({ data }) {
5
+ const cellHeader = {
6
+ textStyles: "text-center text-white text-sm font-medium",
7
+ displays: "flex justify-center items-center",
8
+ spacings: "p-2",
9
+ };
10
+ const cellNormal = {
11
+ textStyles: "text-center text-gray-dark",
12
+ displays: "flex justify-center items-center",
13
+ };
14
+ return (_jsx("div", { className: cn("overflow-auto w-full scrollbar-hidden rounded-lg mt-5 print:border print:border-gray-medium/70 cursor-default shadow-main print:shadow-none"), children: _jsxs("div", { className: "min-w-[172mm] w-full", children: [_jsxs("div", { className: "flex flex-row bg-gradient-to-r from-crimson-burgundy to-green-dark", children: [_jsx("div", { className: cn(cellHeader, "flex-[1] print:static sticky left-0 bg-crimson-burgundy"), children: "Rank" }), _jsx("div", { className: cn(cellHeader, "flex-[3]"), children: "Competency Category" }), _jsx("div", { className: cn(cellHeader, "flex-[1]"), children: "Index" }), _jsx("div", { className: cn(cellHeader, "flex-[4]"), children: "Graph" })] }), data.map(({ category, average, result }, key) => {
15
+ return (_jsxs("div", { className: "flex flex-row text-sm bg-white", children: [_jsx("div", { className: cn(cellNormal, "flex-[1] print:static sticky left-0 border-r-1 px-1 border-crimson-burgundy bg-white/80 backdrop-blur-md"), children: key + 1 }), _jsx("div", { className: cn(cellNormal, "flex-[3] text-xs"), children: category }), _jsx("div", { className: cn(cellNormal, "flex-[1] text-base font-bold text-green-dark"), children: result }), _jsx("div", { className: cn(cellNormal, "flex-[4]"), children: _jsx(BarGraphDuo, { score: result, subScore: average, total: 100 }) })] }));
16
+ })] }) }));
17
+ }
@@ -0,0 +1,7 @@
1
+ import { Theme } from "../../interface";
2
+ import { TranscriptAdvancedProps } from "../Transcript";
3
+ export declare function RadarCard({ data, theme, title, }: {
4
+ data: TranscriptAdvancedProps["lswr"];
5
+ theme: Theme;
6
+ title?: string;
7
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../../../../util";
3
+ import CardTitle from "../atom/CardTitle";
4
+ import { printBoxStyles } from "../atom/PrintBoxStyles";
5
+ import { LSWRChart } from "../molecule/LSWRChart";
6
+ import { RadarGraph } from "../molecule/RadarGraph";
7
+ function prepareRadarChartData(averageLSWR, resultLSWR) {
8
+ return [
9
+ {
10
+ subject: "L",
11
+ A: resultLSWR.listening,
12
+ B: averageLSWR.listening,
13
+ fullMark: 100,
14
+ title: "Listening",
15
+ partIndicies: [1, 3, 4],
16
+ },
17
+ {
18
+ subject: "S",
19
+ A: resultLSWR.speaking,
20
+ B: averageLSWR.speaking,
21
+ fullMark: 100,
22
+ title: "Speaking",
23
+ partIndicies: [2],
24
+ },
25
+ {
26
+ subject: "R",
27
+ A: resultLSWR.reading,
28
+ B: averageLSWR.reading,
29
+ fullMark: 100,
30
+ title: "Reading",
31
+ partIndicies: [7, 8],
32
+ },
33
+ {
34
+ subject: "W",
35
+ A: resultLSWR.writing,
36
+ B: averageLSWR.writing,
37
+ fullMark: 100,
38
+ title: "Writing",
39
+ partIndicies: [5, 6],
40
+ },
41
+ ];
42
+ }
43
+ export function RadarCard({ data, theme, title, }) {
44
+ const cardWrapper = {
45
+ displays: "flex flex-col relative",
46
+ sizes: "w-full rounded-lg overflow-hidden",
47
+ backgrounds: "bg-white shadow-main",
48
+ };
49
+ const SectionWrapper = {
50
+ display: "flex flex-row items-center justify-center",
51
+ sizes: "w-full",
52
+ };
53
+ return (_jsxs("div", { className: "w-full h-fit flex flex-col-reverse md:flex-row gap-5 mt-5 print:flex-row", children: [_jsx("div", { className: cn(cardWrapper, printBoxStyles, "flex-[1]"), children: _jsx(LSWRChart, { data: prepareRadarChartData(data.average, data.result) }) }), _jsxs("div", { className: cn(cardWrapper, printBoxStyles, "flex-[1]"), children: [title && _jsx(CardTitle, { title: title, theme: theme }), _jsxs("div", { className: "flex flex-col p-5 h-full justify-center items-center", children: [_jsx("div", { className: cn(SectionWrapper), children: _jsx(RadarGraph, { data: prepareRadarChartData(data.average, data.result) }) }), _jsxs("div", { className: "w-full h-fit flex items-center justify-center gap-5", children: [_jsxs("div", { className: "flex flex-row justify-center items-center gap-2", children: [_jsx("div", { className: "rounded-full h-3 w-3 bg-green-dark" }), _jsx("div", { className: "text-green-dark text-xs", children: "My Score" })] }), _jsxs("div", { className: "flex flex-row justify-center items-center gap-2", children: [_jsx("div", { className: "rounded-full h-3 w-3 bg-crimson-burgundy" }), _jsx("div", { className: "text-crimson-burgundy text-xs", children: "Average" })] })] })] })] })] }));
54
+ }
@@ -1,4 +1,5 @@
1
1
  export type Theme = "green" | "red";
2
+ export type ScoreName = "Average" | "Your Score";
2
3
  export interface SectionBarProps {
3
4
  title: string;
4
5
  score: number;
@@ -8,3 +9,19 @@ export interface SectionBarProps {
8
9
  script: string | string[];
9
10
  subScripts?: string[];
10
11
  }
12
+ export interface Score {
13
+ part1: number;
14
+ part2: number;
15
+ part3: number;
16
+ part4: number;
17
+ part5: number;
18
+ part6: number;
19
+ part7: number;
20
+ part8: number;
21
+ }
22
+ export interface LSWRPercent {
23
+ listening: number;
24
+ speaking: number;
25
+ writing: number;
26
+ reading: number;
27
+ }
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import urlAsset from "../../../../asset/url";
2
3
  import { cn } from "../../../../util";
3
4
  export default function Footer() {
4
5
  const container = {
@@ -48,7 +49,7 @@ const buttons = [
48
49
  // },
49
50
  {
50
51
  title: "GLOBAL",
51
- onClick: () => (window.location.href = "https://new.tosel.org/global"),
52
+ onClick: () => (window.location.href = urlAsset.homepage("/global")),
52
53
  },
53
54
  {
54
55
  title: "FAQ",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edu-tosel/design",
3
- "version": "1.0.207",
3
+ "version": "1.0.210",
4
4
  "description": "UI components for International TOSEL Committee",
5
5
  "keywords": [
6
6
  "jsx",
@@ -14,6 +14,7 @@
14
14
  "type": "module",
15
15
  "scripts": {},
16
16
  "dependencies": {
17
+ "@edu-tosel/utils": "^0.0.30",
17
18
  "@gsap/react": "^2.1.1",
18
19
  "date-fns": "^2.30.0",
19
20
  "date-fns-tz": "^2.0.1",
@@ -677,6 +677,11 @@ export default {
677
677
  "-ms-overflow-style": "none", // For Internet Explorer and Edge
678
678
  "scrollbar-width": "none", // For Firefox
679
679
  },
680
+ // ".page-break": {
681
+ // "@media print": {
682
+ // "page-break-before": "always",
683
+ // },
684
+ // },
680
685
  },
681
686
  {
682
687
  respectPrefix: false,
package/version.txt CHANGED
@@ -1 +1 @@
1
- 1.0.207
1
+ 1.0.210