@ihabdevteam/core 0.9.11 → 0.11.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.
@@ -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)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).display-1{font-size:clamp(44px,6.6vw,72px);font-size:var(--text-display-1-size);font-weight:800;font-weight:var(--text-display-1-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).display-1b{font-size:clamp(44px,6.6vw,72px);font-size:var(--text-display-1-size);font-weight:900;font-weight:var(--text-display-1-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).display-2{font-size:clamp(38px,5.2vw,56px);font-size:var(--text-display-2-size);font-weight:700;font-weight:var(--text-display-2-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).display-2b{font-size:clamp(38px,5.2vw,56px);font-size:var(--text-display-2-size);font-weight:800;font-weight:var(--text-display-2-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).display-3{font-size:clamp(34px,4.1vw,44px);font-size:var(--text-display-3-size);font-weight:700;font-weight:var(--text-display-3-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).display-3b{font-size:clamp(34px,4.1vw,44px);font-size:var(--text-display-3-size);font-weight:800;font-weight:var(--text-display-3-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h0{font-size:40px;font-size:var(--text-h0-size);font-weight:700;font-weight:var(--text-h0-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h0b{font-size:40px;font-size:var(--text-h0-size);font-weight:800;font-weight:var(--text-h0-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h1{font-size:32px;font-size:var(--text-h1-size);font-weight:700;font-weight:var(--text-h1-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h1b{font-size:32px;font-size:var(--text-h1-size);font-weight:800;font-weight:var(--text-h1-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h2{font-size:24px;font-size:var(--text-h2-size);font-weight:500;font-weight:var(--text-h2-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h2b{font-size:24px;font-size:var(--text-h2-size);font-weight:600;font-weight:var(--text-h2-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h3{font-size:20px;font-size:var(--text-h3-size);font-weight:500;font-weight:var(--text-h3-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h3b{font-size:20px;font-size:var(--text-h3-size);font-weight:600;font-weight:var(--text-h3-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h4{font-size:17px;font-size:var(--text-h4-size);font-weight:500;font-weight:var(--text-h4-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h4b{font-size:17px;font-size:var(--text-h4-size);font-weight:600;font-weight:var(--text-h4-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h5{font-size:15px;font-size:var(--text-h5-size);font-weight:500;font-weight:var(--text-h5-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).h5b{font-size:15px;font-size:var(--text-h5-size);font-weight:600;font-weight:var(--text-h5-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).body-1{font-size:18px;font-size:var(--text-body-1-size);font-weight:400;font-weight:var(--text-body-1-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).body-1b{font-size:18px;font-size:var(--text-body-1-size);font-weight:600;font-weight:var(--text-body-1-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).body-2{font-size:16px;font-size:var(--text-body-2-size);font-weight:400;font-weight:var(--text-body-2-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).body-2b{font-size:16px;font-size:var(--text-body-2-size);font-weight:600;font-weight:var(--text-body-2-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).body-3{font-size:14px;font-size:var(--text-body-3-size);font-weight:400;font-weight:var(--text-body-3-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).body-3b{font-size:14px;font-size:var(--text-body-3-size);font-weight:600;font-weight:var(--text-body-3-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).caption-1{font-size:12px;font-size:var(--text-caption-1-size);font-weight:400;font-weight:var(--text-caption-1-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).caption-1b{font-size:12px;font-size:var(--text-caption-1-size);font-weight:600;font-weight:var(--text-caption-1-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).caption-2{font-size:11px;font-size:var(--text-caption-2-size);font-weight:400;font-weight:var(--text-caption-2-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).caption-2b{font-size:11px;font-size:var(--text-caption-2-size);font-weight:600;font-weight:var(--text-caption-2-weight-bold)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).button-1{font-size:14px;font-size:var(--text-button-1-size);font-weight:500;font-weight:var(--text-button-1-weight)}:where(.ihabdevteam-core-scope) :where(h1,h2,h3,h4,h5,h6).button-2{font-size:13px;font-size:var(--text-button-2-size);font-weight:400;font-weight:var(--text-button-2-weight)}.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
  *
@@ -5224,6 +5329,55 @@ export declare function summarize(marks: Record<string, ScoreMark | null | undef
5224
5329
  */
5225
5330
  export declare function summarizeMisses(records: readonly TrainingResultRecord[]): MissSummary;
5226
5331
 
5332
+ /**
5333
+ * 화면 위쪽에 놓이는 한 줄 요약 — "지금 다루고 있는 대상"을 이름표와 값으로 늘어놓는다.
5334
+ *
5335
+ * 값 길이가 제각각이라 균등 그리드에 앉힌다. 긴 값은 칸을 밀어내지 않고 말줄임된다.
5336
+ *
5337
+ * 값의 서식은 부르는 쪽이 정해 넘긴다 — 빈 값을 `-` 로 적을지, 날짜를 어떻게 쓸지,
5338
+ * 여러 값을 한 칸에 묶을지(`오른손 / NC / 연구실 내`)는 화면마다 다르다.
5339
+ *
5340
+ * 붙박이(sticky)로 두려면 감싸는 쪽에서 건다 — 이 컴포넌트는 자리를 정하지 않는다.
5341
+ *
5342
+ * @example
5343
+ * ```tsx
5344
+ * <SummaryStrip
5345
+ * items={[
5346
+ * { label: '이름', value: patient.name },
5347
+ * { label: '생년월일', value: patient.birthDate },
5348
+ * { label: '환자번호', value: patient.chartNo ?? '-' },
5349
+ * ]}
5350
+ * actions={<Button size={32} type="dot" icon="pencil" ariaLabel="정보 수정" onClick={onEdit} />}
5351
+ * />
5352
+ * ```
5353
+ *
5354
+ * @public
5355
+ */
5356
+ export declare function SummaryStrip({ items, actions, columns, className, style, }: SummaryStripProps): JSX.Element;
5357
+
5358
+ /** @public */
5359
+ export declare interface SummaryStripItem {
5360
+ label: ReactNode;
5361
+ value: ReactNode;
5362
+ }
5363
+
5364
+ /** @public */
5365
+ export declare interface SummaryStripProps {
5366
+ items: SummaryStripItem[];
5367
+ /**
5368
+ * 오른쪽 끝에 붙는 버튼들. 정보 옆에 두는 편이 찾기 쉬워 별도 줄로 빼지 않는다.
5369
+ */
5370
+ actions?: ReactNode;
5371
+ /**
5372
+ * 가장 넓은 화면(1280px 이상)에서 한 줄에 놓을 칸 수.
5373
+ * 좁아지면 4 → 3 → 2 로 접히는 것은 고정이다.
5374
+ * @defaultValue 항목 수
5375
+ */
5376
+ columns?: number;
5377
+ className?: string;
5378
+ style?: CSSProperties;
5379
+ }
5380
+
5227
5381
  /** 지원 언어 목록 — 새 언어 추가 시 여기에도 추가 */
5228
5382
  export declare const SUPPORTED_LOCALES: {
5229
5383
  code: string;
@@ -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;
@@ -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
+ }
@@ -0,0 +1,69 @@
1
+ /* 화면 위쪽에 놓이는 한 줄 요약 — 이름표 위, 값 아래로 여러 칸을 늘어놓는다.
2
+ 오른쪽 끝에 버튼(수정·종료 등)이 붙는다. */
3
+ .summary-strip {
4
+ width: 100%;
5
+ padding: var(--spacing-m) var(--spacing-l);
6
+ border: 1px solid var(--color-border);
7
+ border-radius: var(--radius-card);
8
+ background: var(--color-surface);
9
+ box-shadow: var(--shadow-card);
10
+ }
11
+
12
+ .summary-strip__row {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: var(--spacing-l);
16
+ }
17
+
18
+ /* 값 길이가 제각각이라 그냥 나열하면 칸 간격이 들쭉해진다. 균등 그리드로
19
+ 같은 폭에 앉히고, 좁아지면 칸 수를 줄여 접는다. */
20
+ .summary-strip__items {
21
+ display: grid;
22
+ flex: 1;
23
+ min-width: 0;
24
+ grid-template-columns: repeat(2, minmax(0, 1fr));
25
+ gap: var(--spacing-s) var(--spacing-l);
26
+ }
27
+
28
+ @media (min-width: 640px) {
29
+ .summary-strip__items {
30
+ grid-template-columns: repeat(3, minmax(0, 1fr));
31
+ }
32
+ }
33
+
34
+ @media (min-width: 1024px) {
35
+ .summary-strip__items {
36
+ grid-template-columns: repeat(4, minmax(0, 1fr));
37
+ }
38
+ }
39
+
40
+ /* 가장 넓을 때만 칸 수를 부르는 쪽이 정한 값으로 편다(기본은 항목 수). */
41
+ @media (min-width: 1280px) {
42
+ .summary-strip__items {
43
+ grid-template-columns: repeat(var(--summary-strip-cols, 4), minmax(0, 1fr));
44
+ }
45
+ }
46
+
47
+ /* min-width: 0 이라야 긴 값이 칸을 밀어내지 않고 말줄임된다. */
48
+ .summary-strip__item {
49
+ min-width: 0;
50
+ }
51
+
52
+ .summary-strip__label {
53
+ margin: 0;
54
+ color: var(--color-gray);
55
+ }
56
+
57
+ .summary-strip__value {
58
+ margin: 0;
59
+ overflow: hidden;
60
+ text-overflow: ellipsis;
61
+ white-space: nowrap;
62
+ }
63
+
64
+ .summary-strip__actions {
65
+ display: flex;
66
+ flex-shrink: 0;
67
+ align-items: center;
68
+ gap: var(--spacing-xs);
69
+ }
@@ -0,0 +1,48 @@
1
+ import type { CSSProperties, ReactNode } from 'react';
2
+ import './SummaryStrip.css';
3
+ /** @public */
4
+ export interface SummaryStripItem {
5
+ label: ReactNode;
6
+ value: ReactNode;
7
+ }
8
+ /** @public */
9
+ export interface SummaryStripProps {
10
+ items: SummaryStripItem[];
11
+ /**
12
+ * 오른쪽 끝에 붙는 버튼들. 정보 옆에 두는 편이 찾기 쉬워 별도 줄로 빼지 않는다.
13
+ */
14
+ actions?: ReactNode;
15
+ /**
16
+ * 가장 넓은 화면(1280px 이상)에서 한 줄에 놓을 칸 수.
17
+ * 좁아지면 4 → 3 → 2 로 접히는 것은 고정이다.
18
+ * @defaultValue 항목 수
19
+ */
20
+ columns?: number;
21
+ className?: string;
22
+ style?: CSSProperties;
23
+ }
24
+ /**
25
+ * 화면 위쪽에 놓이는 한 줄 요약 — "지금 다루고 있는 대상"을 이름표와 값으로 늘어놓는다.
26
+ *
27
+ * 값 길이가 제각각이라 균등 그리드에 앉힌다. 긴 값은 칸을 밀어내지 않고 말줄임된다.
28
+ *
29
+ * 값의 서식은 부르는 쪽이 정해 넘긴다 — 빈 값을 `-` 로 적을지, 날짜를 어떻게 쓸지,
30
+ * 여러 값을 한 칸에 묶을지(`오른손 / NC / 연구실 내`)는 화면마다 다르다.
31
+ *
32
+ * 붙박이(sticky)로 두려면 감싸는 쪽에서 건다 — 이 컴포넌트는 자리를 정하지 않는다.
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * <SummaryStrip
37
+ * items={[
38
+ * { label: '이름', value: patient.name },
39
+ * { label: '생년월일', value: patient.birthDate },
40
+ * { label: '환자번호', value: patient.chartNo ?? '-' },
41
+ * ]}
42
+ * actions={<Button size={32} type="dot" icon="pencil" ariaLabel="정보 수정" onClick={onEdit} />}
43
+ * />
44
+ * ```
45
+ *
46
+ * @public
47
+ */
48
+ export default function SummaryStrip({ items, actions, columns, className, style, }: SummaryStripProps): import("react").JSX.Element;