@ihabdevteam/core 0.9.11 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -1
- package/dist/components.cjs.js +45 -45
- package/dist/components.esm.css +1 -1
- package/dist/ihabdevteam-core-tokens.css +1 -1
- package/dist/ihabdevteam-core.cjs.js +179 -179
- package/dist/ihabdevteam-core.css +1 -1
- package/dist/ihabdevteam-core.d.ts +105 -0
- package/dist/packages/core/src/components/Report/ReportDocument.css +127 -0
- package/dist/packages/core/src/components/Report/ReportDocument.d.ts +77 -0
- package/dist/packages/core/src/components/Report/ReportDocument.js +0 -0
- package/dist/packages/core/src/components/Report/ReportInfoPanel.css +42 -0
- package/dist/packages/core/src/components/Report/ReportInfoPanel.d.ts +26 -0
- package/dist/packages/core/src/components/Report/ReportInfoPanel.js +14 -0
- package/dist/packages/core/src/components.d.ts +4 -0
- package/dist/packages/core/src/components.js +2 -0
- package/dist/packages/core/src/styles.css +63 -31
- package/dist/packages/core/src/tokens.css +25 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
:where(.ihabdevteam-core-scope){color-scheme:light;--brand-main:#499cdf;--brand-sub:#4dcdc0;--color-lightMain:var(--brand-lightMain,#d2e2ef);--color-softMain:var(--brand-softMain,#8bbce4);--color-main:var(--brand-main);--color-main-a10:color-mix(in srgb,var(--color-main) 10%,transparent);--color-main-a20:color-mix(in srgb,var(--color-main) 20%,transparent);--color-deepMain:var(--brand-deepMain,#418ecd);--color-darkMain:var(--brand-darkMain,#1e5a8f);--color-lightSub:var(--brand-lightSub,#d5ecea);--color-softSub:var(--brand-softSub,#92ddd5);--color-sub:var(--brand-sub);--color-sub-a10:color-mix(in srgb,var(--color-sub) 10%,transparent);--color-deepSub:var(--brand-deepSub,#45bbaf);--color-darkSub:var(--brand-darkSub,#257e76);--color-infoLink:#2f7fd1;--color-uiAccent:#32bbae;--color-success:#2fae9e;--color-warn:#e6b94e;--color-warn-a10:#e6b94e1a;--color-error:#d9534f;--color-error-a10:#d9534f1a;--color-like:#e06b68;--color-disabled:#bfc7d1;--color-pureWhite:#fff;--color-white:#fbfdff;--color-white-a10:#fbfdff1a;--color-white-a30:#fbfdff4d;--color-white-a60:#fbfdff99;--color-white-a80:#fbfdffcc;--color-deepWhite:#f8fafc;--color-darkWhite:#eef2f6;--color-whiteLine:#dde3ec;--color-lightGray:#96a4b8;--color-lightGray-a10:#96a4b81a;--color-lightGray-a80:#96a4b8cc;--color-softGray:#7b8ca3;--color-gray:#64748b;--color-gray-a10:#64748b1a;--color-gray-a60:#64748b99;--color-gray-a80:#64748bcc;--color-deepGray:#546170;--color-darkGray:#434d56;--color-darkGray-a10:#434d561a;--color-lightBlack:#32393f;--color-softBlack:#222528;--color-black:#111;--color-pureBlack:#000;--color-popupBlock:rgba(16,24,32,.6);--color-text-primary:var(--color-black);--color-text-secondary:var(--color-gray);--color-text-muted:var(--color-lightGray);--color-text-on-brand:var(--color-pureWhite);--color-surface:var(--color-white);--color-surface-raised:var(--color-deepWhite);--color-surface-sunken:var(--color-darkWhite);--color-border:var(--color-whiteLine);--color-overlay:var(--color-popupBlock);--shadow-popup:20px 20px 20px rgba(0,0,0,.05);--shadow-tooltip:8px 8px 8px rgba(0,0,0,.05);--shadow-button:4px 4px 4px rgba(0,0,0,.05);--shadow-menu:20px 20px 20px rgba(0,0,0,.05);--shadow-card:2px 2px 8px rgba(0,0,0,.06);--shadow-dropdown:8px 8px 24px rgba(0,0,0,.06);--shadow-panel:4px 4px 20px rgba(0,0,0,.06);--font-family:"Pretendard Variable","Pretendard",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;--text-h0-size:40px;--text-h0-line:52px;--text-h0-spacing:-1px;--text-h0-weight:700;--text-h0-weight-bold:800;--text-h1-size:32px;--text-h1-line:44px;--text-h1-spacing:-0.5px;--text-h1-weight:700;--text-h1-weight-bold:800;--text-h2-size:24px;--text-h2-line:34px;--text-h2-spacing:-0.25px;--text-h2-weight:500;--text-h2-weight-bold:600;--text-h3-size:20px;--text-h3-line:30px;--text-h3-spacing:normal;--text-h3-weight:500;--text-h3-weight-bold:600;--text-h4-size:17px;--text-h4-line:26px;--text-h4-spacing:normal;--text-h4-weight:500;--text-h4-weight-bold:600;--text-h5-size:15px;--text-h5-line:23px;--text-h5-spacing:normal;--text-h5-weight:500;--text-h5-weight-bold:600;--text-body-1-size:18px;--text-body-1-line:28px;--text-body-1-weight:400;--text-body-1-weight-bold:600;--text-body-2-size:16px;--text-body-2-line:26px;--text-body-2-weight:400;--text-body-2-weight-bold:600;--text-body-3-size:14px;--text-body-3-line:22px;--text-body-3-weight:400;--text-body-3-weight-bold:600;--text-button-1-size:14px;--text-button-1-line:20px;--text-button-1-weight:500;--text-button-2-size:13px;--text-button-2-line:18px;--text-button-2-weight:400;--text-caption-1-size:12px;--text-caption-1-line:17px;--text-caption-1-weight:400;--text-caption-1-weight-bold:600;--text-caption-2-size:11px;--text-caption-2-line:15px;--text-caption-2-weight:400;--text-caption-2-weight-bold:600;--spacing-xs:8px;--spacing-s:12px;--spacing-m:16px;--spacing-l:20px;--spacing-xl:24px;--spacing-page:60px;--spacing-content:20px;--container-page:1920px;--margin-page:var(--spacing-page);--margin-content:var(--spacing-content);--duration-fast:120ms;--duration-base:200ms;--duration-slow:320ms;--ease-out:cubic-bezier(0.22,0.9,0.3,1);--ease-in-out:cubic-bezier(0.4,0,0.2,1);--bp-tablet:768px;--bp-desktop:1024px;--radius-xs:4px;--radius-sm:8px;--radius-s:10px;--radius-card:12px;--radius-m:20px;--radius-l:40px;--radius-full:999px;--radius-dialog:var(--radius-m);--z-base:0;--z-content:1;--z-dropdown:200;--z-sticky:500;--z-nav:1000;--z-sidebar:1100;--z-overlay:2000;--z-page-popup:2100;--z-fab:2150;--z-modal:2200;--focus-ring:var(--color-main);--z-popover:2300;--z-tooltip:3000;--z-alert:3100;--z-toast:3200}@media (min-width:768px) and (max-width:1023px){:where(.ihabdevteam-core-scope){--spacing-page:40px;--spacing-content:15px;--text-h0-size:32px;--text-h0-line:44px;--text-h0-spacing:-0.75px;--text-h1-size:28px;--text-h1-line:40px;--text-h1-spacing:-0.4px;--text-h2-size:22px;--text-h2-line:32px;--text-h2-spacing:-0.2px;--text-h3-size:18px;--text-h3-line:28px;--text-h4-size:16px;--text-h4-line:24px;--text-h5-size:14px;--text-h5-line:21px;--text-body-1-size:17px;--text-body-1-line:27px;--text-body-2-size:15px;--text-body-2-line:24px;--text-body-3-size:14px;--text-body-3-line:22px}}@media (max-width:767px){:where(.ihabdevteam-core-scope){--spacing-page:20px;--spacing-content:10px;--text-h0-size:28px;--text-h0-line:38px;--text-h0-spacing:-0.5px;--text-h1-size:24px;--text-h1-line:34px;--text-h1-spacing:-0.3px;--text-h2-size:20px;--text-h2-line:29px;--text-h2-spacing:-0.2px;--text-h3-size:17px;--text-h3-line:26px;--text-h4-size:15px;--text-h4-line:23px;--text-h5-size:13px;--text-h5-line:20px;--text-body-1-size:17px;--text-body-1-line:27px;--text-body-2-size:15px;--text-body-2-line:23px;--text-body-3-size:13px;--text-body-3-line:21px}}.ihabdevteam-core-scope [data-font-scale=large1]{--text-h4-size:19px;--text-h4-line:29px;--text-h5-size:17px;--text-h5-line:26px;--text-body-1-size:20px;--text-body-1-line:31px;--text-body-2-size:18px;--text-body-2-line:28px;--text-body-3-size:16px;--text-body-3-line:25px;--text-button-1-size:16px;--text-button-1-line:23px;--text-button-2-size:15px;--text-button-2-line:21px;--text-caption-1-size:14px;--text-caption-1-line:20px;--text-caption-2-size:12px;--text-caption-2-line:17px}.ihabdevteam-core-scope [data-font-scale=large2]{--text-h4-size:21px;--text-h4-line:32px;--text-h5-size:19px;--text-h5-line:29px;--text-body-1-size:23px;--text-body-1-line:36px;--text-body-2-size:20px;--text-body-2-line:31px;--text-body-3-size:18px;--text-body-3-line:28px;--text-button-1-size:18px;--text-button-1-line:26px;--text-button-2-size:16px;--text-button-2-line:23px;--text-caption-1-size:15px;--text-caption-1-line:21px;--text-caption-2-size:14px;--text-caption-2-line:19px}.ihabdevteam-core-scope [data-font-scale=large3]{--text-h4-size:23px;--text-h4-line:35px;--text-h5-size:21px;--text-h5-line:32px;--text-body-1-size:25px;--text-body-1-line:39px;--text-body-2-size:22px;--text-body-2-line:34px;--text-body-3-size:19px;--text-body-3-line:30px;--text-button-1-size:19px;--text-button-1-line:27px;--text-button-2-size:18px;--text-button-2-line:26px;--text-caption-1-size:17px;--text-caption-1-line:24px;--text-caption-2-size:15px;--text-caption-2-line:21px}.ihabdevteam-core-scope [data-theme=dark]{color-scheme:dark;--color-white:#1e2227;--color-deepWhite:#252a30;--color-darkWhite:#2d3238;--color-whiteLine:hsla(0,0%,100%,.08);--color-black:#f0f2f5;--color-softBlack:#dde1e7;--color-lightBlack:#cbd1da;--color-darkGray:#b8c0cc;--color-deepGray:#a1aab7;--color-gray:#8b95a1;--color-softGray:#737f90;--color-lightGray:#60697a;--color-pureWhite:#0f1215;--color-pureBlack:#f0f2f5;--color-disabled:#3f4650}@media (prefers-color-scheme:dark){.ihabdevteam-core-scope :root:not([data-theme=light]):not([data-theme=dark]),.ihabdevteam-core-scope [data-theme=auto]{color-scheme:dark;--color-white:#1e2227;--color-deepWhite:#252a30;--color-darkWhite:#2d3238;--color-whiteLine:hsla(0,0%,100%,.08);--color-black:#f0f2f5;--color-softBlack:#dde1e7;--color-lightBlack:#cbd1da;--color-darkGray:#b8c0cc;--color-deepGray:#a1aab7;--color-gray:#8b95a1;--color-softGray:#737f90;--color-lightGray:#60697a;--color-pureWhite:#0f1215;--color-pureBlack:#f0f2f5;--color-disabled:#3f4650}}.ihabdevteam-core-scope .force-light-scheme{color-scheme:light;--color-pureWhite:#fff;--color-white:#fbfdff;--color-deepWhite:#f8fafc;--color-darkWhite:#eef2f6;--color-whiteLine:#dde3ec;--color-lightGray:#96a4b8;--color-softGray:#7b8ca3;--color-gray:#64748b;--color-deepGray:#546170;--color-darkGray:#434d56;--color-lightBlack:#32393f;--color-softBlack:#222528;--color-black:#111;--color-pureBlack:#000;--color-disabled:#bfc7d1}@media (hover:none){.ihabdevteam-core-scope [role=button]:hover,.ihabdevteam-core-scope a:hover,.ihabdevteam-core-scope button:hover{opacity:1}}.ihabdevteam-core-scope *,.ihabdevteam-core-scope :after,.ihabdevteam-core-scope :before{box-sizing:border-box}.ihabdevteam-core-scope{margin:0}.ihabdevteam-core-scope button,.ihabdevteam-core-scope input,.ihabdevteam-core-scope select,.ihabdevteam-core-scope textarea{font-family:inherit}.ihabdevteam-core-scope .h0,.ihabdevteam-core-scope .h0b{font-size:40px;font-size:var(--text-h0-size);letter-spacing:-1px;letter-spacing:var(--text-h0-spacing);line-height:52px;line-height:var(--text-h0-line);margin:0}.ihabdevteam-core-scope .h1,.ihabdevteam-core-scope .h1b{font-size:32px;font-size:var(--text-h1-size);letter-spacing:-.5px;letter-spacing:var(--text-h1-spacing);line-height:44px;line-height:var(--text-h1-line);margin:0}.ihabdevteam-core-scope .h2,.ihabdevteam-core-scope .h2b{font-size:24px;font-size:var(--text-h2-size);letter-spacing:-.25px;letter-spacing:var(--text-h2-spacing);line-height:34px;line-height:var(--text-h2-line);margin:0}.ihabdevteam-core-scope .h3,.ihabdevteam-core-scope .h3b{font-size:20px;font-size:var(--text-h3-size);letter-spacing:normal;letter-spacing:var(--text-h3-spacing);line-height:30px;line-height:var(--text-h3-line);margin:0}.ihabdevteam-core-scope .h4,.ihabdevteam-core-scope .h4b{font-size:17px;font-size:var(--text-h4-size);letter-spacing:normal;letter-spacing:var(--text-h4-spacing);line-height:26px;line-height:var(--text-h4-line);margin:0}.ihabdevteam-core-scope .h5,.ihabdevteam-core-scope .h5b{font-size:15px;font-size:var(--text-h5-size);letter-spacing:normal;letter-spacing:var(--text-h5-spacing);line-height:23px;line-height:var(--text-h5-line);margin:0}.ihabdevteam-core-scope .h0{font-weight:700;font-weight:var(--text-h0-weight)}.ihabdevteam-core-scope .h1{font-weight:700;font-weight:var(--text-h1-weight)}.ihabdevteam-core-scope .h2{font-weight:500;font-weight:var(--text-h2-weight)}.ihabdevteam-core-scope .h3{font-weight:500;font-weight:var(--text-h3-weight)}.ihabdevteam-core-scope .h4{font-weight:500;font-weight:var(--text-h4-weight)}.ihabdevteam-core-scope .h5{font-weight:500;font-weight:var(--text-h5-weight)}.ihabdevteam-core-scope .h0b{font-weight:800;font-weight:var(--text-h0-weight-bold)}.ihabdevteam-core-scope .h1b{font-weight:800;font-weight:var(--text-h1-weight-bold)}.ihabdevteam-core-scope .h2b{font-weight:600;font-weight:var(--text-h2-weight-bold)}.ihabdevteam-core-scope .h3b{font-weight:600;font-weight:var(--text-h3-weight-bold)}.ihabdevteam-core-scope .h4b{font-weight:600;font-weight:var(--text-h4-weight-bold)}.ihabdevteam-core-scope .h5b{font-weight:600;font-weight:var(--text-h5-weight-bold)}.ihabdevteam-core-scope .body-1,.ihabdevteam-core-scope .body-1b{font-size:18px;font-size:var(--text-body-1-size);font-weight:400;font-weight:var(--text-body-1-weight);line-height:28px;line-height:var(--text-body-1-line);margin:0}.ihabdevteam-core-scope .body-2,.ihabdevteam-core-scope .body-2b{font-size:16px;font-size:var(--text-body-2-size);font-weight:400;font-weight:var(--text-body-2-weight);line-height:26px;line-height:var(--text-body-2-line);margin:0}.ihabdevteam-core-scope .body-3,.ihabdevteam-core-scope .body-3b{font-size:14px;font-size:var(--text-body-3-size);font-weight:400;font-weight:var(--text-body-3-weight);line-height:22px;line-height:var(--text-body-3-line);margin:0}.ihabdevteam-core-scope .body-1b{font-weight:600;font-weight:var(--text-body-1-weight-bold)}.ihabdevteam-core-scope .body-2b{font-weight:600;font-weight:var(--text-body-2-weight-bold)}.ihabdevteam-core-scope .body-3b{font-weight:600;font-weight:var(--text-body-3-weight-bold)}.ihabdevteam-core-scope .button-1{font-size:14px;font-size:var(--text-button-1-size);font-weight:500;font-weight:var(--text-button-1-weight);line-height:20px;line-height:var(--text-button-1-line);margin:0}.ihabdevteam-core-scope .button-2{font-size:13px;font-size:var(--text-button-2-size);font-weight:400;font-weight:var(--text-button-2-weight);line-height:18px;line-height:var(--text-button-2-line);margin:0}.ihabdevteam-core-scope .caption-1,.ihabdevteam-core-scope .caption-1b{font-size:12px;font-size:var(--text-caption-1-size);font-weight:400;font-weight:var(--text-caption-1-weight);line-height:17px;line-height:var(--text-caption-1-line);margin:0}.ihabdevteam-core-scope .caption-2,.ihabdevteam-core-scope .caption-2b{font-size:11px;font-size:var(--text-caption-2-size);font-weight:400;font-weight:var(--text-caption-2-weight);line-height:15px;line-height:var(--text-caption-2-line);margin:0}.ihabdevteam-core-scope .caption-1b{font-weight:600;font-weight:var(--text-caption-1-weight-bold)}.ihabdevteam-core-scope .caption-2b{font-weight:600;font-weight:var(--text-caption-2-weight-bold)}.ihabdevteam-core-scope ::-webkit-scrollbar{height:6px;width:6px}.ihabdevteam-core-scope ::-webkit-scrollbar-track{background:transparent}.ihabdevteam-core-scope ::-webkit-scrollbar-thumb{background:#eef2f6;background:var(--color-darkWhite);border-radius:3px}.ihabdevteam-core-scope ::-webkit-scrollbar-thumb:hover{background:#96a4b8;background:var(--color-lightGray)}.ihabdevteam-core-scope *{scrollbar-color:#eef2f6 transparent;scrollbar-color:var(--color-darkWhite) transparent;scrollbar-width:thin}@keyframes sub-to-main{0%{background-color:#4dcdc0;background-color:var(--color-sub)}to{background-color:#499cdf;background-color:var(--color-main)}}.ihabdevteam-core-scope .safearea{margin:0 auto;max-width:1920px;max-width:var(--container-page);width:100%}.ihabdevteam-core-scope{color:#111;color:var(--color-black);font-family:Pretendard Variable,Pretendard,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;font-family:var(--font-family);overflow-wrap:anywhere;white-space:normal;word-break:keep-all}.ihabdevteam-core-scope :focus-visible{outline:2px solid #499cdf;outline:2px solid var(--focus-ring);outline-offset:2px}@media (prefers-reduced-motion:reduce){.ihabdevteam-core-scope *,.ihabdevteam-core-scope :after,.ihabdevteam-core-scope :before{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}
|
|
1
|
+
:where(.ihabdevteam-core-scope){color-scheme:light;--brand-main:#499cdf;--brand-sub:#4dcdc0;--color-lightMain:var(--brand-lightMain,#d2e2ef);--color-softMain:var(--brand-softMain,#8bbce4);--color-main:var(--brand-main);--color-main-a10:color-mix(in srgb,var(--color-main) 10%,transparent);--color-main-a20:color-mix(in srgb,var(--color-main) 20%,transparent);--color-deepMain:var(--brand-deepMain,#418ecd);--color-darkMain:var(--brand-darkMain,#1e5a8f);--color-lightSub:var(--brand-lightSub,#d5ecea);--color-softSub:var(--brand-softSub,#92ddd5);--color-sub:var(--brand-sub);--color-sub-a10:color-mix(in srgb,var(--color-sub) 10%,transparent);--color-deepSub:var(--brand-deepSub,#45bbaf);--color-darkSub:var(--brand-darkSub,#257e76);--color-infoLink:#2f7fd1;--color-uiAccent:#32bbae;--color-success:#2fae9e;--color-warn:#e6b94e;--color-warn-a10:#e6b94e1a;--color-error:#d9534f;--color-error-a10:#d9534f1a;--color-like:#e06b68;--color-disabled:#bfc7d1;--color-pureWhite:#fff;--color-white:#fbfdff;--color-white-a10:#fbfdff1a;--color-white-a30:#fbfdff4d;--color-white-a60:#fbfdff99;--color-white-a80:#fbfdffcc;--color-deepWhite:#f8fafc;--color-darkWhite:#eef2f6;--color-whiteLine:#dde3ec;--color-lightGray:#96a4b8;--color-lightGray-a10:#96a4b81a;--color-lightGray-a80:#96a4b8cc;--color-softGray:#7b8ca3;--color-gray:#64748b;--color-gray-a10:#64748b1a;--color-gray-a60:#64748b99;--color-gray-a80:#64748bcc;--color-deepGray:#546170;--color-darkGray:#434d56;--color-darkGray-a10:#434d561a;--color-lightBlack:#32393f;--color-softBlack:#222528;--color-black:#111;--color-pureBlack:#000;--color-popupBlock:rgba(16,24,32,.6);--color-text-primary:var(--color-black);--color-text-secondary:var(--color-gray);--color-text-muted:var(--color-lightGray);--color-text-on-brand:var(--color-pureWhite);--color-surface:var(--color-white);--color-surface-raised:var(--color-deepWhite);--color-surface-sunken:var(--color-darkWhite);--color-border:var(--color-whiteLine);--color-overlay:var(--color-popupBlock);--shadow-popup:20px 20px 20px rgba(0,0,0,.05);--shadow-tooltip:8px 8px 8px rgba(0,0,0,.05);--shadow-button:4px 4px 4px rgba(0,0,0,.05);--shadow-menu:20px 20px 20px rgba(0,0,0,.05);--shadow-card:2px 2px 8px rgba(0,0,0,.06);--shadow-dropdown:8px 8px 24px rgba(0,0,0,.06);--shadow-panel:4px 4px 20px rgba(0,0,0,.06);--font-family:"Pretendard Variable","Pretendard",system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;--text-display-1-size:clamp(44px,6.6vw,72px);--text-display-1-line:1.05;--text-display-1-spacing:-0.04em;--text-display-1-weight:800;--text-display-1-weight-bold:900;--text-display-2-size:clamp(38px,5.2vw,56px);--text-display-2-line:1.12;--text-display-2-spacing:-0.03em;--text-display-2-weight:700;--text-display-2-weight-bold:800;--text-display-3-size:clamp(34px,4.1vw,44px);--text-display-3-line:1.2;--text-display-3-spacing:-0.02em;--text-display-3-weight:700;--text-display-3-weight-bold:800;--text-h0-size:40px;--text-h0-line:52px;--text-h0-spacing:-1px;--text-h0-weight:700;--text-h0-weight-bold:800;--text-h1-size:32px;--text-h1-line:44px;--text-h1-spacing:-0.5px;--text-h1-weight:700;--text-h1-weight-bold:800;--text-h2-size:24px;--text-h2-line:34px;--text-h2-spacing:-0.25px;--text-h2-weight:500;--text-h2-weight-bold:600;--text-h3-size:20px;--text-h3-line:30px;--text-h3-spacing:normal;--text-h3-weight:500;--text-h3-weight-bold:600;--text-h4-size:17px;--text-h4-line:26px;--text-h4-spacing:normal;--text-h4-weight:500;--text-h4-weight-bold:600;--text-h5-size:15px;--text-h5-line:23px;--text-h5-spacing:normal;--text-h5-weight:500;--text-h5-weight-bold:600;--text-body-1-size:18px;--text-body-1-line:28px;--text-body-1-weight:400;--text-body-1-weight-bold:600;--text-body-2-size:16px;--text-body-2-line:26px;--text-body-2-weight:400;--text-body-2-weight-bold:600;--text-body-3-size:14px;--text-body-3-line:22px;--text-body-3-weight:400;--text-body-3-weight-bold:600;--text-button-1-size:14px;--text-button-1-line:20px;--text-button-1-weight:500;--text-button-2-size:13px;--text-button-2-line:18px;--text-button-2-weight:400;--text-caption-1-size:12px;--text-caption-1-line:17px;--text-caption-1-weight:400;--text-caption-1-weight-bold:600;--text-caption-2-size:11px;--text-caption-2-line:15px;--text-caption-2-weight:400;--text-caption-2-weight-bold:600;--spacing-xs:8px;--spacing-s:12px;--spacing-m:16px;--spacing-l:20px;--spacing-xl:24px;--spacing-page:60px;--spacing-content:20px;--container-page:1920px;--margin-page:var(--spacing-page);--margin-content:var(--spacing-content);--duration-fast:120ms;--duration-base:200ms;--duration-slow:320ms;--ease-out:cubic-bezier(0.22,0.9,0.3,1);--ease-in-out:cubic-bezier(0.4,0,0.2,1);--bp-tablet:768px;--bp-desktop:1024px;--radius-xs:4px;--radius-sm:8px;--radius-s:10px;--radius-card:12px;--radius-m:20px;--radius-l:40px;--radius-full:999px;--radius-dialog:var(--radius-m);--z-base:0;--z-content:1;--z-dropdown:200;--z-sticky:500;--z-nav:1000;--z-sidebar:1100;--z-overlay:2000;--z-page-popup:2100;--z-fab:2150;--z-modal:2200;--focus-ring:var(--color-main);--z-popover:2300;--z-tooltip:3000;--z-alert:3100;--z-toast:3200}@media (min-width:768px) and (max-width:1023px){:where(.ihabdevteam-core-scope){--spacing-page:40px;--spacing-content:15px;--text-h0-size:32px;--text-h0-line:44px;--text-h0-spacing:-0.75px;--text-h1-size:28px;--text-h1-line:40px;--text-h1-spacing:-0.4px;--text-h2-size:22px;--text-h2-line:32px;--text-h2-spacing:-0.2px;--text-h3-size:18px;--text-h3-line:28px;--text-h4-size:16px;--text-h4-line:24px;--text-h5-size:14px;--text-h5-line:21px;--text-body-1-size:17px;--text-body-1-line:27px;--text-body-2-size:15px;--text-body-2-line:24px;--text-body-3-size:14px;--text-body-3-line:22px}}@media (max-width:767px){:where(.ihabdevteam-core-scope){--spacing-page:20px;--spacing-content:10px;--text-h0-size:28px;--text-h0-line:38px;--text-h0-spacing:-0.5px;--text-h1-size:24px;--text-h1-line:34px;--text-h1-spacing:-0.3px;--text-h2-size:20px;--text-h2-line:29px;--text-h2-spacing:-0.2px;--text-h3-size:17px;--text-h3-line:26px;--text-h4-size:15px;--text-h4-line:23px;--text-h5-size:13px;--text-h5-line:20px;--text-body-1-size:17px;--text-body-1-line:27px;--text-body-2-size:15px;--text-body-2-line:23px;--text-body-3-size:13px;--text-body-3-line:21px}}.ihabdevteam-core-scope [data-font-scale=large1]{--text-h4-size:19px;--text-h4-line:29px;--text-h5-size:17px;--text-h5-line:26px;--text-body-1-size:20px;--text-body-1-line:31px;--text-body-2-size:18px;--text-body-2-line:28px;--text-body-3-size:16px;--text-body-3-line:25px;--text-button-1-size:16px;--text-button-1-line:23px;--text-button-2-size:15px;--text-button-2-line:21px;--text-caption-1-size:14px;--text-caption-1-line:20px;--text-caption-2-size:12px;--text-caption-2-line:17px}.ihabdevteam-core-scope [data-font-scale=large2]{--text-h4-size:21px;--text-h4-line:32px;--text-h5-size:19px;--text-h5-line:29px;--text-body-1-size:23px;--text-body-1-line:36px;--text-body-2-size:20px;--text-body-2-line:31px;--text-body-3-size:18px;--text-body-3-line:28px;--text-button-1-size:18px;--text-button-1-line:26px;--text-button-2-size:16px;--text-button-2-line:23px;--text-caption-1-size:15px;--text-caption-1-line:21px;--text-caption-2-size:14px;--text-caption-2-line:19px}.ihabdevteam-core-scope [data-font-scale=large3]{--text-h4-size:23px;--text-h4-line:35px;--text-h5-size:21px;--text-h5-line:32px;--text-body-1-size:25px;--text-body-1-line:39px;--text-body-2-size:22px;--text-body-2-line:34px;--text-body-3-size:19px;--text-body-3-line:30px;--text-button-1-size:19px;--text-button-1-line:27px;--text-button-2-size:18px;--text-button-2-line:26px;--text-caption-1-size:17px;--text-caption-1-line:24px;--text-caption-2-size:15px;--text-caption-2-line:21px}.ihabdevteam-core-scope [data-theme=dark]{color-scheme:dark;--color-white:#1e2227;--color-deepWhite:#252a30;--color-darkWhite:#2d3238;--color-whiteLine:hsla(0,0%,100%,.08);--color-black:#f0f2f5;--color-softBlack:#dde1e7;--color-lightBlack:#cbd1da;--color-darkGray:#b8c0cc;--color-deepGray:#a1aab7;--color-gray:#8b95a1;--color-softGray:#737f90;--color-lightGray:#60697a;--color-pureWhite:#0f1215;--color-pureBlack:#f0f2f5;--color-disabled:#3f4650}@media (prefers-color-scheme:dark){.ihabdevteam-core-scope :root:not([data-theme=light]):not([data-theme=dark]),.ihabdevteam-core-scope [data-theme=auto]{color-scheme:dark;--color-white:#1e2227;--color-deepWhite:#252a30;--color-darkWhite:#2d3238;--color-whiteLine:hsla(0,0%,100%,.08);--color-black:#f0f2f5;--color-softBlack:#dde1e7;--color-lightBlack:#cbd1da;--color-darkGray:#b8c0cc;--color-deepGray:#a1aab7;--color-gray:#8b95a1;--color-softGray:#737f90;--color-lightGray:#60697a;--color-pureWhite:#0f1215;--color-pureBlack:#f0f2f5;--color-disabled:#3f4650}}.ihabdevteam-core-scope .force-light-scheme{color-scheme:light;--color-pureWhite:#fff;--color-white:#fbfdff;--color-deepWhite:#f8fafc;--color-darkWhite:#eef2f6;--color-whiteLine:#dde3ec;--color-lightGray:#96a4b8;--color-softGray:#7b8ca3;--color-gray:#64748b;--color-deepGray:#546170;--color-darkGray:#434d56;--color-lightBlack:#32393f;--color-softBlack:#222528;--color-black:#111;--color-pureBlack:#000;--color-disabled:#bfc7d1}@media (hover:none){.ihabdevteam-core-scope [role=button]:hover,.ihabdevteam-core-scope a:hover,.ihabdevteam-core-scope button:hover{opacity:1}}.ihabdevteam-core-scope *,.ihabdevteam-core-scope :after,.ihabdevteam-core-scope :before{box-sizing:border-box}.ihabdevteam-core-scope{margin:0}.ihabdevteam-core-scope button,.ihabdevteam-core-scope input,.ihabdevteam-core-scope select,.ihabdevteam-core-scope textarea{font-family:inherit}:where(.ihabdevteam-core-scope) :where(.display-1),:where(.ihabdevteam-core-scope) :where(.display-1b){font-size:clamp(44px,6.6vw,72px);font-size:var(--text-display-1-size);letter-spacing:-.04em;letter-spacing:var(--text-display-1-spacing);line-height:1.05;line-height:var(--text-display-1-line);margin:0}:where(.ihabdevteam-core-scope) :where(.display-2),:where(.ihabdevteam-core-scope) :where(.display-2b){font-size:clamp(38px,5.2vw,56px);font-size:var(--text-display-2-size);letter-spacing:-.03em;letter-spacing:var(--text-display-2-spacing);line-height:1.12;line-height:var(--text-display-2-line);margin:0}:where(.ihabdevteam-core-scope) :where(.display-3),:where(.ihabdevteam-core-scope) :where(.display-3b){font-size:clamp(34px,4.1vw,44px);font-size:var(--text-display-3-size);letter-spacing:-.02em;letter-spacing:var(--text-display-3-spacing);line-height:1.2;line-height:var(--text-display-3-line);margin:0}:where(.ihabdevteam-core-scope) :where(.display-1){font-weight:800;font-weight:var(--text-display-1-weight)}:where(.ihabdevteam-core-scope) :where(.display-2){font-weight:700;font-weight:var(--text-display-2-weight)}:where(.ihabdevteam-core-scope) :where(.display-3){font-weight:700;font-weight:var(--text-display-3-weight)}:where(.ihabdevteam-core-scope) :where(.display-1b){font-weight:900;font-weight:var(--text-display-1-weight-bold)}:where(.ihabdevteam-core-scope) :where(.display-2b){font-weight:800;font-weight:var(--text-display-2-weight-bold)}:where(.ihabdevteam-core-scope) :where(.display-3b){font-weight:800;font-weight:var(--text-display-3-weight-bold)}:where(.ihabdevteam-core-scope) :where(.h0),:where(.ihabdevteam-core-scope) :where(.h0b){font-size:40px;font-size:var(--text-h0-size);letter-spacing:-1px;letter-spacing:var(--text-h0-spacing);line-height:52px;line-height:var(--text-h0-line);margin:0}:where(.ihabdevteam-core-scope) :where(.h1),:where(.ihabdevteam-core-scope) :where(.h1b){font-size:32px;font-size:var(--text-h1-size);letter-spacing:-.5px;letter-spacing:var(--text-h1-spacing);line-height:44px;line-height:var(--text-h1-line);margin:0}:where(.ihabdevteam-core-scope) :where(.h2),:where(.ihabdevteam-core-scope) :where(.h2b){font-size:24px;font-size:var(--text-h2-size);letter-spacing:-.25px;letter-spacing:var(--text-h2-spacing);line-height:34px;line-height:var(--text-h2-line);margin:0}:where(.ihabdevteam-core-scope) :where(.h3),:where(.ihabdevteam-core-scope) :where(.h3b){font-size:20px;font-size:var(--text-h3-size);letter-spacing:normal;letter-spacing:var(--text-h3-spacing);line-height:30px;line-height:var(--text-h3-line);margin:0}:where(.ihabdevteam-core-scope) :where(.h4),:where(.ihabdevteam-core-scope) :where(.h4b){font-size:17px;font-size:var(--text-h4-size);letter-spacing:normal;letter-spacing:var(--text-h4-spacing);line-height:26px;line-height:var(--text-h4-line);margin:0}:where(.ihabdevteam-core-scope) :where(.h5),:where(.ihabdevteam-core-scope) :where(.h5b){font-size:15px;font-size:var(--text-h5-size);letter-spacing:normal;letter-spacing:var(--text-h5-spacing);line-height:23px;line-height:var(--text-h5-line);margin:0}:where(.ihabdevteam-core-scope) :where(.h0){font-weight:700;font-weight:var(--text-h0-weight)}:where(.ihabdevteam-core-scope) :where(.h1){font-weight:700;font-weight:var(--text-h1-weight)}:where(.ihabdevteam-core-scope) :where(.h2){font-weight:500;font-weight:var(--text-h2-weight)}:where(.ihabdevteam-core-scope) :where(.h3){font-weight:500;font-weight:var(--text-h3-weight)}:where(.ihabdevteam-core-scope) :where(.h4){font-weight:500;font-weight:var(--text-h4-weight)}:where(.ihabdevteam-core-scope) :where(.h5){font-weight:500;font-weight:var(--text-h5-weight)}:where(.ihabdevteam-core-scope) :where(.h0b){font-weight:800;font-weight:var(--text-h0-weight-bold)}:where(.ihabdevteam-core-scope) :where(.h1b){font-weight:800;font-weight:var(--text-h1-weight-bold)}:where(.ihabdevteam-core-scope) :where(.h2b){font-weight:600;font-weight:var(--text-h2-weight-bold)}:where(.ihabdevteam-core-scope) :where(.h3b){font-weight:600;font-weight:var(--text-h3-weight-bold)}:where(.ihabdevteam-core-scope) :where(.h4b){font-weight:600;font-weight:var(--text-h4-weight-bold)}:where(.ihabdevteam-core-scope) :where(.h5b){font-weight:600;font-weight:var(--text-h5-weight-bold)}:where(.ihabdevteam-core-scope) :where(.body-1),:where(.ihabdevteam-core-scope) :where(.body-1b){font-size:18px;font-size:var(--text-body-1-size);font-weight:400;font-weight:var(--text-body-1-weight);line-height:28px;line-height:var(--text-body-1-line);margin:0}:where(.ihabdevteam-core-scope) :where(.body-2),:where(.ihabdevteam-core-scope) :where(.body-2b){font-size:16px;font-size:var(--text-body-2-size);font-weight:400;font-weight:var(--text-body-2-weight);line-height:26px;line-height:var(--text-body-2-line);margin:0}:where(.ihabdevteam-core-scope) :where(.body-3),:where(.ihabdevteam-core-scope) :where(.body-3b){font-size:14px;font-size:var(--text-body-3-size);font-weight:400;font-weight:var(--text-body-3-weight);line-height:22px;line-height:var(--text-body-3-line);margin:0}:where(.ihabdevteam-core-scope) :where(.body-1b){font-weight:600;font-weight:var(--text-body-1-weight-bold)}:where(.ihabdevteam-core-scope) :where(.body-2b){font-weight:600;font-weight:var(--text-body-2-weight-bold)}:where(.ihabdevteam-core-scope) :where(.body-3b){font-weight:600;font-weight:var(--text-body-3-weight-bold)}:where(.ihabdevteam-core-scope) :where(.button-1){font-size:14px;font-size:var(--text-button-1-size);font-weight:500;font-weight:var(--text-button-1-weight);line-height:20px;line-height:var(--text-button-1-line);margin:0}:where(.ihabdevteam-core-scope) :where(.button-2){font-size:13px;font-size:var(--text-button-2-size);font-weight:400;font-weight:var(--text-button-2-weight);line-height:18px;line-height:var(--text-button-2-line);margin:0}:where(.ihabdevteam-core-scope) :where(.caption-1),:where(.ihabdevteam-core-scope) :where(.caption-1b){font-size:12px;font-size:var(--text-caption-1-size);font-weight:400;font-weight:var(--text-caption-1-weight);line-height:17px;line-height:var(--text-caption-1-line);margin:0}:where(.ihabdevteam-core-scope) :where(.caption-2),:where(.ihabdevteam-core-scope) :where(.caption-2b){font-size:11px;font-size:var(--text-caption-2-size);font-weight:400;font-weight:var(--text-caption-2-weight);line-height:15px;line-height:var(--text-caption-2-line);margin:0}:where(.ihabdevteam-core-scope) :where(.caption-1b){font-weight:600;font-weight:var(--text-caption-1-weight-bold)}:where(.ihabdevteam-core-scope) :where(.caption-2b){font-weight:600;font-weight:var(--text-caption-2-weight-bold)}.ihabdevteam-core-scope ::-webkit-scrollbar{height:6px;width:6px}.ihabdevteam-core-scope ::-webkit-scrollbar-track{background:transparent}.ihabdevteam-core-scope ::-webkit-scrollbar-thumb{background:#eef2f6;background:var(--color-darkWhite);border-radius:3px}.ihabdevteam-core-scope ::-webkit-scrollbar-thumb:hover{background:#96a4b8;background:var(--color-lightGray)}.ihabdevteam-core-scope *{scrollbar-color:#eef2f6 transparent;scrollbar-color:var(--color-darkWhite) transparent;scrollbar-width:thin}@keyframes sub-to-main{0%{background-color:#4dcdc0;background-color:var(--color-sub)}to{background-color:#499cdf;background-color:var(--color-main)}}.ihabdevteam-core-scope .safearea{margin:0 auto;max-width:1920px;max-width:var(--container-page);width:100%}.ihabdevteam-core-scope{color:#111;color:var(--color-black);font-family:Pretendard Variable,Pretendard,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;font-family:var(--font-family);overflow-wrap:anywhere;white-space:normal;word-break:keep-all}.ihabdevteam-core-scope :focus-visible{outline:2px solid #499cdf;outline:2px solid var(--focus-ring);outline-offset:2px}@media (prefers-reduced-motion:reduce){.ihabdevteam-core-scope *,.ihabdevteam-core-scope :after,.ihabdevteam-core-scope :before{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}
|
|
@@ -4255,6 +4255,111 @@ export declare function removeItem<T>(draft: readonly DraftItem<T>[], key: strin
|
|
|
4255
4255
|
/** @public 배열에서 from 위치 요소를 to 위치로 옮긴 새 배열을 반환한다(원본 불변). 드래그 재정렬 등에 사용. */
|
|
4256
4256
|
export declare function reorderArray<T>(arr: readonly T[], from: number, to: number): T[];
|
|
4257
4257
|
|
|
4258
|
+
/** @public */
|
|
4259
|
+
export declare interface ReportBlock {
|
|
4260
|
+
/** 블록을 가리키는 값. 같은 목록 안에서 겹치지 않아야 한다. */
|
|
4261
|
+
id: string;
|
|
4262
|
+
/** 그 블록이 그리는 내용. */
|
|
4263
|
+
content: ReactNode;
|
|
4264
|
+
/**
|
|
4265
|
+
* 문서의 갈래. 값이 바뀌는 자리에서 반드시 새 장이 시작하고, 그 장의 머리
|
|
4266
|
+
* 제목도 이 값으로 고른다(`sectionTitles`). 한 장에 "검사 결과" 제목을 달고
|
|
4267
|
+
* 응답 데이터가 이어지는 일을 막는다.
|
|
4268
|
+
*/
|
|
4269
|
+
section?: string;
|
|
4270
|
+
/**
|
|
4271
|
+
* 쪽을 나눌 때 한 덩어리로 다룰 묶음. 표 머리와 그 행들처럼 갈라지면 읽을 수
|
|
4272
|
+
* 없는 것들에 같은 값을 준다 — 남은 자리가 모자라면 통째로 다음 장으로 간다.
|
|
4273
|
+
* 묶음 하나가 한 장보다 크면 어쩔 수 없이 블록 단위로 쪼갠다.
|
|
4274
|
+
*/
|
|
4275
|
+
group?: string;
|
|
4276
|
+
}
|
|
4277
|
+
|
|
4278
|
+
/**
|
|
4279
|
+
* 인쇄물처럼 쪽이 나뉘는 보고서 문서.
|
|
4280
|
+
*
|
|
4281
|
+
* 넘긴 블록들을 숨겨서 한 번 그려 높이를 재고, 한 장에 담기는 높이에 맞춰
|
|
4282
|
+
* 순서대로 채우다 넘치면 다음 장으로 넘긴다. 장마다 머리(제목 + 로고)와
|
|
4283
|
+
* 바닥(로고·저작권 + 쪽 번호)이 반복된다.
|
|
4284
|
+
*
|
|
4285
|
+
* 재는 방식이라 글꼴이 늦게 오거나 이미지가 나중에 뜨면 쪽이 밀릴 수 있다.
|
|
4286
|
+
* 그 경우 `blocks` 를 그대로 두고 다시 그리면 다시 잰다.
|
|
4287
|
+
*
|
|
4288
|
+
* 화면에 그린 쪽 수는 다른 도구로 만든 PDF 와 다를 수 있다. 같은 내용을 그리는
|
|
4289
|
+
* 높이가 서로 달라서인데, 쪽 수까지 맞춰야 하면 양쪽 본문 높이를 견줘야 한다.
|
|
4290
|
+
*
|
|
4291
|
+
* @example
|
|
4292
|
+
* ```tsx
|
|
4293
|
+
* <ReportDocument
|
|
4294
|
+
* logo={<img src={logoApeb} alt="APEB" className="report-doc__logo" />}
|
|
4295
|
+
* sectionTitles={{ result: '검사 결과', answer: '응답 데이터' }}
|
|
4296
|
+
* blocks={[
|
|
4297
|
+
* { id: 'info', section: 'result', content: <ReportInfoPanel title="피검사자 정보" fields={fields} /> },
|
|
4298
|
+
* { id: 'tbl-head', section: 'result', group: 'screening', content: <TableHead /> },
|
|
4299
|
+
* { id: 'tbl-body', section: 'result', group: 'screening', content: <TableBody /> },
|
|
4300
|
+
* ]}
|
|
4301
|
+
* />
|
|
4302
|
+
* ```
|
|
4303
|
+
*
|
|
4304
|
+
* @public
|
|
4305
|
+
*/
|
|
4306
|
+
export declare function ReportDocument({ blocks, sectionTitles, logo, footer, pageLabel, pageWidth, pageHeight, margin, className, style, }: ReportDocumentProps): JSX.Element;
|
|
4307
|
+
|
|
4308
|
+
/** @public */
|
|
4309
|
+
export declare interface ReportDocumentProps {
|
|
4310
|
+
/** 문서에 실을 내용. 준 순서 그대로 채운다. */
|
|
4311
|
+
blocks: ReportBlock[];
|
|
4312
|
+
/** `section` 값 → 그 장의 머리 제목. 없으면 머리 제목 자리를 비운다. */
|
|
4313
|
+
sectionTitles?: Record<string, ReactNode>;
|
|
4314
|
+
/** 매 장 오른쪽 위. 제품 로고를 넣는다. */
|
|
4315
|
+
logo?: ReactNode;
|
|
4316
|
+
/**
|
|
4317
|
+
* 매 장 왼쪽 아래.
|
|
4318
|
+
* @defaultValue IHAB 로고 + `© IHAB, Inc. All rights reserved.`
|
|
4319
|
+
*/
|
|
4320
|
+
footer?: ReactNode;
|
|
4321
|
+
/**
|
|
4322
|
+
* 매 장 오른쪽 아래.
|
|
4323
|
+
* @defaultValue `1 / 6` 꼴
|
|
4324
|
+
*/
|
|
4325
|
+
pageLabel?: (page: number, total: number) => ReactNode;
|
|
4326
|
+
/** @defaultValue `'210mm'` */
|
|
4327
|
+
pageWidth?: string;
|
|
4328
|
+
/** @defaultValue `'297mm'` */
|
|
4329
|
+
pageHeight?: string;
|
|
4330
|
+
/** 네 변 여백. @defaultValue `'14mm'` */
|
|
4331
|
+
margin?: string;
|
|
4332
|
+
className?: string;
|
|
4333
|
+
style?: CSSProperties;
|
|
4334
|
+
}
|
|
4335
|
+
|
|
4336
|
+
/** @public */
|
|
4337
|
+
export declare interface ReportInfoField {
|
|
4338
|
+
label: ReactNode;
|
|
4339
|
+
value: ReactNode;
|
|
4340
|
+
}
|
|
4341
|
+
|
|
4342
|
+
/**
|
|
4343
|
+
* 보고서 첫머리의 대상자 정보 패널 — 이름표와 값이 짝지어 격자로 놓인다.
|
|
4344
|
+
*
|
|
4345
|
+
* 값에 무엇이 들어갈지는 제품이 정한다. 값이 없을 때 `-` 를 넣을지 빈칸으로
|
|
4346
|
+
* 둘지도 부르는 쪽에서 정해 넘긴다(보고서는 빈칸보다 `-` 가 읽기 좋다).
|
|
4347
|
+
*
|
|
4348
|
+
* @public
|
|
4349
|
+
*/
|
|
4350
|
+
export declare function ReportInfoPanel({ title, fields, columns, className, style, }: ReportInfoPanelProps): JSX.Element;
|
|
4351
|
+
|
|
4352
|
+
/** @public */
|
|
4353
|
+
export declare interface ReportInfoPanelProps {
|
|
4354
|
+
/** 패널 제목. 없으면 제목 줄을 그리지 않는다. */
|
|
4355
|
+
title?: ReactNode;
|
|
4356
|
+
fields: ReportInfoField[];
|
|
4357
|
+
/** 한 줄에 놓을 칸 수. @defaultValue 4 */
|
|
4358
|
+
columns?: number;
|
|
4359
|
+
className?: string;
|
|
4360
|
+
style?: CSSProperties;
|
|
4361
|
+
}
|
|
4362
|
+
|
|
4258
4363
|
/**
|
|
4259
4364
|
* 에셋 경로를 절대 URL 또는 베이스 URL 기준의 경로로 변환합니다.
|
|
4260
4365
|
*
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* ── 바깥 스크롤 상자 ───────────────────────────────────────
|
|
2
|
+
A4(210mm ≈ 794px)는 좁은 화면보다 넓다. 그냥 `center` 로 두면 넘친 양이
|
|
3
|
+
좌우로 갈리는데, 왼쪽으로 넘친 부분은 스크롤로 닿지 않는다(브라우저가
|
|
4
|
+
스크롤 폭을 실제보다 짧게 잡는다). `safe center` 는 들어갈 때는 가운데,
|
|
5
|
+
넘칠 때는 왼쪽 맞춤이라 전체를 훑어볼 수 있다. */
|
|
6
|
+
.report-doc {
|
|
7
|
+
--report-page-w: 210mm;
|
|
8
|
+
--report-page-h: 297mm;
|
|
9
|
+
--report-margin: 14mm;
|
|
10
|
+
|
|
11
|
+
display: flex;
|
|
12
|
+
width: 100%;
|
|
13
|
+
/* flex·grid 안에 놓이면 자동 최소 크기가 한 장의 폭(A4 794px)이라 줄어들지
|
|
14
|
+
않는다. 그대로 두면 좁은 부모를 뚫고 나가 바깥에서 잘리고, 여기 걸어 둔
|
|
15
|
+
가로 스크롤은 쓰이지도 않는다. */
|
|
16
|
+
min-width: 0;
|
|
17
|
+
max-width: 100%;
|
|
18
|
+
justify-content: safe center;
|
|
19
|
+
overflow-x: auto;
|
|
20
|
+
padding-block: var(--spacing-s);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.report-doc__pages {
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: var(--spacing-l);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* ── 한 장 ─────────────────────────────────────────────────
|
|
31
|
+
종이는 언제나 흰 바탕에 검은 글씨다. 화면 테마를 따라가지 않는다. */
|
|
32
|
+
.report-doc__page {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
flex-shrink: 0;
|
|
36
|
+
width: var(--report-page-w);
|
|
37
|
+
min-height: var(--report-page-h);
|
|
38
|
+
padding: var(--report-margin);
|
|
39
|
+
background: #fff;
|
|
40
|
+
color: #000;
|
|
41
|
+
box-shadow: var(--shadow-card);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.report-doc__header {
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: center;
|
|
47
|
+
justify-content: space-between;
|
|
48
|
+
margin-bottom: var(--spacing-s);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.report-doc__title {
|
|
52
|
+
margin: 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.report-doc__footer {
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
justify-content: space-between;
|
|
59
|
+
margin-top: auto;
|
|
60
|
+
padding-top: var(--spacing-s);
|
|
61
|
+
color: var(--color-gray);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.report-doc__footer-left {
|
|
65
|
+
display: flex;
|
|
66
|
+
align-items: center;
|
|
67
|
+
gap: var(--spacing-s);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.report-doc__page-no {
|
|
71
|
+
font-variant-numeric: tabular-nums;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.report-doc__logo {
|
|
75
|
+
height: 28px;
|
|
76
|
+
width: auto;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ── 측정용(화면에 보이지 않음) ─────────────────────────────
|
|
80
|
+
실제 장과 같은 안쪽 폭·같은 레이아웃으로 한 번 그려 높이를 잰다.
|
|
81
|
+
|
|
82
|
+
`display: flex; flex-direction: column` 이 폭만큼이나 중요하다. 실제 장이
|
|
83
|
+
flex 컬럼이라 블록 래퍼가 각자 서식 문맥을 만들어 자식의 아래 마진을 자기
|
|
84
|
+
높이에 품는데, 측정 쪽을 일반 블록으로 두면 그 마진이 밖으로 병합돼 블록마다
|
|
85
|
+
십수 px 씩 작게 잡힌다. 그만큼 한 장에 더 담기는 것으로 계산돼 넘친다. */
|
|
86
|
+
.report-doc__measure {
|
|
87
|
+
position: absolute;
|
|
88
|
+
z-index: -10;
|
|
89
|
+
display: flex;
|
|
90
|
+
flex-direction: column;
|
|
91
|
+
width: calc(var(--report-page-w) - var(--report-margin) * 2);
|
|
92
|
+
opacity: 0;
|
|
93
|
+
pointer-events: none;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* 실제 장과 같은 flex 컬럼이라야 블록 높이가 같게 잡힌다(위 설명 참조). */
|
|
97
|
+
.report-doc__measure-blocks {
|
|
98
|
+
display: flex;
|
|
99
|
+
flex-direction: column;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* 한 장에서 본문이 쓸 수 있는 높이를 브라우저에게 직접 물어보기 위한 자.
|
|
103
|
+
mm→px 환산을 코드에 박지 않으므로 페이지 규격을 바꿔도 따라온다. */
|
|
104
|
+
.report-doc__ruler {
|
|
105
|
+
height: calc(var(--report-page-h) - var(--report-margin) * 2);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@media print {
|
|
109
|
+
.report-doc {
|
|
110
|
+
display: block;
|
|
111
|
+
overflow: visible;
|
|
112
|
+
padding-block: 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.report-doc__pages {
|
|
116
|
+
display: block;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.report-doc__page {
|
|
120
|
+
box-shadow: none;
|
|
121
|
+
break-after: page;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.report-doc__page:last-child {
|
|
125
|
+
break-after: auto;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import './ReportDocument.css';
|
|
3
|
+
/** @public */
|
|
4
|
+
export interface ReportBlock {
|
|
5
|
+
/** 블록을 가리키는 값. 같은 목록 안에서 겹치지 않아야 한다. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** 그 블록이 그리는 내용. */
|
|
8
|
+
content: ReactNode;
|
|
9
|
+
/**
|
|
10
|
+
* 문서의 갈래. 값이 바뀌는 자리에서 반드시 새 장이 시작하고, 그 장의 머리
|
|
11
|
+
* 제목도 이 값으로 고른다(`sectionTitles`). 한 장에 "검사 결과" 제목을 달고
|
|
12
|
+
* 응답 데이터가 이어지는 일을 막는다.
|
|
13
|
+
*/
|
|
14
|
+
section?: string;
|
|
15
|
+
/**
|
|
16
|
+
* 쪽을 나눌 때 한 덩어리로 다룰 묶음. 표 머리와 그 행들처럼 갈라지면 읽을 수
|
|
17
|
+
* 없는 것들에 같은 값을 준다 — 남은 자리가 모자라면 통째로 다음 장으로 간다.
|
|
18
|
+
* 묶음 하나가 한 장보다 크면 어쩔 수 없이 블록 단위로 쪼갠다.
|
|
19
|
+
*/
|
|
20
|
+
group?: string;
|
|
21
|
+
}
|
|
22
|
+
/** @public */
|
|
23
|
+
export interface ReportDocumentProps {
|
|
24
|
+
/** 문서에 실을 내용. 준 순서 그대로 채운다. */
|
|
25
|
+
blocks: ReportBlock[];
|
|
26
|
+
/** `section` 값 → 그 장의 머리 제목. 없으면 머리 제목 자리를 비운다. */
|
|
27
|
+
sectionTitles?: Record<string, ReactNode>;
|
|
28
|
+
/** 매 장 오른쪽 위. 제품 로고를 넣는다. */
|
|
29
|
+
logo?: ReactNode;
|
|
30
|
+
/**
|
|
31
|
+
* 매 장 왼쪽 아래.
|
|
32
|
+
* @defaultValue IHAB 로고 + `© IHAB, Inc. All rights reserved.`
|
|
33
|
+
*/
|
|
34
|
+
footer?: ReactNode;
|
|
35
|
+
/**
|
|
36
|
+
* 매 장 오른쪽 아래.
|
|
37
|
+
* @defaultValue `1 / 6` 꼴
|
|
38
|
+
*/
|
|
39
|
+
pageLabel?: (page: number, total: number) => ReactNode;
|
|
40
|
+
/** @defaultValue `'210mm'` */
|
|
41
|
+
pageWidth?: string;
|
|
42
|
+
/** @defaultValue `'297mm'` */
|
|
43
|
+
pageHeight?: string;
|
|
44
|
+
/** 네 변 여백. @defaultValue `'14mm'` */
|
|
45
|
+
margin?: string;
|
|
46
|
+
className?: string;
|
|
47
|
+
style?: CSSProperties;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 인쇄물처럼 쪽이 나뉘는 보고서 문서.
|
|
51
|
+
*
|
|
52
|
+
* 넘긴 블록들을 숨겨서 한 번 그려 높이를 재고, 한 장에 담기는 높이에 맞춰
|
|
53
|
+
* 순서대로 채우다 넘치면 다음 장으로 넘긴다. 장마다 머리(제목 + 로고)와
|
|
54
|
+
* 바닥(로고·저작권 + 쪽 번호)이 반복된다.
|
|
55
|
+
*
|
|
56
|
+
* 재는 방식이라 글꼴이 늦게 오거나 이미지가 나중에 뜨면 쪽이 밀릴 수 있다.
|
|
57
|
+
* 그 경우 `blocks` 를 그대로 두고 다시 그리면 다시 잰다.
|
|
58
|
+
*
|
|
59
|
+
* 화면에 그린 쪽 수는 다른 도구로 만든 PDF 와 다를 수 있다. 같은 내용을 그리는
|
|
60
|
+
* 높이가 서로 달라서인데, 쪽 수까지 맞춰야 하면 양쪽 본문 높이를 견줘야 한다.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```tsx
|
|
64
|
+
* <ReportDocument
|
|
65
|
+
* logo={<img src={logoApeb} alt="APEB" className="report-doc__logo" />}
|
|
66
|
+
* sectionTitles={{ result: '검사 결과', answer: '응답 데이터' }}
|
|
67
|
+
* blocks={[
|
|
68
|
+
* { id: 'info', section: 'result', content: <ReportInfoPanel title="피검사자 정보" fields={fields} /> },
|
|
69
|
+
* { id: 'tbl-head', section: 'result', group: 'screening', content: <TableHead /> },
|
|
70
|
+
* { id: 'tbl-body', section: 'result', group: 'screening', content: <TableBody /> },
|
|
71
|
+
* ]}
|
|
72
|
+
* />
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @public
|
|
76
|
+
*/
|
|
77
|
+
export default function ReportDocument({ blocks, sectionTitles, logo, footer, pageLabel, pageWidth, pageHeight, margin, className, style, }: ReportDocumentProps): import("react").JSX.Element;
|
|
Binary file
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
.report-info {
|
|
2
|
+
margin-bottom: var(--spacing-l);
|
|
3
|
+
padding: var(--spacing-s) var(--spacing-m);
|
|
4
|
+
border: 1px solid var(--color-border);
|
|
5
|
+
border-radius: var(--radius-card);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.report-info__title {
|
|
9
|
+
margin: 0 0 var(--spacing-s);
|
|
10
|
+
color: var(--color-darkGray);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.report-info__grid {
|
|
14
|
+
display: grid;
|
|
15
|
+
grid-template-columns: repeat(var(--report-info-cols, 4), minmax(0, 1fr));
|
|
16
|
+
gap: var(--spacing-xs) var(--spacing-l);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* 좁은 화면에서는 두 칸으로 접는다 — 인쇄물은 늘 넓지만 화면 미리보기가
|
|
20
|
+
좁아질 수 있다. */
|
|
21
|
+
@media (max-width: 640px) {
|
|
22
|
+
.report-info__grid {
|
|
23
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.report-info__field {
|
|
28
|
+
display: flex;
|
|
29
|
+
align-items: baseline;
|
|
30
|
+
gap: var(--spacing-s);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.report-info__label {
|
|
34
|
+
width: 3.5rem;
|
|
35
|
+
flex-shrink: 0;
|
|
36
|
+
color: var(--color-gray);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.report-info__value {
|
|
40
|
+
color: var(--color-darkGray);
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CSSProperties, ReactNode } from 'react';
|
|
2
|
+
import './ReportInfoPanel.css';
|
|
3
|
+
/** @public */
|
|
4
|
+
export interface ReportInfoField {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
value: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
/** @public */
|
|
9
|
+
export interface ReportInfoPanelProps {
|
|
10
|
+
/** 패널 제목. 없으면 제목 줄을 그리지 않는다. */
|
|
11
|
+
title?: ReactNode;
|
|
12
|
+
fields: ReportInfoField[];
|
|
13
|
+
/** 한 줄에 놓을 칸 수. @defaultValue 4 */
|
|
14
|
+
columns?: number;
|
|
15
|
+
className?: string;
|
|
16
|
+
style?: CSSProperties;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 보고서 첫머리의 대상자 정보 패널 — 이름표와 값이 짝지어 격자로 놓인다.
|
|
20
|
+
*
|
|
21
|
+
* 값에 무엇이 들어갈지는 제품이 정한다. 값이 없을 때 `-` 를 넣을지 빈칸으로
|
|
22
|
+
* 둘지도 부르는 쪽에서 정해 넘긴다(보고서는 빈칸보다 `-` 가 읽기 좋다).
|
|
23
|
+
*
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export default function ReportInfoPanel({ title, fields, columns, className, style, }: ReportInfoPanelProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from '../../utils/cx';
|
|
3
|
+
import './ReportInfoPanel.css';
|
|
4
|
+
/**
|
|
5
|
+
* 보고서 첫머리의 대상자 정보 패널 — 이름표와 값이 짝지어 격자로 놓인다.
|
|
6
|
+
*
|
|
7
|
+
* 값에 무엇이 들어갈지는 제품이 정한다. 값이 없을 때 `-` 를 넣을지 빈칸으로
|
|
8
|
+
* 둘지도 부르는 쪽에서 정해 넘긴다(보고서는 빈칸보다 `-` 가 읽기 좋다).
|
|
9
|
+
*
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export default function ReportInfoPanel({ title, fields, columns = 4, className, style, }) {
|
|
13
|
+
return (_jsxs("div", { className: cx('report-info', className), style: { ['--report-info-cols']: String(columns), ...style }, children: [title && _jsx("p", { className: "report-info__title h5b", children: title }), _jsx("div", { className: "report-info__grid", children: fields.map((f, i) => (_jsxs("div", { className: "report-info__field body-2", children: [_jsx("span", { className: "report-info__label body-3", children: f.label }), _jsx("span", { className: "report-info__value", children: f.value })] }, i))) })] }));
|
|
14
|
+
}
|
|
@@ -295,6 +295,10 @@ export type { PanelRowToggle, PanelRowSegmented, DropdownItem, PanelRowDropdown,
|
|
|
295
295
|
export { default as Section } from './components/Section';
|
|
296
296
|
export type { SectionProps, SectionType } from './components/Section';
|
|
297
297
|
export { default as Pagination } from './components/Pagination';
|
|
298
|
+
export { default as ReportDocument } from './components/Report/ReportDocument';
|
|
299
|
+
export type { ReportDocumentProps, ReportBlock } from './components/Report/ReportDocument';
|
|
300
|
+
export { default as ReportInfoPanel } from './components/Report/ReportInfoPanel';
|
|
301
|
+
export type { ReportInfoPanelProps, ReportInfoField } from './components/Report/ReportInfoPanel';
|
|
298
302
|
export { default as UpdateAlert } from './components/UpdateAlert';
|
|
299
303
|
export { default as TrainingCard } from './components/Training/TrainingCard';
|
|
300
304
|
export type { TrainingCardProps } from './components/Training/TrainingCard';
|
|
@@ -230,6 +230,8 @@ export { default as Popup } from './components/Popup/Popup';
|
|
|
230
230
|
export { default as Panel, PanelRow, PanelGrid, PanelRowDevice } from './components/Panel';
|
|
231
231
|
export { default as Section } from './components/Section';
|
|
232
232
|
export { default as Pagination } from './components/Pagination';
|
|
233
|
+
export { default as ReportDocument } from './components/Report/ReportDocument';
|
|
234
|
+
export { default as ReportInfoPanel } from './components/Report/ReportInfoPanel';
|
|
233
235
|
export { default as UpdateAlert } from './components/UpdateAlert';
|
|
234
236
|
export { default as TrainingCard } from './components/Training/TrainingCard';
|
|
235
237
|
export { default as TrainingCardGroup } from './components/Training/TrainingCardGroup';
|
|
@@ -54,47 +54,79 @@ textarea {
|
|
|
54
54
|
|
|
55
55
|
/* ── 타이포그래피 헬퍼 (전역) ────────────────────────────── */
|
|
56
56
|
/* 값은 전부 tokens.css의 --text-* 변수에서 온다(반응형·글자 크기 스케일 포함).
|
|
57
|
-
여기서는 "어떤 변수를 쓰는지"만 정의한다 — 수치를 바꾸려면 tokens.css를 고친다.
|
|
57
|
+
여기서는 "어떤 변수를 쓰는지"만 정의한다 — 수치를 바꾸려면 tokens.css를 고친다.
|
|
58
|
+
|
|
59
|
+
**왜 전부 :where() 로 감쌌나 — 이것은 기본값이지 강제가 아니다.**
|
|
60
|
+
이 번들은 소비자 앱과 섞이지 않게 모든 셀렉터에 `.ihabdevteam-core-scope` 를
|
|
61
|
+
붙여 내보낸다. 그러면 `.h0` 이 `.ihabdevteam-core-scope .h0`(특이도 0-2-0)이
|
|
62
|
+
되어, 앱이 `.lp-hero-sub`(0-1-0) 한 겹으로 적은 여백·크기를 **통째로 눌러
|
|
63
|
+
이긴다.** 바로 아래 "margin은 0 기본, 필요 시 컴포넌트에서 override" 라고 적어
|
|
64
|
+
두고도 그 override 가 성립하지 않았다.
|
|
65
|
+
|
|
66
|
+
실측으로 확인한 피해 — 회원앱 랜딩 한 화면에서 다섯 자리가 눌렸고, 그중 셋은
|
|
67
|
+
**코어 자신의 컴포넌트**였다(payment-plan__quote · payment-plan__subtitle ·
|
|
68
|
+
site-footer__copyright). 히어로에서는 `margin-bottom: 32px` 가 0px 이 되어 제목·
|
|
69
|
+
본문·단추가 맞붙었고, 모바일에서 앱이 정한 26px 제목이 h0 의 28px 로 되돌아갔다.
|
|
70
|
+
|
|
71
|
+
`:where()` 는 안에 무엇이 들어 있든 특이도가 0 이다. postcss 설정이 프리픽스도
|
|
72
|
+
`:where(.ihabdevteam-core-scope)` 로 감싸므로(postcss.config.cjs 참고) 최종
|
|
73
|
+
특이도가 0-0-0 이 되어, 앱의 어떤 클래스 규칙이든 이 기본값을 덮을 수 있다.
|
|
74
|
+
타이포 헬퍼는 **바탕**이고 화면이 그 위에 자기 판단을 얹는다 — 그것이 원래
|
|
75
|
+
의도였고, 이제 실제로 그렇게 된다. */
|
|
76
|
+
|
|
77
|
+
/* Display — h0 위의 세 단. 랜딩·히어로처럼 크게 외치는 자리 전용이다.
|
|
78
|
+
h 단과 달리 크기가 뷰포트를 따라 연속으로 변한다(tokens.css 의 clamp) — 까닭은
|
|
79
|
+
그쪽 주석에 적어 두었다. 앱 화면 제목에는 h0~h5 를 쓴다. */
|
|
80
|
+
:where(.display-1), :where(.display-1b) { font-size: var(--text-display-1-size); line-height: var(--text-display-1-line); letter-spacing: var(--text-display-1-spacing); margin: 0; }
|
|
81
|
+
:where(.display-2), :where(.display-2b) { font-size: var(--text-display-2-size); line-height: var(--text-display-2-line); letter-spacing: var(--text-display-2-spacing); margin: 0; }
|
|
82
|
+
:where(.display-3), :where(.display-3b) { font-size: var(--text-display-3-size); line-height: var(--text-display-3-line); letter-spacing: var(--text-display-3-spacing); margin: 0; }
|
|
83
|
+
|
|
84
|
+
:where(.display-1) { font-weight: var(--text-display-1-weight); }
|
|
85
|
+
:where(.display-2) { font-weight: var(--text-display-2-weight); }
|
|
86
|
+
:where(.display-3) { font-weight: var(--text-display-3-weight); }
|
|
87
|
+
:where(.display-1b) { font-weight: var(--text-display-1-weight-bold); }
|
|
88
|
+
:where(.display-2b) { font-weight: var(--text-display-2-weight-bold); }
|
|
89
|
+
:where(.display-3b) { font-weight: var(--text-display-3-weight-bold); }
|
|
58
90
|
|
|
59
91
|
/* Heading — margin은 0 기본, 필요 시 컴포넌트에서 override */
|
|
60
|
-
.h0, .h0b { font-size: var(--text-h0-size); line-height: var(--text-h0-line); letter-spacing: var(--text-h0-spacing); margin: 0; }
|
|
61
|
-
.h1, .h1b { font-size: var(--text-h1-size); line-height: var(--text-h1-line); letter-spacing: var(--text-h1-spacing); margin: 0; }
|
|
62
|
-
.h2, .h2b { font-size: var(--text-h2-size); line-height: var(--text-h2-line); letter-spacing: var(--text-h2-spacing); margin: 0; }
|
|
63
|
-
.h3, .h3b { font-size: var(--text-h3-size); line-height: var(--text-h3-line); letter-spacing: var(--text-h3-spacing); margin: 0; }
|
|
64
|
-
.h4, .h4b { font-size: var(--text-h4-size); line-height: var(--text-h4-line); letter-spacing: var(--text-h4-spacing); margin: 0; }
|
|
65
|
-
.h5, .h5b { font-size: var(--text-h5-size); line-height: var(--text-h5-line); letter-spacing: var(--text-h5-spacing); margin: 0; }
|
|
92
|
+
:where(.h0), :where(.h0b) { font-size: var(--text-h0-size); line-height: var(--text-h0-line); letter-spacing: var(--text-h0-spacing); margin: 0; }
|
|
93
|
+
:where(.h1), :where(.h1b) { font-size: var(--text-h1-size); line-height: var(--text-h1-line); letter-spacing: var(--text-h1-spacing); margin: 0; }
|
|
94
|
+
:where(.h2), :where(.h2b) { font-size: var(--text-h2-size); line-height: var(--text-h2-line); letter-spacing: var(--text-h2-spacing); margin: 0; }
|
|
95
|
+
:where(.h3), :where(.h3b) { font-size: var(--text-h3-size); line-height: var(--text-h3-line); letter-spacing: var(--text-h3-spacing); margin: 0; }
|
|
96
|
+
:where(.h4), :where(.h4b) { font-size: var(--text-h4-size); line-height: var(--text-h4-line); letter-spacing: var(--text-h4-spacing); margin: 0; }
|
|
97
|
+
:where(.h5), :where(.h5b) { font-size: var(--text-h5-size); line-height: var(--text-h5-line); letter-spacing: var(--text-h5-spacing); margin: 0; }
|
|
66
98
|
|
|
67
99
|
/* Weight */
|
|
68
|
-
.h0 { font-weight: var(--text-h0-weight); }
|
|
69
|
-
.h1 { font-weight: var(--text-h1-weight); }
|
|
70
|
-
.h2 { font-weight: var(--text-h2-weight); }
|
|
71
|
-
.h3 { font-weight: var(--text-h3-weight); }
|
|
72
|
-
.h4 { font-weight: var(--text-h4-weight); }
|
|
73
|
-
.h5 { font-weight: var(--text-h5-weight); }
|
|
74
|
-
.h0b { font-weight: var(--text-h0-weight-bold); }
|
|
75
|
-
.h1b { font-weight: var(--text-h1-weight-bold); }
|
|
76
|
-
.h2b { font-weight: var(--text-h2-weight-bold); }
|
|
77
|
-
.h3b { font-weight: var(--text-h3-weight-bold); }
|
|
78
|
-
.h4b { font-weight: var(--text-h4-weight-bold); }
|
|
79
|
-
.h5b { font-weight: var(--text-h5-weight-bold); }
|
|
100
|
+
:where(.h0) { font-weight: var(--text-h0-weight); }
|
|
101
|
+
:where(.h1) { font-weight: var(--text-h1-weight); }
|
|
102
|
+
:where(.h2) { font-weight: var(--text-h2-weight); }
|
|
103
|
+
:where(.h3) { font-weight: var(--text-h3-weight); }
|
|
104
|
+
:where(.h4) { font-weight: var(--text-h4-weight); }
|
|
105
|
+
:where(.h5) { font-weight: var(--text-h5-weight); }
|
|
106
|
+
:where(.h0b) { font-weight: var(--text-h0-weight-bold); }
|
|
107
|
+
:where(.h1b) { font-weight: var(--text-h1-weight-bold); }
|
|
108
|
+
:where(.h2b) { font-weight: var(--text-h2-weight-bold); }
|
|
109
|
+
:where(.h3b) { font-weight: var(--text-h3-weight-bold); }
|
|
110
|
+
:where(.h4b) { font-weight: var(--text-h4-weight-bold); }
|
|
111
|
+
:where(.h5b) { font-weight: var(--text-h5-weight-bold); }
|
|
80
112
|
|
|
81
113
|
/* Body — weight 명시 */
|
|
82
|
-
.body-1,
|
|
83
|
-
.body-2,
|
|
84
|
-
.body-3,
|
|
114
|
+
:where(.body-1), :where(.body-1b) { font-size: var(--text-body-1-size); line-height: var(--text-body-1-line); margin: 0; font-weight: var(--text-body-1-weight); }
|
|
115
|
+
:where(.body-2), :where(.body-2b) { font-size: var(--text-body-2-size); line-height: var(--text-body-2-line); margin: 0; font-weight: var(--text-body-2-weight); }
|
|
116
|
+
:where(.body-3), :where(.body-3b) { font-size: var(--text-body-3-size); line-height: var(--text-body-3-line); margin: 0; font-weight: var(--text-body-3-weight); }
|
|
85
117
|
|
|
86
|
-
.body-1b { font-weight: var(--text-body-1-weight-bold); }
|
|
87
|
-
.body-2b { font-weight: var(--text-body-2-weight-bold); }
|
|
88
|
-
.body-3b { font-weight: var(--text-body-3-weight-bold); }
|
|
118
|
+
:where(.body-1b) { font-weight: var(--text-body-1-weight-bold); }
|
|
119
|
+
:where(.body-2b) { font-weight: var(--text-body-2-weight-bold); }
|
|
120
|
+
:where(.body-3b) { font-weight: var(--text-body-3-weight-bold); }
|
|
89
121
|
|
|
90
122
|
/* Button / Caption — button에 weight 추가, caption과 크기 차별화 */
|
|
91
|
-
.button-1 { font-size: var(--text-button-1-size); line-height: var(--text-button-1-line); font-weight: var(--text-button-1-weight); margin: 0; }
|
|
92
|
-
.button-2 { font-size: var(--text-button-2-size); line-height: var(--text-button-2-line); font-weight: var(--text-button-2-weight); margin: 0; }
|
|
93
|
-
.caption-1, .caption-1b { font-size: var(--text-caption-1-size); line-height: var(--text-caption-1-line); font-weight: var(--text-caption-1-weight); margin: 0; }
|
|
94
|
-
.caption-2, .caption-2b { font-size: var(--text-caption-2-size); line-height: var(--text-caption-2-line); font-weight: var(--text-caption-2-weight); margin: 0; }
|
|
123
|
+
:where(.button-1) { font-size: var(--text-button-1-size); line-height: var(--text-button-1-line); font-weight: var(--text-button-1-weight); margin: 0; }
|
|
124
|
+
:where(.button-2) { font-size: var(--text-button-2-size); line-height: var(--text-button-2-line); font-weight: var(--text-button-2-weight); margin: 0; }
|
|
125
|
+
:where(.caption-1), :where(.caption-1b) { font-size: var(--text-caption-1-size); line-height: var(--text-caption-1-line); font-weight: var(--text-caption-1-weight); margin: 0; }
|
|
126
|
+
:where(.caption-2), :where(.caption-2b) { font-size: var(--text-caption-2-size); line-height: var(--text-caption-2-line); font-weight: var(--text-caption-2-weight); margin: 0; }
|
|
95
127
|
/* b 계열 — 크기·행간은 같고 굵기만 다르다(body-*b와 동일한 규칙) */
|
|
96
|
-
.caption-1b { font-weight: var(--text-caption-1-weight-bold); }
|
|
97
|
-
.caption-2b { font-weight: var(--text-caption-2-weight-bold); }
|
|
128
|
+
:where(.caption-1b) { font-weight: var(--text-caption-1-weight-bold); }
|
|
129
|
+
:where(.caption-2b) { font-weight: var(--text-caption-2-weight-bold); }
|
|
98
130
|
|
|
99
131
|
/* ── 전역 스크롤바 ──────────────────────────────────────── */
|
|
100
132
|
::-webkit-scrollbar { width: 6px; height: 6px; }
|